@jingyi0605/codingns4dsh 0.2.1-beta.7 → 0.2.1-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +3 -3
- package/README.md +5 -3
- package/data/build/dist/client/avatar/desktop-bridge.js +1 -1
- package/data/build/dist/client/avatar/desktop-bridge.js.map +1 -1
- package/data/build/dist/client/avatar/desktop-view.d.ts +4 -2
- package/data/build/dist/client/avatar/desktop-view.d.ts.map +1 -1
- package/data/build/dist/client/avatar/desktop-view.js +25 -9
- package/data/build/dist/client/avatar/desktop-view.js.map +1 -1
- package/data/build/dist/client/avatar/floating.d.ts +5 -2
- package/data/build/dist/client/avatar/floating.d.ts.map +1 -1
- package/data/build/dist/client/avatar/floating.js +16 -5
- package/data/build/dist/client/avatar/floating.js.map +1 -1
- package/data/build/dist/client/avatar/notification-bubble.d.ts +18 -5
- package/data/build/dist/client/avatar/notification-bubble.d.ts.map +1 -1
- package/data/build/dist/client/avatar/notification-bubble.js +208 -56
- package/data/build/dist/client/avatar/notification-bubble.js.map +1 -1
- package/data/build/dist/client/avatar/notification-surface.d.ts +16 -0
- package/data/build/dist/client/avatar/notification-surface.d.ts.map +1 -0
- package/data/build/dist/client/avatar/notification-surface.js +54 -0
- package/data/build/dist/client/avatar/notification-surface.js.map +1 -0
- package/data/build/dist/client/avatar/reaction-badge.d.ts.map +1 -1
- package/data/build/dist/client/avatar/reaction-badge.js +11 -2
- package/data/build/dist/client/avatar/reaction-badge.js.map +1 -1
- package/data/build/dist/client/bundle.js +1131 -392
- package/data/build/dist/client/bundle.js.map +1 -1
- package/data/build/dist/client/client.assistant-notifications.js.map +1 -1
- package/data/build/dist/client/client.assistant-workbench.js +235 -109
- package/data/build/dist/client/client.assistant-workbench.js.map +1 -1
- package/data/build/dist/client/client.manager.js +46 -9
- package/data/build/dist/client/client.manager.js.map +1 -1
- package/data/build/dist/client/client.native-workspace-store.js +1 -1
- package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
- package/data/build/dist/client/client.theme.js +2 -0
- package/data/build/dist/client/client.theme.js.map +1 -1
- package/data/build/dist/client/client.transport.js +37 -9
- package/data/build/dist/client/client.transport.js.map +1 -1
- package/data/build/dist/client/desktop-assistant.js +57743 -359
- package/data/build/dist/client/features/assistant-conversation-message.d.ts +2 -1
- package/data/build/dist/client/features/assistant-conversation-message.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-conversation-message.js +59 -24
- package/data/build/dist/client/features/assistant-conversation-message.js.map +1 -1
- package/data/build/dist/client/features/assistant-notification-store.d.ts +7 -1
- package/data/build/dist/client/features/assistant-notification-store.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-notification-store.js +44 -0
- package/data/build/dist/client/features/assistant-notification-store.js.map +1 -1
- package/data/build/dist/client/features/assistant-record-style.js +11 -4
- package/data/build/dist/client/features/assistant-record-style.js.map +1 -1
- package/data/build/dist/client/features/assistant-workbench.d.ts +4 -0
- package/data/build/dist/client/features/assistant-workbench.d.ts.map +1 -1
- package/data/build/dist/client/features/assistant-workbench.js +27 -1
- package/data/build/dist/client/features/assistant-workbench.js.map +1 -1
- package/data/build/dist/client/features/global-voice-assistant.d.ts.map +1 -1
- package/data/build/dist/client/features/global-voice-assistant.js +36 -4
- package/data/build/dist/client/features/global-voice-assistant.js.map +1 -1
- package/data/build/dist/client/features/peer-host.d.ts.map +1 -1
- package/data/build/dist/client/features/peer-host.js +33 -2
- package/data/build/dist/client/features/peer-host.js.map +1 -1
- package/data/build/dist/client/locales/assistantWorkbench.d.ts +17 -3
- package/data/build/dist/client/locales/assistantWorkbench.d.ts.map +1 -1
- package/data/build/dist/client/locales/assistantWorkbench.js +15 -11
- package/data/build/dist/client/locales/assistantWorkbench.js.map +1 -1
- package/data/build/dist/client/peer-host-native-projection.d.ts +4 -0
- package/data/build/dist/client/peer-host-native-projection.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-native-projection.js +40 -1
- package/data/build/dist/client/peer-host-native-projection.js.map +1 -1
- package/data/build/dist/client/peer-host-remote-events.d.ts +14 -0
- package/data/build/dist/client/peer-host-remote-events.d.ts.map +1 -1
- package/data/build/dist/client/peer-host-remote-events.js +92 -3
- package/data/build/dist/client/peer-host-remote-events.js.map +1 -1
- package/data/build/dist/client/style.css +2561 -0
- package/data/build/dist/client/subscription-slot.d.ts.map +1 -1
- package/data/build/dist/client/subscription-slot.js +5 -1
- package/data/build/dist/client/subscription-slot.js.map +1 -1
- package/data/build/dist/client/theme.d.ts +2 -0
- package/data/build/dist/client/theme.d.ts.map +1 -1
- package/data/build/dist/client/theme.js +3 -0
- package/data/build/dist/client/theme.js.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.js +22 -10
- package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.d.ts +9 -1
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.js +39 -0
- package/data/build/dist/dsh-capabilities/client/assistant-session-navigation-adapter.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts +1 -0
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.js +7 -0
- package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-file-citations.d.ts +13 -0
- package/data/build/dist/host/cli-adapters/codex-file-citations.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/codex-file-citations.js +271 -0
- package/data/build/dist/host/cli-adapters/codex-file-citations.js.map +1 -0
- package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts +2 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js +16 -5
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.js +1 -0
- package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js +20 -3
- package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js.map +1 -1
- package/data/build/dist/host/desktop-assistant/controller.d.ts +2 -0
- package/data/build/dist/host/desktop-assistant/controller.d.ts.map +1 -1
- package/data/build/dist/host/desktop-assistant/controller.js +28 -1
- package/data/build/dist/host/desktop-assistant/controller.js.map +1 -1
- package/data/build/dist/host/features/assistant-management-tools.d.ts +2 -1
- package/data/build/dist/host/features/assistant-management-tools.d.ts.map +1 -1
- package/data/build/dist/host/features/assistant-management-tools.js +10 -3
- package/data/build/dist/host/features/assistant-management-tools.js.map +1 -1
- package/data/build/dist/host/features/assistant-notification-events.js +1 -1
- package/data/build/dist/host/features/assistant-notification-events.js.map +1 -1
- package/data/build/dist/host/features/assistant-notifications.d.ts +8 -1
- package/data/build/dist/host/features/assistant-notifications.d.ts.map +1 -1
- package/data/build/dist/host/features/assistant-notifications.js +105 -11
- package/data/build/dist/host/features/assistant-notifications.js.map +1 -1
- package/data/build/dist/host/features/global-voice-rpc.d.ts +2 -2
- package/data/build/dist/host/features/global-voice-rpc.d.ts.map +1 -1
- package/data/build/dist/host/features/global-voice-rpc.js +89 -2
- package/data/build/dist/host/features/global-voice-rpc.js.map +1 -1
- package/data/build/dist/host/features/peer-host.d.ts.map +1 -1
- package/data/build/dist/host/features/peer-host.js +34 -5
- package/data/build/dist/host/features/peer-host.js.map +1 -1
- package/data/build/dist/host/features/types.d.ts +3 -1
- package/data/build/dist/host/features/types.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts +7 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts.map +1 -1
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js +23 -4
- package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js.map +1 -1
- package/data/build/dist/host/native-session-bridge.d.ts.map +1 -1
- package/data/build/dist/host/native-session-bridge.js +22 -9
- package/data/build/dist/host/native-session-bridge.js.map +1 -1
- package/data/build/dist/host/rpc.js +1 -1
- package/data/build/dist/host/rpc.js.map +1 -1
- package/data/build/dist/shared/assistant-message-timeline.d.ts +11 -0
- package/data/build/dist/shared/assistant-message-timeline.d.ts.map +1 -1
- package/data/build/dist/shared/assistant-message-timeline.js +19 -0
- package/data/build/dist/shared/assistant-message-timeline.js.map +1 -1
- package/data/build/dist/shared/assistant-notifications.d.ts +34 -0
- package/data/build/dist/shared/assistant-notifications.d.ts.map +1 -1
- package/data/build/dist/shared/assistant-notifications.js +8 -0
- package/data/build/dist/shared/assistant-notifications.js.map +1 -1
- package/data/build/dist/shared/assistant-session-messages.d.ts +13 -0
- package/data/build/dist/shared/assistant-session-messages.d.ts.map +1 -0
- package/data/build/dist/shared/assistant-session-messages.js +155 -0
- package/data/build/dist/shared/assistant-session-messages.js.map +1 -0
- package/data/build/dist/shared/contracts/assistant.d.ts +13 -0
- package/data/build/dist/shared/contracts/assistant.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/version.d.ts +1 -1
- package/data/build/dist/shared/contracts/version.js +1 -1
- package/data/build/dist/shared/desktop-assistant.d.ts +2 -1
- package/data/build/dist/shared/desktop-assistant.d.ts.map +1 -1
- package/data/build/dist/shared/desktop-assistant.js +21 -9
- package/data/build/dist/shared/desktop-assistant.js.map +1 -1
- package/package.json +16 -14
- package/profile/README.md +2 -2
- package/profile/package.json +2 -2
- package/profile/version.json +1 -1
- package/version.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.manager.js","names":["ASSISTANT_AVATAR_RESOURCE_PACKS","useState","useRef","createElement","createElement","resolveCodingNsTranslator","createElement","useRef","createElement","useMemo","useRef","useState","createElement","createElement","uiFontSize","dshThemeColor","useState","useRef","useCallback","useCallback","useSyncExternalStore","useRef","createElement","useState","useCodingNsTranslator","dshSettingsHelpStyle","dshThemeColor","Component","useCallback","useSyncExternalStore","createElement","CODINGNS_RPC_CHANNEL"],"sources":["../../../../src/dsh-capabilities/settings-store.ts","../../../../src/shared/assistant-lifecycle.ts","../../../../src/shared/assistant-avatar-resources.ts","../../../../src/shared/assistant-avatar-legacy-resources.ts","../../../../src/shared/assistant-avatar-legacy.ts","../../../../src/shared/assistant-avatar-catalog.ts","../../../../src/shared/assistant-avatar-engine.ts","../../../../src/shared/assistant-avatar.ts","../../../../src/shared/assistant-avatar-adapters.ts","../../../../src/shared/assistant-avatar-installation.ts","../../../../src/shared/assistant-tts.ts","../../../../src/client/global-voice-runtime-registry.ts","../../../../src/client/avatar/image.ts","../../../../src/client/avatar/builtin.ts","../../../../src/client/avatar/reaction-badge.ts","../../../../src/client/avatar/spritesheet.ts","../../../../src/client/avatar/cache-status.ts","../../../../src/client/avatar/preview-store.ts","../../../../src/client/avatar/preview-capture.ts","../../../../src/client/avatar/portrait-capture.ts","../../../../src/client/avatar/live2d.ts","../../../../src/shared/assistant-avatar-registration.ts","../../../../src/client/avatar/registry.ts","../../../../src/client/avatar/loading.ts","../../../../src/client/avatar/preview.ts","../../../../src/client/avatar/portrait-service.ts","../../../../src/client/avatar/slot.ts","../../../../src/client/avatar/portrait.ts","../../../../src/client/avatar/manager.ts"],"sourcesContent":["/**\n * Codingns4DSH 内部设置存储契约。\n *\n * 业务模块只依赖这个最小接口,不直接依赖 DSH 的 SettingsScope 或未来的\n * ConfigForm。不同 DSH 版本的读写、revision 和订阅语义都在边界适配器中收敛。\n */\nexport interface CodingNsSettingsSnapshot<T> {\n readonly value: T | undefined\n readonly revision: number | undefined\n readonly writable: boolean\n readonly status: 'loading' | 'ready' | 'unavailable'\n}\n\nexport interface CodingNsSettingsOperation {\n readonly op: 'set' | 'unset'\n readonly path: readonly string[]\n readonly value?: unknown\n}\n\nexport interface CodingNsSettingsStore<T> {\n getSnapshot(): CodingNsSettingsSnapshot<T>\n subscribe(listener: () => void): () => void\n mutate(operations: readonly CodingNsSettingsOperation[], expectedRevision?: number): Promise<boolean>\n set(field: string, value: unknown): Promise<boolean>\n unset(field: string): Promise<boolean>\n load?(): Promise<void>\n /** Host 专用业务 RPC 修改设置后,显式重读权威快照;普通 load 保持缓存语义。 */\n reload?(): Promise<void>\n dispose?(): void | Promise<void>\n}\n\n/** 将 DSH 两代写入结果统一成内部成功布尔值。 */\nexport function accepted(write: Promise<void | boolean>): Promise<boolean> {\n return write.then((result) => result !== false)\n}\n\n/**\n * 判断两份设置快照在内容上是否等价。\n *\n * DSH 的 ConfigForm、SettingsScope 和插件自己的 Host RPC 都会在每次读取时\n * 构造新对象。`useSyncExternalStore` 要求 `getSnapshot()` 在内容未变化时返回\n * 同一个引用,否则 React 会在每次渲染后重新比对快照并强制再次渲染,直到抛出\n * “Maximum update depth exceeded”(React #185)。所有适配器都必须先比较内容、\n * 再决定是否替换快照并唤醒订阅者。\n */\nexport function sameSettingsSnapshot<T>(\n left: CodingNsSettingsSnapshot<T>,\n right: CodingNsSettingsSnapshot<T>,\n): boolean {\n return sameSettingsValue(left.value, right.value)\n && left.revision === right.revision\n && left.writable === right.writable\n && left.status === right.status\n}\n\n/** 设置内容的结构比较:数组按顺序、对象按键,标量按 Object.is。 */\nexport function sameSettingsValue(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true\n if (left === null || right === null || typeof left !== 'object' || typeof right !== 'object') return false\n if (Array.isArray(left) || Array.isArray(right)) {\n if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) return false\n return left.every((value, index) => sameSettingsValue(value, right[index]))\n }\n const leftRecord = left as Record<string, unknown>\n const rightRecord = right as Record<string, unknown>\n const leftKeys = Object.keys(leftRecord)\n const rightKeys = Object.keys(rightRecord)\n if (leftKeys.length !== rightKeys.length) return false\n return leftKeys.every((key) => Object.prototype.hasOwnProperty.call(rightRecord, key) && sameSettingsValue(leftRecord[key], rightRecord[key]))\n}\n","import type { AssistantProfileSettings, AssistantSettings } from './contracts/config.js'\nimport { parseVirtualWorkspaceId } from './contracts/peer-host.js'\n\nexport const DEFAULT_ASSISTANT_NAME = '我的助理'\n/** 首次创建预填的标准性格;作为草稿数据,用户可修改或清空。 */\nexport const DEFAULT_ASSISTANT_PERSONALITY = '你是一位友善、耐心、可靠的智能助理,是用户工作与生活中的伙伴。善于倾听,表达自然简洁,优先给出清晰结论和可执行建议,再按需解释细节。遇到不确定的信息会如实说明并主动澄清,尊重用户的选择与隐私,不编造事实或经历。'\nexport const ASSISTANT_PERSONALITY_MAX_CHARS = 4000\n\n/** 只为未创建且尚无设定的助理补默认值;显式空白和已有档案保持原样。 */\nexport function readAssistantPersonality(profile: AssistantProfileSettings): string {\n return profile.personality ?? (profile.initialized ? '' : DEFAULT_ASSISTANT_PERSONALITY)\n}\n\n/** 角色设定可以留空,但不能绕过正式配置与预览共同的长度限制。 */\nexport function validateAssistantPersonality(value: unknown): asserts value is string {\n if (typeof value !== 'string' || value.length > ASSISTANT_PERSONALITY_MAX_CHARS) throw new TypeError('助理性格背景必须是最多 4000 字符的文字')\n}\n\n/** 原生侧栏可能投影虚拟 ID;范围比较保留用户选择,同时核对其所属 Host。 */\nexport function assistantWorkspaceMatches(selected: string, hostId: string, workspaceId: string, local = false): boolean {\n if (selected === workspaceId || selected === `${hostId}:${workspaceId}`) return true\n const virtual = parseVirtualWorkspaceId(selected)\n return virtual !== null && virtual.workspaceId === workspaceId && (virtual.hostId === hostId || local && virtual.targetHostId === null)\n}\n\n/** 只有显式档案表示已创建;旧能力配置仅预填表单,不能跳过首次创建。 */\nexport function readAssistantProfile(settings: AssistantSettings): AssistantProfileSettings {\n if (settings.profile !== undefined) return { ...settings.profile }\n return { name: DEFAULT_ASSISTANT_NAME, initialized: false, createdAt: null }\n}\n\n/** 设置和生命周期接口共用严格校验,写入失败不能被默认值掩盖。 */\nexport function validateAssistantProfile(value: unknown): asserts value is AssistantProfileSettings {\n const profile = value as Partial<AssistantProfileSettings> | null\n if (profile === null || typeof profile !== 'object' || Array.isArray(profile)\n || typeof profile.name !== 'string' || !profile.name.trim() || profile.name.length > 80\n || profile.personality !== undefined && (typeof profile.personality !== 'string' || profile.personality.length > ASSISTANT_PERSONALITY_MAX_CHARS)\n || typeof profile.initialized !== 'boolean'\n || profile.createdAt !== null && (!Number.isSafeInteger(profile.createdAt) || profile.createdAt! < 0)) throw new TypeError('助理档案无效')\n}\n\nexport function validateAssistantModel(value: unknown): asserts value is NonNullable<AssistantSettings['model']> {\n const model = value as AssistantSettings['model'] | null\n if (model === null || typeof model !== 'object' || Array.isArray(model)\n || typeof model.provider !== 'string' || !model.provider.trim() || model.provider.length > 200\n || typeof model.model !== 'string' || !model.model.trim() || model.model.length > 200) throw new TypeError('助理模型无效')\n}\n","/** 可复用的资源包描述,不包含任何角色素材来源或目录。 */\nexport interface AssistantAvatarResourcePack {\n readonly basePath: string\n readonly upstreamRoot: string\n readonly manifest: string\n readonly motionGroups: Readonly<Record<string, string>>\n readonly files: readonly { readonly path: string; readonly contentType: string; readonly maxBytes: number; readonly preload?: false }[]\n}\nexport interface AssistantAvatarCacheStatus {\n readonly version: 1\n readonly generation: string\n readonly pack: string\n readonly cached: number\n readonly pending: number\n readonly total: number\n readonly downloads: number\n}\nexport function assistantAvatarCacheStatusPath(pack: AssistantAvatarResourcePack): string { return `${pack.basePath}cache-status.json` }\n/** 默认没有第三方资源包,保留旧内部调用的目录形状。 */\nexport const ASSISTANT_AVATAR_RESOURCE_PACKS: readonly AssistantAvatarResourcePack[] = Object.freeze([])\n","import type { AssistantAvatarResourcePack } from './assistant-avatar-resources.js'\nexport { assistantAvatarCacheStatusPath } from './assistant-avatar-resources.js'\n\n/** 地址包含上游提交与精简策略版本;修改资源或策略时必须更新版本,避免浏览器旧缓存。 */\nexport const WHALE_LIVE2D_RESOURCE_PACK: AssistantAvatarResourcePack = Object.freeze({\n basePath: '/api/codingns/assistant-avatar-assets/whale-185c02bf-v1/',\n upstreamRoot: 'https://raw.githubusercontent.com/A8Chann/dsh-pet-live2d/185c02bfbb3b886e1a236b5c2ec035cc085b9ca2/dsh-live2d-pet/pets/ds-whale-girl/',\n manifest: 'c_0120.model3.json',\n motionGroups: Object.freeze({ idle: 'Idle', thinking: 'Idle', listening: 'Idle', waiting: 'Idle', error: 'SprayWater' }),\n files: Object.freeze([\n { path: 'c_0120.model3.json', contentType: 'application/json', maxBytes: 262144 },\n { path: 'model/c_0120.moc3', contentType: 'application/octet-stream', maxBytes: 4194304 },\n { path: 'model/c_0120.physics3.json', contentType: 'application/json', maxBytes: 1048576 },\n { path: 'model/c_0120.cdi3.json', contentType: 'application/json', maxBytes: 1048576, preload: false as const },\n { path: 'textures/texture_00.png', contentType: 'image/png', maxBytes: 4194304 },\n { path: 'textures/texture_01.png', contentType: 'image/png', maxBytes: 1048576 },\n { path: 'motions/idle.motion3.json', contentType: 'application/json', maxBytes: 1048576 },\n { path: 'motions/spray-water.motion3.json', contentType: 'application/json', maxBytes: 1048576 },\n ].map((file) => Object.freeze(file))),\n})\n\nexport const ASSISTANT_AVATAR_RESOURCE_PACKS: readonly AssistantAvatarResourcePack[] = Object.freeze([WHALE_LIVE2D_RESOURCE_PACK])\n","import type { AssistantAvatarModel } from './assistant-avatar.js'\nimport { WHALE_LIVE2D_RESOURCE_PACK } from './assistant-avatar-legacy-resources.js'\n\nexport interface AssistantAvatarPreset {\n readonly labelKey: string\n readonly model: AssistantAvatarModel\n}\n\nconst spriteRoot = 'https://raw.githubusercontent.com/YunYueSama/codex-deepseek-pet/7661c8b304c5400701f91da01b1a643a207331de/codex-deepseek-pet/'\nconst live2dRoot = WHALE_LIVE2D_RESOURCE_PACK.upstreamRoot\n\n/**\n * 目录保存经 Codex/DSH 适配器转换并核验的统一模型数据,不包含美术文件。\n * 固定提交避免上游 main 更新悄悄改变素材;读取目录不请求网络,选中后才由渲染器加载。\n * 预设使用独立 ID,保留此前按上游 ID 导入的用户形象与自定义清单容量。\n */\n// 仅用于迁移旧版已经选中的记录;新安装不提供第三方内置目录。\nexport const LEGACY_ASSISTANT_AVATAR_PRESETS: readonly AssistantAvatarPreset[] = Object.freeze([\n Object.freeze({ labelKey: 'avatar.preset.whaleSprite', model: Object.freeze({\n id: 'codingns-preset-whale-sprite', name: '大肥鱼 · Q版全身',\n renderer: 'spritesheet', source: `${spriteRoot}spritesheet.webp`, spriteVersion: 2,\n package: Object.freeze({ adapterId: 'codex-pet', manifestUrl: `${spriteRoot}pet.json`, author: 'YunYueSama',\n license: '大肥鱼项目署名许可 1.0:仅授权作者有权授权的新增贡献;第三方角色与参考作品权利另行确认,非 DeepSeek 官方授权。',\n homepage: 'https://github.com/YunYueSama/codex-deepseek-pet/blob/7661c8b304c5400701f91da01b1a643a207331de/ASSET_LICENSE.md' }),\n }) }),\n Object.freeze({ labelKey: 'avatar.preset.whaleLive2d', model: Object.freeze({\n id: 'codingns-preset-whale-live2d', name: '大肥鱼 · Live2D 桌前',\n renderer: 'live2d', source: `${WHALE_LIVE2D_RESOURCE_PACK.basePath}${WHALE_LIVE2D_RESOURCE_PACK.manifest}`, spriteVersion: 2,\n motionGroups: WHALE_LIVE2D_RESOURCE_PACK.motionGroups,\n live2d: Object.freeze({ scale: 1, position: Object.freeze([0, 0] as const) }),\n package: Object.freeze({ adapterId: 'dsh-live2d-pet', manifestUrl: `${live2dRoot}pet.json`,\n author: '模型:上善无形 / ZipZipPipe / 氵六青 · 插件:A8Chann',\n license: 'CC BY-NC-SA 4.0:署名、非商业、相同方式共享;商业使用须分别取得各权利人授权。清单已精简,模型与贴图未修改。',\n homepage: 'https://github.com/A8Chann/dsh-pet-live2d/blob/185c02bfbb3b886e1a236b5c2ec035cc085b9ca2/NOTICE.md' }),\n }) }),\n])\n\nexport function getAssistantAvatarPreset(id: string): AssistantAvatarPreset | undefined {\n return LEGACY_ASSISTANT_AVATAR_PRESETS.find((preset) => preset.model.id === id)\n}\n\n/** 保留旧扩展的导出名称;第三方角色现在必须手工安装。 */\nexport const ASSISTANT_AVATAR_PRESETS: readonly AssistantAvatarPreset[] = Object.freeze([])\n","/** 目录仅提供安装清单链接;浏览目录不注册角色,也不下载第三方素材。 */\nexport const ASSISTANT_AVATAR_CATALOG_URL = 'https://github.com/jingyi0605/Codingns4DSH/blob/main/assets/assistant-avatar-catalog.md'\n\n/** 使用说明单独版本化;升级说明后必须重新确认,不能继承旧版同意。 */\nexport const ASSISTANT_AVATAR_CONSENT_VERSION = '2026-10-07.1'\nexport const ASSISTANT_AVATAR_CATALOG_PREVIEW_PATH = '/api/codingns/assistant-avatar-catalog-preview'\n/** 临时素材只通过随机预览租约读取,不与正式安装目录混用。 */\nexport const ASSISTANT_AVATAR_TEMPORARY_ASSET_PATH = '/api/codingns/assistant-avatar-temporary-assets'\nexport interface AssistantAvatarTemporaryPreview {\n readonly lease: string\n readonly model: import('./assistant-avatar.js').AssistantAvatarModel\n}\nexport interface AssistantAvatarConsent {\n readonly version: string\n readonly acceptedAt: number\n}\n/** 目录只传元数据;完整素材始终由用户另外确认安装。 */\nexport interface AssistantAvatarCatalogEntry {\n readonly id: string\n readonly number: number\n readonly name: string\n readonly author: string\n readonly description: string\n readonly remarks: string\n readonly repositoryUrl: string\n readonly licenseUrl: string\n readonly license: string\n readonly homepage: string\n readonly format: string\n readonly revision: string\n readonly bytes: number\n readonly files: number\n readonly previewAvailable: boolean\n}\nexport function validAssistantAvatarConsent(value: unknown): value is AssistantAvatarConsent {\n if (value === null || typeof value !== 'object') return false\n const consent = value as Partial<AssistantAvatarConsent>\n return typeof consent.version === 'string' && consent.version.length > 0 && consent.version.length <= 80\n && Number.isSafeInteger(consent.acceptedAt) && consent.acceptedAt! > 0\n}\nexport function hasAssistantAvatarConsent(value: unknown): boolean {\n return validAssistantAvatarConsent(value) && value.version === ASSISTANT_AVATAR_CONSENT_VERSION\n}\nexport function assistantAvatarCatalogPreviewUrl(entry: Pick<AssistantAvatarCatalogEntry, 'id' | 'revision'>): string {\n return `${ASSISTANT_AVATAR_CATALOG_PREVIEW_PATH}?${new URLSearchParams({ id: entry.id, revision: entry.revision })}`\n}\n","/**\n * Live2D 引擎的固定版本与许可契约。\n *\n * 引擎不随插件打包:Host 在用户确认引擎许可后,从固定 registry 地址下载\n * 精确版本并校验摘要,安装到 CodingNS 自有目录;源码开发仍可直接解析\n * 仓库中的开发依赖。升级版本必须同时更新 tarball 地址、摘要与许可说明。\n */\nexport const ASSISTANT_AVATAR_ENGINE_VERSION = '2.1.1'\nlet runtimeRevision = 0\nconst runtimeListeners = new Set<() => void>()\n/** Host 与 Client 各自维护代次,安装成功立即解除缺失引擎的短期缓存。 */\nexport function invalidateAssistantAvatarRuntime(): void {\n runtimeRevision += 1\n for (const listener of runtimeListeners) listener()\n}\nexport function assistantAvatarRuntimeRevision(): number { return runtimeRevision }\n/** 已经显示加载失败的形象也需要重新挂载,不能只清除模块缓存。 */\nexport function subscribeAssistantAvatarRuntime(listener: () => void): () => void {\n runtimeListeners.add(listener)\n return () => { runtimeListeners.delete(listener) }\n}\nexport const ASSISTANT_AVATAR_ENGINE_TARBALL = 'https://registry.npmjs.org/l2d/-/l2d-2.1.1.tgz'\nexport const ASSISTANT_AVATAR_ENGINE_SHA512 = 'Q9Rp3uDPiZyS4SJZ/RJ+tuR1YQ75gKhGeS2gZNCO6KvydDB6okPQJk+zsKt8KyJ6Y5g0okVMtj3Sisjxr35ptA=='\n/** npm tarball 顶层固定为 package/,入口是真正的 ESM 文件而非全局 IIFE。 */\nexport const ASSISTANT_AVATAR_ENGINE_ENTRY = 'package/dist/index.js'\n/** 真实入口约 820 KB;明显偏小说明下载或解压不完整。 */\nexport const ASSISTANT_AVATAR_ENGINE_MIN_ENTRY_BYTES = 512 * 1024\nexport const ASSISTANT_AVATAR_ENGINE_MAX_ARCHIVE_BYTES = 8 * 1024 * 1024\n/** 引擎许可单独版本化:Cubism SDK 条款与第三方素材许可分别确认。 */\nexport const ASSISTANT_AVATAR_ENGINE_CONSENT_VERSION = '2026-10-08.1'\nexport interface AssistantAvatarEngineConsent {\n readonly version: string\n readonly acceptedAt: number\n}\n/** managed 为 CodingNS 自有目录安装,dependency 为源码开发或用户手工安装。 */\nexport type AssistantAvatarEngineSource = 'managed' | 'dependency' | 'missing'\nexport interface AssistantAvatarEngineStatus {\n readonly installed: boolean\n readonly version: string\n readonly source: AssistantAvatarEngineSource\n}\nexport function validAssistantAvatarEngineConsent(value: unknown): value is AssistantAvatarEngineConsent {\n if (value === null || typeof value !== 'object') return false\n const consent = value as Partial<AssistantAvatarEngineConsent>\n return typeof consent.version === 'string' && consent.version.length > 0 && consent.version.length <= 80\n && Number.isSafeInteger(consent.acceptedAt) && consent.acceptedAt! > 0\n}\nexport function hasAssistantAvatarEngineConsent(value: unknown): boolean {\n return validAssistantAvatarEngineConsent(value) && value.version === ASSISTANT_AVATAR_ENGINE_CONSENT_VERSION\n}\n","import { getAssistantAvatarPreset } from './assistant-avatar-legacy.js'\nimport { validAssistantAvatarConsent } from './assistant-avatar-catalog.js'\nimport type { AssistantAvatarConsent } from './assistant-avatar-catalog.js'\nimport { validAssistantAvatarEngineConsent } from './assistant-avatar-engine.js'\nimport type { AssistantAvatarEngineConsent } from './assistant-avatar-engine.js'\n\n/** 形象只消费助理状态,不持有会话、语音设备或工作区权限。 */\nexport type AssistantAvatarState = 'idle' | 'listening' | 'thinking' | 'speaking' | 'waiting' | 'error'\nexport type AssistantAvatarSurface = 'floating' | 'dialog'\n/** 会话反馈独立于六种语音动作,旧渲染器可忽略这个可选输入。 */\nexport type AssistantAvatarReaction = 'success' | 'concerned' | 'question' | 'approval'\nexport const ASSISTANT_AVATAR_REACTIONS: readonly AssistantAvatarReaction[] = ['success', 'concerned', 'question', 'approval']\n\nexport const ASSISTANT_AVATAR_STATES: readonly AssistantAvatarState[] = ['idle', 'listening', 'thinking', 'speaking', 'waiting', 'error']\n\n/** 素材与角色身份分开,同一个包可以为两个展示位置提供不同素材。 */\nexport interface AssistantAvatarAsset {\n /** 内置 ID 为 builtin/image/spritesheet/live2d;其他 ID 由扩展注册。 */\n readonly renderer: string\n readonly source: string\n readonly spriteVersion: 1 | 2\n /** 图片差分按统一助理状态选择,未声明的状态使用 source。 */\n readonly stateSources?: Readonly<Partial<Record<AssistantAvatarState, string>>>\n /** Live2D 动作组显式映射,未声明的状态保留自动识别与待机回落。 */\n readonly motionGroups?: Readonly<Partial<Record<AssistantAvatarState, string>>>\n readonly reactionSources?: Readonly<Partial<Record<AssistantAvatarReaction, string>>>\n /** Live2D 使用已有组名,精灵使用包明确声明且落在已有图集内的帧。 */\n readonly reactionMotionGroups?: Readonly<Partial<Record<AssistantAvatarReaction, string | AssistantSpriteMotion>>>\n readonly reactionExpressions?: Readonly<Partial<Record<AssistantAvatarReaction, string>>>\n /** 模型自适应后再应用包内缩放和位置,适配不同模型的构图。 */\n readonly live2d?: { readonly scale?: number; readonly position?: readonly [number, number] }\n}\nexport interface AssistantAvatarPackageInfo {\n readonly adapterId: string\n readonly manifestUrl?: string\n readonly author?: string\n readonly license?: string\n readonly homepage?: string\n /** 本地素材安装的内容版本;不持有渲染实例或绝对磁盘路径。 */\n readonly installationId?: string\n}\nexport interface AssistantAvatarModel extends AssistantAvatarAsset {\n readonly id: string\n readonly name: string\n readonly package?: AssistantAvatarPackageInfo\n readonly surfaces?: Readonly<Partial<Record<AssistantAvatarSurface, AssistantAvatarAsset>>>\n}\n/** CodingNS 原生包清单;其他格式由适配器转换后使用相同的存储与展示接口。 */\nexport interface AssistantAvatarManifest {\n readonly avatarManifestVersion: 1\n readonly id: string\n readonly name: string\n readonly asset: AssistantAvatarAsset\n readonly surfaces?: AssistantAvatarModel['surfaces']\n readonly author?: string\n readonly license?: string\n readonly homepage?: string\n}\n\nexport interface AssistantAppearanceSettings {\n readonly floatingEnabled: boolean\n readonly dialogEnabled: boolean\n readonly floatingSize: number\n readonly dialogSize: number\n readonly selectedId: string\n readonly models: readonly AssistantAvatarModel[]\n /** 仅控制第三方目录访问,撤销同意不会删除已安装形象。 */\n readonly thirdPartyConsent?: AssistantAvatarConsent\n /** 仅控制 Live2D 引擎下载;撤销同意不会删除已安装引擎。 */\n readonly engineConsent?: AssistantAvatarEngineConsent\n}\n\nexport const ASSISTANT_AVATAR_RUNTIME_PATH = '/api/codingns/assistant-avatar-runtime'\n/** 尺寸档位只映射到既有数值字段,旧自定义尺寸无需迁移。 */\nexport const ASSISTANT_AVATAR_FLOATING_STANDARD_SIZE = 144\nexport const ASSISTANT_AVATAR_FLOATING_MINI_SIZE = ASSISTANT_AVATAR_FLOATING_STANDARD_SIZE / 2\nexport const BUILTIN_ASSISTANT_AVATAR: AssistantAvatarModel = {\n id: 'codingns-default', name: '鱼妞', renderer: 'builtin', source: '', spriteVersion: 2,\n}\n/** 保留旧默认 ID 和存储字段;实际生图素材通过固定的同源 URL 加载。 */\nexport const BUILTIN_ASSISTANT_AVATARS: readonly AssistantAvatarModel[] = [BUILTIN_ASSISTANT_AVATAR,\n { id: 'codingns-basic-male', name: '鱼仔', renderer: 'builtin', source: '', spriteVersion: 2 }]\n/** 旧名称仅用于写入兼容;读取归一化后统一显示新名称,其他内置字段仍不可替换。 */\nconst legacyBuiltinNames: Readonly<Record<string, string>> = {\n 'codingns-default': 'CodingNS', 'codingns-basic-male': '基础形象 · 男生',\n}\nexport const BUILTIN_ASSISTANT_AVATAR_SOURCES: Readonly<Record<string, string>> = {\n 'codingns-default': '/api/codingns/assistant-avatar-basic/female-v1.png',\n 'codingns-basic-male': '/api/codingns/assistant-avatar-basic/male-v1.png',\n}\n/** 两个基础形象加原有的 19 个自定义名额,升级时不会丢掉已登记角色。 */\nexport const ASSISTANT_AVATAR_MAX_MODELS = 21\nexport function getBuiltinAssistantAvatar(id: unknown): AssistantAvatarModel | undefined {\n return BUILTIN_ASSISTANT_AVATARS.find((model) => model.id === id)\n}\nexport function builtinAssistantAvatarLabelKey(id: string): string | undefined {\n if (id === BUILTIN_ASSISTANT_AVATAR.id) return 'avatar.builtinName'\n if (id === 'codingns-basic-male') return 'avatar.builtinMaleName'\n return undefined\n}\nexport const DEFAULT_ASSISTANT_APPEARANCE: AssistantAppearanceSettings = {\n floatingEnabled: false, dialogEnabled: true, floatingSize: ASSISTANT_AVATAR_FLOATING_STANDARD_SIZE, dialogSize: 240,\n selectedId: BUILTIN_ASSISTANT_AVATAR.id, models: BUILTIN_ASSISTANT_AVATARS,\n}\n\n/** 资源只允许网页地址;任意脚本、file: 和协议相对地址均不能作为素材入口。 */\nexport function isAssistantAvatarSource(value: string): boolean {\n if (value.length === 0 || value.length > 2048 || /[\\s\\\\\\u0000-\\u001f]/u.test(value)) return false\n if (value.startsWith('/') && !value.startsWith('//')) return true\n try {\n const url = new URL(value)\n return (url.protocol === 'https:' || url.protocol === 'http:') && url.username === '' && url.password === ''\n } catch { return false }\n}\n\n/** 读取旧设置时补默认值;非法模型被过滤,绝不让坏配置阻止助理入口。 */\nexport function normalizeAssistantAppearance(value: unknown): AssistantAppearanceSettings {\n const record = asRecord(value)\n const models = [...BUILTIN_ASSISTANT_AVATARS]\n const seen = new Set(models.map((model) => model.id))\n for (const item of Array.isArray(record.models) ? record.models.slice(0, ASSISTANT_AVATAR_MAX_MODELS) : []) {\n if (models.length >= ASSISTANT_AVATAR_MAX_MODELS) break\n const model = asRecord(item)\n if (!validModel(model) || seen.has(model.id as string)) continue\n seen.add(model.id as string)\n models.push(copyAssistantAvatarModel(model as unknown as AssistantAvatarModel))\n }\n return {\n floatingEnabled: record.floatingEnabled === true,\n dialogEnabled: record.dialogEnabled !== false,\n floatingSize: boundedSize(record.floatingSize, ASSISTANT_AVATAR_FLOATING_MINI_SIZE, 320, ASSISTANT_AVATAR_FLOATING_STANDARD_SIZE),\n dialogSize: boundedSize(record.dialogSize, 120, 480, 240),\n selectedId: typeof record.selectedId === 'string' && (seen.has(record.selectedId) || getAssistantAvatarPreset(record.selectedId) !== undefined) ? record.selectedId : BUILTIN_ASSISTANT_AVATAR.id,\n models,\n ...(validAssistantAvatarConsent(record.thirdPartyConsent) ? { thirdPartyConsent: {\n version: record.thirdPartyConsent.version, acceptedAt: record.thirdPartyConsent.acceptedAt } } : {}),\n ...(validAssistantAvatarEngineConsent(record.engineConsent) ? { engineConsent: {\n version: record.engineConsent.version, acceptedAt: record.engineConsent.acceptedAt } } : {}),\n }\n}\n\n/** 写入必须严格校验,不能把被静默修正的数据报告为保存成功。 */\nexport function validateAssistantAppearance(value: unknown): void {\n const record = asRecord(value)\n if (record.thirdPartyConsent !== undefined && !validAssistantAvatarConsent(record.thirdPartyConsent)) throw new TypeError('第三方形象协议记录无效')\n if (record.engineConsent !== undefined && !validAssistantAvatarEngineConsent(record.engineConsent)) throw new TypeError('Live2D 引擎许可记录无效')\n if (typeof record.floatingEnabled !== 'boolean' || typeof record.dialogEnabled !== 'boolean') throw new TypeError('形象显示开关无效')\n for (const [key, min, max] of [['floatingSize', ASSISTANT_AVATAR_FLOATING_MINI_SIZE, 320], ['dialogSize', 120, 480]] as const) {\n if (typeof record[key] !== 'number' || !Number.isInteger(record[key]) || record[key] < min || record[key] > max) throw new TypeError('形象尺寸超出范围')\n }\n if (!Array.isArray(record.models) || record.models.length === 0 || record.models.length > ASSISTANT_AVATAR_MAX_MODELS) throw new TypeError(`形象清单必须包含 1 到 ${ASSISTANT_AVATAR_MAX_MODELS} 项`)\n const seen = new Set<string>()\n for (const item of record.models) {\n const model = asRecord(item)\n validateAssistantAvatarModel(model)\n if (typeof model.id !== 'string' || seen.has(model.id)) throw new TypeError('形象 ID 重复或无效')\n seen.add(model.id)\n }\n if (!seen.has(BUILTIN_ASSISTANT_AVATAR.id) || typeof record.selectedId !== 'string'\n || (!seen.has(record.selectedId) && getAssistantAvatarPreset(record.selectedId) === undefined)) throw new TypeError('当前形象不在清单中')\n}\n\n/** 所有导入和管理写入共享同一校验,不能由某个适配器绕过资源边界。 */\nexport function validateAssistantAvatarModel(value: unknown): asserts value is AssistantAvatarModel {\n const model = asRecord(value)\n const builtin = getBuiltinAssistantAvatar(model.id)\n if (builtin !== undefined) {\n const keys = Object.keys(builtin) as (keyof AssistantAvatarModel)[]\n if (keys.some((key) => model[key] !== builtin[key] && !(key === 'name' && model[key] === legacyBuiltinNames[builtin.id]))\n || Object.keys(model).some((key) => !keys.includes(key as keyof AssistantAvatarModel) && model[key] !== undefined)) throw new TypeError('内置形象不可替换')\n return\n }\n if (!validModel(model)) throw new TypeError('形象名称、类型或资源地址无效')\n}\n\n/** 保留旧存储字段,复制白名单内的数据,避免扩展把运行对象写进设置。 */\nexport function copyAssistantAvatarModel(model: AssistantAvatarModel): AssistantAvatarModel {\n return { id: model.id, name: model.name.trim(), ...copyAsset(model),\n ...(model.package === undefined ? {} : { package: { ...model.package } }),\n ...(model.surfaces === undefined ? {} : { surfaces: Object.fromEntries(Object.entries(model.surfaces).map(([surface, asset]) => [surface, copyAsset(asset)])) }),\n }\n}\n\nexport function selectedAssistantAvatar(appearance: AssistantAppearanceSettings): AssistantAvatarModel {\n return appearance.models.find((model) => model.id === appearance.selectedId)\n ?? getAssistantAvatarPreset(appearance.selectedId)?.model ?? BUILTIN_ASSISTANT_AVATAR\n}\n\n/** 创建表单只列已登记形象;已创建助理和管理器可保留旧选择的兼容入口。 */\nexport function listAssistantAvatars(appearance: AssistantAppearanceSettings, includeLegacy = true): readonly AssistantAvatarModel[] {\n if (!includeLegacy) return appearance.models\n const legacy = getAssistantAvatarPreset(appearance.selectedId)?.model\n return legacy === undefined || appearance.models.some((model) => model.id === legacy.id)\n ? appearance.models : [...appearance.models, legacy]\n}\n\n/** 展示位置只覆盖素材,不覆盖身份;状态映射也跟随所选素材,不串用另一种格式。 */\nexport function resolveAssistantAvatarAsset(model: AssistantAvatarModel, surface: AssistantAvatarSurface): AssistantAvatarModel {\n const asset = model.surfaces?.[surface]\n return asset === undefined ? model : { id: model.id, name: model.name, ...copyAsset(asset),\n ...(model.package === undefined ? {} : { package: model.package }), ...(model.surfaces === undefined ? {} : { surfaces: model.surfaces }) }\n}\n\nexport function assistantAvatarImageSource(model: AssistantAvatarAsset, state: AssistantAvatarState, reaction?: AssistantAvatarReaction): string {\n if (reaction !== undefined && !assistantAvatarVoicePriority(state) && model.reactionSources?.[reaction] !== undefined) return model.reactionSources[reaction]!\n return model.stateSources?.[state] ?? model.source\n}\n/** 单动作通道不能抢占监听、思考或说话;角标仍可同时展示。 */\nexport function assistantAvatarVoicePriority(state: AssistantAvatarState): boolean {\n return state === 'listening' || state === 'thinking' || state === 'speaking'\n}\n\nexport function resolveAssistantAvatarState(state: string | undefined, pending = false): AssistantAvatarState {\n if (state === 'error') return 'error'\n if (state === 'speaking') return 'speaking'\n if (pending || state === 'loading' || state === 'thinking') return 'thinking'\n if (state === 'listening' || state === 'recording') return 'listening'\n if (state === 'waiting') return 'waiting'\n return 'idle'\n}\n\nexport interface AssistantSpriteMotion { readonly row: number; readonly frames: number; readonly interval: number }\nexport function assistantSpriteReactionMotion(model: AssistantAvatarAsset, state: AssistantAvatarState, reaction?: AssistantAvatarReaction): AssistantSpriteMotion {\n const motion = reaction === undefined || assistantAvatarVoicePriority(state) ? undefined : model.reactionMotionGroups?.[reaction]\n return typeof motion === 'object' ? motion : assistantSpriteMotion(state)\n}\n\n/** 帧布局来自 Signalight/codex-to-dsh-pet;单帧 192×208,8 列。 */\nexport function assistantSpriteMotion(state: AssistantAvatarState): AssistantSpriteMotion {\n if (state === 'error') return { row: 5, frames: 8, interval: 140 }\n if (state === 'waiting' || state === 'listening') return { row: 6, frames: 6, interval: 150 }\n if (state === 'thinking') return { row: 7, frames: 6, interval: 120 }\n if (state === 'speaking') return { row: 8, frames: 6, interval: 150 }\n return { row: 0, frames: 6, interval: 160 }\n}\n\n/** 视口变化或旧坐标失效时让宠物保持在可点击范围。 */\nexport function clampAssistantAvatarPosition(x: number, y: number, width: number, height: number, viewportWidth: number, viewportHeight: number): { x: number; y: number } {\n return { x: Math.max(0, Math.min(Number.isFinite(x) ? x : 0, Math.max(0, viewportWidth - width))),\n y: Math.max(0, Math.min(Number.isFinite(y) ? y : 0, Math.max(0, viewportHeight - height))) }\n}\n\nfunction validModel(model: Record<string, unknown>): boolean {\n return typeof model.id === 'string' && /^[A-Za-z][A-Za-z0-9_-]{0,79}$/u.test(model.id)\n && typeof model.name === 'string' && model.name.trim().length > 0 && model.name.length <= 80\n && validAsset(model) && validPackage(model.package) && validSurfaces(model.surfaces)\n}\nfunction validAsset(asset: Record<string, unknown>): boolean {\n return typeof asset.renderer === 'string' && validId(asset.renderer) && asset.renderer !== 'builtin'\n && typeof asset.source === 'string' && isAssistantAvatarSource(asset.source)\n && (asset.spriteVersion === 1 || asset.spriteVersion === 2)\n && validStateMap(asset.stateSources, (source) => asset.renderer === 'image' && isAssistantAvatarSource(source))\n && validStateMap(asset.motionGroups, (group) => asset.renderer === 'live2d' && group.trim().length > 0 && group.length <= 120)\n && validReactionMap(asset.reactionSources, (source) => asset.renderer === 'image' && typeof source === 'string' && isAssistantAvatarSource(source))\n && validReactionMap(asset.reactionMotionGroups, (motion) => asset.renderer === 'live2d' ? validMotionName(motion)\n : asset.renderer === 'spritesheet' && validSpriteReaction(motion, asset.spriteVersion))\n && validReactionMap(asset.reactionExpressions, (expression) => asset.renderer === 'live2d' && validMotionName(expression))\n && validLive2dOptions(asset.live2d, asset.renderer)\n}\nfunction validStateMap(value: unknown, valid: (value: string) => boolean): boolean {\n return value === undefined || (isRecord(value) && Object.entries(value).every(([state, item]) =>\n ASSISTANT_AVATAR_STATES.includes(state as AssistantAvatarState) && typeof item === 'string' && valid(item)))\n}\nfunction validReactionMap(value: unknown, valid: (value: unknown) => boolean): boolean {\n return value === undefined || (isRecord(value) && Object.entries(value).every(([reaction, item]) =>\n ASSISTANT_AVATAR_REACTIONS.includes(reaction as AssistantAvatarReaction) && valid(item)))\n}\nfunction validMotionName(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0 && value.length <= 120 && !/[\\u0000-\\u001f]/u.test(value)\n}\nfunction validSpriteReaction(value: unknown, version: unknown): boolean {\n return isRecord(value) && Object.keys(value).every((key) => ['row', 'frames', 'interval'].includes(key))\n && Number.isInteger(value.row) && Number(value.row) >= 0 && Number(value.row) < (version === 2 ? 11 : 9)\n && Number.isInteger(value.frames) && Number(value.frames) >= 1 && Number(value.frames) <= 8\n && Number.isInteger(value.interval) && Number(value.interval) >= 16 && Number(value.interval) <= 10000\n}\nfunction validPackage(value: unknown): boolean {\n if (value === undefined) return true\n if (!isRecord(value) || typeof value.adapterId !== 'string' || !validId(value.adapterId)) return false\n for (const key of ['manifestUrl', 'homepage']) if (value[key] !== undefined && (typeof value[key] !== 'string' || !isAssistantAvatarSource(value[key]))) return false\n for (const key of ['author', 'license']) if (value[key] !== undefined && (typeof value[key] !== 'string' || value[key].length > 2048)) return false\n if (value.installationId !== undefined && (typeof value.installationId !== 'string' || !/^[a-f0-9]{64}$/u.test(value.installationId))) return false\n return Object.keys(value).every((key) => ['adapterId', 'manifestUrl', 'homepage', 'author', 'license', 'installationId'].includes(key))\n}\nfunction validSurfaces(value: unknown): boolean {\n return value === undefined || (isRecord(value) && Object.entries(value).every(([surface, asset]) =>\n ['floating', 'dialog'].includes(surface) && isRecord(asset) && validAsset(asset)))\n}\nfunction validLive2dOptions(value: unknown, renderer: string): boolean {\n if (value === undefined) return true\n if (!isRecord(value) || renderer !== 'live2d' || Object.keys(value).some((key) => !['scale', 'position'].includes(key))) return false\n if (value.scale !== undefined && (typeof value.scale !== 'number' || !Number.isFinite(value.scale) || value.scale < 0.05 || value.scale > 10)) return false\n return value.position === undefined || (Array.isArray(value.position) && value.position.length === 2\n && value.position.every((item) => typeof item === 'number' && Number.isFinite(item) && Math.abs(item) <= 2))\n}\nfunction copyAsset(asset: AssistantAvatarAsset): AssistantAvatarAsset {\n return { renderer: asset.renderer, source: asset.source, spriteVersion: asset.spriteVersion,\n ...(asset.stateSources === undefined ? {} : { stateSources: { ...asset.stateSources } }),\n ...(asset.motionGroups === undefined ? {} : { motionGroups: { ...asset.motionGroups } }),\n ...(asset.reactionSources === undefined ? {} : { reactionSources: { ...asset.reactionSources } }),\n ...(asset.reactionMotionGroups === undefined ? {} : { reactionMotionGroups: Object.fromEntries(Object.entries(asset.reactionMotionGroups).map(([key, value]) => [key, typeof value === 'string' ? value : { ...value }])) }),\n ...(asset.reactionExpressions === undefined ? {} : { reactionExpressions: { ...asset.reactionExpressions } }),\n ...(asset.live2d === undefined ? {} : { live2d: { ...asset.live2d, ...(asset.live2d.position === undefined ? {} : { position: [...asset.live2d.position] as [number, number] }) } }),\n }\n}\nfunction validId(value: string): boolean { return /^[A-Za-z][A-Za-z0-9_-]{0,79}$/u.test(value) }\nfunction isRecord(value: unknown): value is Record<string, unknown> { return typeof value === 'object' && value !== null && !Array.isArray(value) }\nfunction boundedSize(value: unknown, min: number, max: number, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? Math.max(min, Math.min(max, Math.round(value))) : fallback\n}\nfunction asRecord(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n","import { copyAssistantAvatarModel, isAssistantAvatarSource, validateAssistantAvatarModel } from './assistant-avatar.js'\nimport type { AssistantAvatarAsset, AssistantAvatarManifest, AssistantAvatarModel, AssistantAvatarPackageInfo, AssistantAvatarState } from './assistant-avatar.js'\n\nexport interface AssistantAvatarAdapterContext { readonly manifestUrl: string }\n/** 适配器解释 JSON 数据,不负责下载脚本、会话或渲染实例。 */\nexport interface AssistantAvatarAdapter {\n readonly id: string\n readonly labelKey?: string\n readonly name?: string\n matches(manifest: unknown): boolean\n parse(manifest: unknown, context: AssistantAvatarAdapterContext): AssistantAvatarModel\n}\n\n/** 相对路径以清单实际响应 URL 为基准,重定向后不再使用旧目录。 */\nexport function resolveAssistantAvatarSource(source: unknown, manifestUrl: string): string {\n if (typeof source !== 'string' || source.trim().length === 0 || source.trim().startsWith('//') || /[\\\\\\u0000-\\u001f]/u.test(source)) throw new TypeError('形象包资源地址无效')\n if (!isAssistantAvatarSource(manifestUrl)) throw new TypeError('形象包清单地址无效')\n const resolved = new URL(source, manifestUrl).href\n if (!isAssistantAvatarSource(resolved)) throw new TypeError('形象包资源地址无效')\n return resolved\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) throw new TypeError('形象包清单必须是 JSON 对象')\n return value as Record<string, unknown>\n}\nfunction looksLike(value: unknown, key: string): boolean {\n return typeof value === 'object' && value !== null && key in value\n}\nfunction asset(value: unknown, url: string): AssistantAvatarAsset {\n const input = record(value)\n return { renderer: input.renderer as string, source: resolveAssistantAvatarSource(input.source, url),\n spriteVersion: (input.spriteVersion ?? 2) as 1 | 2,\n ...(input.stateSources === undefined ? {} : { stateSources: Object.fromEntries(Object.entries(record(input.stateSources)).map(([state, source]) => [state, resolveAssistantAvatarSource(source, url)])) }),\n ...(input.motionGroups === undefined ? {} : { motionGroups: record(input.motionGroups) as NonNullable<AssistantAvatarAsset['motionGroups']> }),\n ...(input.reactionSources === undefined ? {} : { reactionSources: Object.fromEntries(Object.entries(record(input.reactionSources)).map(([reaction, source]) => [reaction, resolveAssistantAvatarSource(source, url)])) }),\n ...(input.reactionMotionGroups === undefined ? {} : { reactionMotionGroups: record(input.reactionMotionGroups) as NonNullable<AssistantAvatarAsset['reactionMotionGroups']> }),\n ...(input.reactionExpressions === undefined ? {} : { reactionExpressions: record(input.reactionExpressions) as NonNullable<AssistantAvatarAsset['reactionExpressions']> }),\n ...(input.live2d === undefined ? {} : { live2d: record(input.live2d) as NonNullable<AssistantAvatarAsset['live2d']> }),\n }\n}\nfunction build(input: Record<string, unknown>, base: AssistantAvatarAsset, context: AssistantAvatarAdapterContext, adapterId: string,\n surfaces?: AssistantAvatarModel['surfaces']): AssistantAvatarModel {\n const info: AssistantAvatarPackageInfo = { adapterId, manifestUrl: context.manifestUrl,\n ...(input.author === undefined ? {} : { author: input.author as string }),\n ...(input.license === undefined ? {} : { license: input.license as string }),\n ...(input.homepage === undefined ? {} : { homepage: resolveAssistantAvatarSource(input.homepage, context.manifestUrl) }),\n }\n const model = { id: input.id as string, name: (input.name ?? input.displayName) as string, ...base, package: info,\n ...(surfaces === undefined ? {} : { surfaces }) }\n validateAssistantAvatarModel(model)\n return copyAssistantAvatarModel(model)\n}\n\nconst native: AssistantAvatarAdapter = {\n id: 'codingns-pack', labelKey: 'avatar.adapter.native',\n matches: (value) => looksLike(value, 'avatarManifestVersion'),\n parse(value, context) {\n const input = record(value)\n if (input.avatarManifestVersion !== 1) throw new TypeError('不支持的 CodingNS 形象包版本')\n const surfaces = input.surfaces === undefined ? undefined : Object.fromEntries(Object.entries(record(input.surfaces)).map(([surface, source]) => [surface, asset(source, context.manifestUrl)]))\n return build(input, asset(input.asset, context.manifestUrl), context, this.id, surfaces)\n },\n}\nconst codex: AssistantAvatarAdapter = {\n id: 'codex-pet', labelKey: 'avatar.adapter.codex',\n matches: (value) => looksLike(value, 'spritesheetPath'),\n parse(value, context) {\n const input = record(value)\n return build(input, { renderer: 'spritesheet', source: resolveAssistantAvatarSource(input.spritesheetPath, context.manifestUrl),\n spriteVersion: input.spriteVersionNumber as 1 | 2 }, context, this.id)\n },\n}\nconst dsh: AssistantAvatarAdapter = {\n id: 'dsh-live2d-pet', labelKey: 'avatar.adapter.dsh',\n matches: (value) => looksLike(value, 'petManifestVersion'),\n parse(value, context) {\n const input = record(value)\n if (input.petManifestVersion !== 2 || input.renderer !== 'live2d') throw new TypeError('不支持的 DSH 形象包格式')\n const live2d = record(input.live2d)\n const translate = live2d.translate === undefined ? undefined : record(live2d.translate)\n // DSH 的 failed/asking 与 CodingNS 的 error/waiting 在适配边界转换。\n const motions = live2d.motions === undefined ? {} : record(live2d.motions)\n const states: Record<AssistantAvatarState, readonly string[]> = {\n idle: ['idle'], thinking: ['thinking', 'tool'], speaking: ['speaking'],\n listening: ['listening', 'waiting'], waiting: ['waiting', 'asking', 'queued'], error: ['error', 'failed'],\n }\n const motionGroups = Object.fromEntries(Object.entries(states).flatMap(([state, aliases]) => {\n const group = aliases.map((key) => motions[key]).find((item) => item !== undefined)\n return group === undefined ? [] : [[state, group]]\n }))\n return build(input, { renderer: 'live2d', source: resolveAssistantAvatarSource(live2d.model, context.manifestUrl), spriteVersion: 2,\n ...(Object.keys(motionGroups).length === 0 ? {} : { motionGroups }),\n ...(live2d.scale === undefined && translate === undefined ? {} : { live2d: {\n ...(live2d.scale === undefined ? {} : { scale: live2d.scale as number }),\n ...(translate === undefined ? {} : { position: [translate.x, translate.y] as [number, number] }),\n } }),\n }, context, this.id)\n },\n}\nconst cubism: AssistantAvatarAdapter = {\n id: 'cubism-model', labelKey: 'avatar.adapter.cubism',\n matches: (value) => looksLike(value, 'FileReferences') || looksLike(value, 'model'),\n parse(value, context) {\n const input = record(value)\n const refs = input.FileReferences === undefined ? input : record(input.FileReferences)\n const textures = refs.Textures ?? refs.textures\n if ((input.FileReferences !== undefined && input.Version !== 3) || !Array.isArray(textures) || textures.length === 0) throw new TypeError('Live2D 模型清单不完整')\n resolveAssistantAvatarSource(refs.Moc ?? refs.model, context.manifestUrl)\n for (const texture of textures) resolveAssistantAvatarSource(texture, context.manifestUrl)\n // 模型没有角色 ID,使用来源的稳定指纹,重复导入不会生成无限副本。\n let hash = 2166136261\n for (const character of context.manifestUrl) hash = Math.imul(hash ^ character.charCodeAt(0), 16777619)\n const filename = new URL(context.manifestUrl).pathname.split('/').pop() ?? 'Live2D'\n return build({ id: `live2d-${(hash >>> 0).toString(36)}`, name: decodeURIComponent(filename).replace(/\\.model3?\\.json$/iu, '').slice(0, 80) || 'Live2D' },\n { renderer: 'live2d', source: context.manifestUrl, spriteVersion: 2 }, context, this.id)\n },\n}\n\nexport const BUILTIN_ASSISTANT_AVATAR_ADAPTERS: readonly AssistantAvatarAdapter[] = [native, codex, dsh, cubism]\n\n/** 导出原生清单时不重复嵌入导入器元数据,素材地址已统一为可访问地址。 */\nexport function assistantAvatarManifest(model: AssistantAvatarModel): AssistantAvatarManifest {\n validateAssistantAvatarModel(model)\n if (model.renderer === 'builtin') throw new TypeError('内置形象不需要导出素材包')\n const { id, name, package: info, surfaces, ...base } = copyAssistantAvatarModel(model)\n return { avatarManifestVersion: 1, id, name, asset: base, ...(surfaces === undefined ? {} : { surfaces }),\n ...(info?.author === undefined ? {} : { author: info.author }), ...(info?.license === undefined ? {} : { license: info.license }),\n ...(info?.homepage === undefined ? {} : { homepage: info.homepage }) }\n}\n","import type { AssistantAvatarModel } from './assistant-avatar.js'\n\n/** 固定入口通过内容版本和文件键读取已安装素材,不接受远程代理目标。 */\nexport const ASSISTANT_AVATAR_ASSET_PATH = '/api/codingns/assistant-avatar-assets'\nexport const ASSISTANT_AVATAR_STATUS_PATH = '/api/codingns/assistant-avatar-cache-status'\nexport interface AssistantAvatarCandidate { readonly url: string; readonly name: string }\nexport interface AssistantAvatarInstallation {\n readonly id: string\n readonly model: AssistantAvatarModel\n readonly created: boolean\n readonly files: number\n readonly bytes: number\n}\nexport function assistantAvatarInstalledSource(id: string, file: string): string {\n return `${ASSISTANT_AVATAR_ASSET_PATH}?pack=${id}&file=${encodeURIComponent(file)}`\n}\n","/** 官方 ONNX 清单版本固定,展示元数据与推理 ID 共用同一份目录。 */\nexport type AssistantVoiceGender = 'male' | 'female' | 'unknown'\nexport interface AssistantTtsVoice {\n readonly id: string\n readonly name: string\n readonly language: string\n readonly gender: AssistantVoiceGender\n readonly kind: 'builtin' | 'reference'\n /** 内置为官方 voice ID;导入为 Host 生成的缓存键,绝不接受本地路径。 */\n readonly reference: string\n readonly source: string\n readonly license: string\n}\nexport interface AssistantTtsSettings {\n readonly backend: 'browser' | 'moss-onnx'\n readonly selectedId: string\n readonly voices: readonly AssistantTtsVoice[]\n /** 老配置可以缺省,读取时统一补齐,音色切换不改变播报参数。 */\n readonly parameters?: AssistantTtsParameters\n}\nexport interface AssistantTtsParameters {\n readonly rate: number\n readonly volume: number\n readonly segmentPauseMs: number\n readonly chunkTokens: number\n /** null 为自动随机;固定种子用于比较同一段文本的生成效果。 */\n readonly seed: number | null\n}\nexport const DEFAULT_ASSISTANT_TTS_PARAMETERS: AssistantTtsParameters = Object.freeze({ rate: 1, volume: 1, segmentPauseMs: 0, chunkTokens: 75, seed: null })\nexport const ASSISTANT_TTS_PARAMETER_LIMITS = {\n rate: { min: 0.5, max: 2, step: 0.05 },\n volume: { min: 0, max: 1, step: 0.01 },\n segmentPauseMs: { min: 0, max: 2000, step: 50 },\n chunkTokens: { min: 30, max: 120, step: 1 },\n seed: { min: 0, max: 4294967295, step: 1 },\n} as const\n\n/** 已保存的旧值或损坏值用默认值恢复;写入及试听请求使用严格校验。 */\nexport function readAssistantTtsParameters(value?: Partial<AssistantTtsParameters>): AssistantTtsParameters {\n const result = { ...DEFAULT_ASSISTANT_TTS_PARAMETERS }\n for (const key of ['rate', 'volume', 'segmentPauseMs', 'chunkTokens', 'seed'] as const) {\n const item = value?.[key]\n if (validParameter(key, item)) Object.assign(result, { [key]: item })\n }\n return result\n}\n\nexport function validateAssistantTtsParameters(value: unknown, base?: Partial<AssistantTtsParameters>): AssistantTtsParameters {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) throw new Error('播报参数必须为对象')\n const result = readAssistantTtsParameters(base)\n for (const [key, item] of Object.entries(value)) {\n if (!Object.hasOwn(ASSISTANT_TTS_PARAMETER_LIMITS, key)) throw new Error(`不支持的播报参数:${key}`)\n const name = key as keyof AssistantTtsParameters\n if (!validParameter(name, item)) {\n const limit = ASSISTANT_TTS_PARAMETER_LIMITS[name]\n throw new Error(`播报参数 ${key} 需要 ${limit.min}~${limit.max}${name === 'seed' ? ' 的整数或 null' : name === 'chunkTokens' || name === 'segmentPauseMs' ? ' 的整数' : ''}`)\n }\n Object.assign(result, { [key]: item })\n }\n return result\n}\n\nfunction validParameter(key: keyof AssistantTtsParameters, value: unknown): boolean {\n if (key === 'seed' && value === null) return true\n const limit = ASSISTANT_TTS_PARAMETER_LIMITS[key]\n return typeof value === 'number' && Number.isFinite(value) && value >= limit.min && value <= limit.max\n && (key === 'rate' || key === 'volume' || Number.isInteger(value))\n}\n\nexport const DEFAULT_ASSISTANT_TTS_SETTINGS: AssistantTtsSettings = { backend: 'browser', selectedId: 'moss:Yuewen', voices: [], parameters: DEFAULT_ASSISTANT_TTS_PARAMETERS }\nexport const MOSS_TTS_REVISION = 'f52645cb467506d8e18e746ddd59482685b74e58'\nexport const MOSS_CODEC_REVISION = 'ceff0d0749bfb3fa2d61149794ec6feef0d1e1ae'\nexport const MOSS_SOURCE_REVISION = '8b7bcc9341b3b4ef3a3a58ba1338a7d85ff133eb'\nexport const MOSS_BUILTIN_VOICES: readonly AssistantTtsVoice[] = [\n { id: 'moss:Junhao', name: 'Junhao · 欢迎关注模思智能', language: 'zh', gender: 'male', kind: 'builtin', reference: 'Junhao', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Zhiming', name: 'Zhiming · 京味胡同闲聊', language: 'zh', gender: 'male', kind: 'builtin', reference: 'Zhiming', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Weiguo', name: 'Weiguo · 说书', language: 'zh', gender: 'male', kind: 'builtin', reference: 'Weiguo', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Xiaoyu', name: 'Xiaoyu · 明星', language: 'zh', gender: 'female', kind: 'builtin', reference: 'Xiaoyu', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Yuewen', name: 'Yuewen · 机车', language: 'zh', gender: 'female', kind: 'builtin', reference: 'Yuewen', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Lingyu', name: 'Lingyu · 深夜电台', language: 'zh', gender: 'female', kind: 'builtin', reference: 'Lingyu', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Trump', name: 'Trump · Trump', language: 'en', gender: 'male', kind: 'builtin', reference: 'Trump', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Ava', name: 'Ava · The Bitter Lesson', language: 'en', gender: 'female', kind: 'builtin', reference: 'Ava', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Bella', name: 'Bella · A Gentle Reminder', language: 'en', gender: 'female', kind: 'builtin', reference: 'Bella', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Adam', name: 'Adam · English News', language: 'en', gender: 'male', kind: 'builtin', reference: 'Adam', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Nathan', name: 'Nathan · The Quiet Motion of the World', language: 'en', gender: 'male', kind: 'builtin', reference: 'Nathan', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Soyo', name: 'Soyo · Soyo', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Soyo', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Saki', name: 'Saki · Saki', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Saki', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Mortis', name: 'Mortis · Mortis', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Mortis', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Umiri', name: 'Umiri · Umiri', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Umiri', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Mei', name: 'Mei · Togawa', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Mei', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Anon', name: 'Anon · Anon', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Anon', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Arisa', name: 'Arisa · Arisa', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Arisa', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n]\nexport const ASSISTANT_TTS_PATH = '/api/codingns/assistant/voice/tts'\nexport const ASSISTANT_VOICE_SAMPLE_PATH = '/api/codingns/assistant/voice/sample'\nexport const ASSISTANT_VOICE_SITES = [\n { id: 'kyutai', name: 'Kyutai 开放音色', url: 'https://kyutai.org/tts/', help: '试听后填写 kyutai:voice-donations/0a67.wav 等录音 ID,或 Hugging Face 音频文件网址。' },\n { id: 'aishell', name: 'AISHELL-3 中文录音', url: 'https://huggingface.co/datasets/AISHELL/AISHELL-3', help: '填写 aishell:完整录音ID,或 Hugging Face 中单个音频文件的网址。' },\n] as const\nexport interface AssistantTtsStatus {\n readonly ready: boolean\n readonly busy: boolean\n readonly phase: string\n readonly downloadedBytes: number\n readonly totalBytes: number | null\n readonly error: string | null\n}\nexport interface AssistantTtsSnapshot {\n readonly settings: AssistantTtsSettings\n readonly voices: readonly AssistantTtsVoice[]\n readonly status: AssistantTtsStatus\n}\n/** 旧设置只补默认值,内置音色始终由目录提供,不能被自定义记录覆盖。 */\nexport function readAssistantTtsSettings(value?: AssistantTtsSettings): AssistantTtsSettings {\n const voices = (value?.voices ?? []).filter((voice) => voice.kind === 'reference' && /^ref-[a-f0-9]{64}$/u.test(voice.id) && voice.reference === voice.id)\n const selectedId = value?.selectedId ?? DEFAULT_ASSISTANT_TTS_SETTINGS.selectedId\n return { backend: value?.backend === 'moss-onnx' ? 'moss-onnx' : 'browser',\n selectedId: [...MOSS_BUILTIN_VOICES, ...voices].some((voice) => voice.id === selectedId) ? selectedId : DEFAULT_ASSISTANT_TTS_SETTINGS.selectedId, voices,\n parameters: readAssistantTtsParameters(value?.parameters) }\n}\n","import type { CodingNsClientServices } from './features/types.js'\nimport type { VoiceRuntimeAdapter } from '../shared/contracts/voice-runtime.js'\n\nexport interface GlobalVoiceAdapter extends VoiceRuntimeAdapter {\n readonly capabilities: import('../shared/contracts/voice-runtime.js').VoiceRuntimeCapabilities\n readonly configuredOwnerId: string\n readonly ownerId: string | undefined\n readonly inputDeviceId: string | undefined\n readonly outputDeviceId: string | undefined\n readonly outputDeviceSupported: boolean\n readonly isMicrophoneMuted?: boolean\n readonly isSpeakerMuted?: boolean\n setMicrophoneMuted?(muted: boolean): void\n setSpeakerMuted?(muted: boolean): void\n start(ownerId?: string): Promise<void>\n stop(): Promise<void>\n interrupt(): Promise<void>\n enumerateInputDevices(): Promise<readonly { readonly deviceId: string; readonly label: string }[]>\n enumerateOutputDevices(): Promise<readonly { readonly deviceId: string; readonly label: string }[]>\n selectInputDevice(deviceId: string): Promise<void>\n selectOutputDevice(deviceId: string): Promise<void>\n dispose?(): void\n}\n\nconst adapters = new WeakMap<CodingNsClientServices, GlobalVoiceAdapter>()\n\nexport function registerGlobalVoiceAdapter(services: CodingNsClientServices, adapter: GlobalVoiceAdapter): () => void {\n adapters.set(services, adapter)\n return () => {\n if (adapters.get(services) === adapter) adapters.delete(services)\n }\n}\n\nexport function getGlobalVoiceAdapter(services: CodingNsClientServices): GlobalVoiceAdapter | undefined {\n return adapters.get(services)\n}\n","import { createElement, useEffect, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { assistantAvatarImageSource } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarRendererProps } from './registry.js'\n\n/** 图片差分也消费相同的状态接口;某张差分缺失时先回落该角色默认图片。 */\nexport function ImageAssistantAvatar({ model, state, reaction, size, onError, onLoadProgress }: AssistantAvatarRendererProps): ReactElement {\n const requested = assistantAvatarImageSource(model, state, reaction)\n const [failed, setFailed] = useState('')\n const image = useRef<HTMLImageElement | null>(null)\n useEffect(() => setFailed(''), [requested])\n const source = failed === requested ? model.source : requested\n useEffect(() => {\n // 热缓存图片可能在 effect 前触发 load,不能随后又把已就绪形象遮住。\n onLoadProgress?.({ phase: image.current?.complete && image.current.naturalWidth > 0 ? 'ready' : 'resources' })\n }, [source, onLoadProgress])\n return createElement('img', { key: source, ref: image, src: source, alt: '', draggable: false,\n onLoad: () => onLoadProgress?.({ phase: 'ready' }),\n onError: () => { if (source !== model.source) setFailed(requested); else onError('avatar_image_load_failed') },\n style: { display: 'block', width: size, maxWidth: '100%', height: size * 208 / 192, objectFit: 'contain' } })\n}\n","import { createElement } from 'react'\nimport type { ReactElement } from 'react'\nimport { BUILTIN_ASSISTANT_AVATAR, BUILTIN_ASSISTANT_AVATAR_SOURCES } from '../../shared/assistant-avatar.js'\nimport { ImageAssistantAvatar } from './image.js'\nimport type { AssistantAvatarRendererProps } from './registry.js'\n\n/** 基础形象使用生图工具生成的透明 PNG,不手绘角色,也不加载第三方引擎。 */\nexport function BuiltinAssistantAvatar(props: AssistantAvatarRendererProps): ReactElement {\n const source = BUILTIN_ASSISTANT_AVATAR_SOURCES[props.model.id] ?? BUILTIN_ASSISTANT_AVATAR_SOURCES[BUILTIN_ASSISTANT_AVATAR.id]!\n return createElement(ImageAssistantAvatar, { ...props, model: { ...props.model, source } })\n}\n","import { createElement } from 'react'\nimport type { ReactElement } from 'react'\nimport type { AssistantAvatarReaction } from '../../shared/assistant-avatar.js'\nimport { resolveCodingNsTranslator } from '../locale.js'\n\n/** 角标独立于模型能力,旧包与缺失表情接口仍可提供文字反馈。 */\nexport function AssistantAvatarReactionBadge({ reaction }: { readonly reaction: AssistantAvatarReaction }): ReactElement {\n const t = resolveCodingNsTranslator()\n const labels = { success: t('awb.notifications.completed'), concerned: t('awb.notifications.error'), question: t('awb.notifications.question'), approval: t('awb.notifications.approval') }\n const icons = { success: '✓', concerned: '!', question: '?', approval: '…' }\n return createElement('span', { role: 'status', 'aria-label': labels[reaction], title: labels[reaction], 'data-codingns-avatar-reaction': reaction,\n style: { position: 'absolute', right: 0, top: 0, padding: '2px 7px', borderRadius: 12, background: '#fff', color: '#242424', border: '1px solid #b8c3d3', pointerEvents: 'none' } }, icons[reaction])\n}\n","import { createElement, useEffect, useRef } from 'react'\nimport type { ReactElement } from 'react'\nimport { assistantSpriteMotion, assistantSpriteReactionMotion } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarState, AssistantSpriteMotion } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarRendererProps } from './registry.js'\n\n/** 可测试的时钟:只推进当前动作实际拥有的帧,暂停后不追赶后台时间。 */\nexport class AssistantSpriteClock {\n private frame = 0\n private last: number | undefined\n private motion: AssistantSpriteMotion | undefined\n constructor(private state: AssistantAvatarState) {}\n setState(state: AssistantAvatarState): void { if (state !== this.state) { this.state = state; this.frame = 0; this.last = undefined } }\n setMotion(motion: AssistantSpriteMotion): void {\n if (this.motion?.row === motion.row && this.motion.frames === motion.frames && this.motion.interval === motion.interval) return\n this.motion = motion; this.frame = 0; this.last = undefined\n }\n reset(): void { this.last = undefined }\n tick(now: number): { row: number; frame: number } {\n const motion = this.motion ?? assistantSpriteMotion(this.state)\n if (this.last === undefined) this.last = now\n const steps = Math.floor(Math.max(0, now - this.last) / motion.interval)\n this.frame = (this.frame + steps) % motion.frames\n this.last += steps * motion.interval\n return { row: motion.row, frame: this.frame }\n }\n}\n\n/** 参考 Signalight 的纯 DOM 图集渲染,不引入 Pixi 或上游会话逻辑。 */\nexport function SpriteSheetAssistantAvatar({ model, state, reaction, size, onError, onLoadProgress }: AssistantAvatarRendererProps): ReactElement {\n const element = useRef<HTMLDivElement | null>(null)\n const motion = assistantSpriteReactionMotion(model, state, reaction)\n const motionRef = useRef(motion)\n motionRef.current = motion\n useEffect(() => {\n // 动画被暂停时也要立即呈现新状态的第一帧。\n if (element.current !== null) element.current.style.backgroundPosition = `0% ${motion.row * 100 / (model.spriteVersion === 2 ? 10 : 8)}%`\n }, [motion.row, motion.frames, motion.interval, model.spriteVersion])\n useEffect(() => {\n const target = element.current\n if (target === null) return undefined\n onLoadProgress?.({ phase: 'resources' })\n const image = new Image()\n let disposed = false\n let frameId = 0\n const clock = new AssistantSpriteClock('idle')\n const media = window.matchMedia?.('(prefers-reduced-motion: reduce)')\n const rows = model.spriteVersion === 2 ? 11 : 9\n const paint = (now: number): void => {\n clock.setMotion(motionRef.current)\n const frame = clock.tick(now)\n // 百分比按整张背景减去一帧的剩余范围定位,窄屏缩小也不会裁掉角色。\n target.style.backgroundPosition = `${frame.frame * 100 / 7}% ${frame.row * 100 / (rows - 1)}%`\n }\n const tick = (now: number): void => { if (disposed) return; paint(now); frameId = requestAnimationFrame(tick) }\n const refresh = (): void => {\n cancelAnimationFrame(frameId)\n clock.reset()\n paint(performance.now())\n if (!disposed && !document.hidden && !media?.matches) frameId = requestAnimationFrame(tick)\n }\n image.onload = () => {\n if (disposed) return\n if (image.naturalWidth !== 192 * 8 || image.naturalHeight !== 208 * rows) {\n onError(`avatar_sprite_dimensions_invalid: expected 1536x${208 * rows}`)\n return\n }\n target.style.backgroundImage = `url(${JSON.stringify(model.source)})`\n onLoadProgress?.({ phase: 'ready', loaded: 1, total: 1 })\n refresh()\n }\n image.onerror = () => { if (!disposed) onError('avatar_sprite_load_failed') }\n image.src = model.source\n document.addEventListener('visibilitychange', refresh)\n media?.addEventListener('change', refresh)\n return () => {\n disposed = true\n image.onload = null; image.onerror = null\n cancelAnimationFrame(frameId)\n document.removeEventListener('visibilitychange', refresh)\n media?.removeEventListener('change', refresh)\n }\n }, [model.source, model.spriteVersion, onError, onLoadProgress])\n return createElement('div', { ref: element, 'aria-hidden': true, style: { width: size, aspectRatio: '192 / 208',\n maxWidth: '100%', backgroundRepeat: 'no-repeat', backgroundSize: `800% ${model.spriteVersion === 2 ? 1100 : 900}%` } })\n}\n","import { ASSISTANT_AVATAR_RESOURCE_PACKS, assistantAvatarCacheStatusPath } from '../../shared/assistant-avatar-legacy-resources.js'\nimport type { AssistantAvatarCacheStatus } from '../../shared/assistant-avatar-resources.js'\nimport { ASSISTANT_AVATAR_ASSET_PATH, ASSISTANT_AVATAR_STATUS_PATH } from '../../shared/assistant-avatar-installation.js'\n\n/** 只诊断本站固定预设;查询失败不阻断模型加载,不推测浏览器是否命中缓存。 */\nexport async function readAssistantAvatarCacheStatus(source: string, location: string, fetchStatus: typeof fetch = (...args) => fetch(...args)): Promise<AssistantAvatarCacheStatus | undefined> {\n try {\n const origin = new URL(location)\n const model = new URL(source, origin)\n const installedId = model.origin === origin.origin && model.pathname === ASSISTANT_AVATAR_ASSET_PATH ? model.searchParams.get('pack') : null\n if (installedId !== null && /^[a-f0-9]{64}$/u.test(installedId)) {\n const response = await fetchStatus(new URL(`${ASSISTANT_AVATAR_STATUS_PATH}?pack=${installedId}`, origin).href,\n { cache: 'no-store', credentials: 'same-origin', signal: AbortSignal.timeout(250) })\n if (!response.ok) return undefined\n const value = await response.json() as AssistantAvatarCacheStatus\n if (value.version !== 1 || value.pack !== installedId || typeof value.generation !== 'string' || !value.generation || value.generation.length > 80\n || [value.cached, value.pending, value.total, value.downloads].some((number) => !Number.isSafeInteger(number) || number < 0)\n || value.total > 256 || value.cached + value.pending > value.total) return undefined\n return value\n }\n const pack = ASSISTANT_AVATAR_RESOURCE_PACKS.find((entry) => model.origin === origin.origin && model.pathname === entry.basePath + entry.manifest)\n if (pack === undefined) return undefined\n const response = await fetchStatus(new URL(assistantAvatarCacheStatusPath(pack), origin).href,\n { cache: 'no-store', credentials: 'same-origin', signal: AbortSignal.timeout(250) })\n if (!response.ok) return undefined\n const value = await response.json() as Partial<AssistantAvatarCacheStatus>\n const numbers = [value.cached, value.pending, value.total, value.downloads]\n const total = pack.files.filter((file) => file.preload !== false).length\n if (value.version !== 1 || typeof value.generation !== 'string' || value.generation.length === 0 || value.generation.length > 80\n || value.pack !== pack.basePath || value.total !== total\n || numbers.some((number) => !Number.isSafeInteger(number) || number! < 0)\n || value.cached! + value.pending! > total) return undefined\n return value as AssistantAvatarCacheStatus\n } catch { return undefined }\n}\n","import { resolveAssistantAvatarAsset } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarModel, AssistantAvatarSurface } from '../../shared/assistant-avatar.js'\n\n/** 预览只包含透明 PNG,第三方渲染器也通过相同接口提交。 */\nexport interface AssistantAvatarPreview {\n readonly blob: Blob\n readonly width: number\n readonly height: number\n /** 用户头像在原始静态帧中的百分比裁剪区域;普通全身预览无需填写。 */\n readonly cropAreaPercentages?: { readonly x: number; readonly y: number; readonly width: number; readonly height: number }\n}\ninterface PreviewRecord extends AssistantAvatarPreview {\n readonly key: string\n readonly modelId: string\n readonly surface: AssistantAvatarSurface\n readonly savedAt: number\n}\nexport const AVATAR_PREVIEW_MAX_EDGE = 512\nexport const AVATAR_PREVIEW_MAX_BYTES = 512 * 1024\nexport const AVATAR_PREVIEW_MAX_ENTRIES = 8\nconst MAX_AGE = 30 * 24 * 60 * 60 * 1000\nconst DATABASE = 'codingns-assistant-avatar-previews'\nconst STORE = 'previews'\n\n/** 排序映射,避免设置归一化复制对象或属性顺序变化造成无效缓存。 */\nexport function assistantAvatarPreviewKey(model: AssistantAvatarModel, surface: AssistantAvatarSurface, rendererVersion: string,\n baseUrl: string | undefined = typeof document === 'undefined' ? undefined : document.baseURI): string {\n const asset = resolveAssistantAvatarAsset(model, surface)\n const url = (source: string): string => { try { return new URL(source, baseUrl).href } catch { return source } }\n const entries = (map: Readonly<Record<string, string>> | undefined) => Object.entries(map ?? {}).sort(([a], [b]) => a.localeCompare(b))\n return JSON.stringify([1, model.id, surface, rendererVersion, asset.renderer, url(asset.source), asset.spriteVersion,\n asset.live2d?.scale ?? 1, asset.live2d?.position ?? [0, 0], entries(asset.motionGroups), entries(asset.stateSources).map(([state, source]) => [state, url(source)])])\n}\n\nexport function validAssistantAvatarPreview(value: unknown): value is AssistantAvatarPreview {\n if (value === null || typeof value !== 'object') return false\n const preview = value as Partial<AssistantAvatarPreview>\n return preview.blob instanceof Blob && preview.blob.type === 'image/png' && preview.blob.size > 0 && preview.blob.size <= AVATAR_PREVIEW_MAX_BYTES\n && Number.isSafeInteger(preview.width) && Number.isSafeInteger(preview.height)\n && preview.width! > 0 && preview.height! > 0 && preview.width! <= AVATAR_PREVIEW_MAX_EDGE && preview.height! <= AVATAR_PREVIEW_MAX_EDGE\n && (preview.cropAreaPercentages === undefined || validCropArea(preview.cropAreaPercentages))\n}\nfunction validCropArea(area: NonNullable<AssistantAvatarPreview['cropAreaPercentages']>): boolean {\n return area !== null && typeof area === 'object' && [area.x, area.y, area.width, area.height].every(Number.isFinite)\n && area.x >= 0 && area.y >= 0 && area.width > 0 && area.height > 0 && area.x + area.width <= 100.001 && area.y + area.height <= 100.001\n}\n\n/** 开库和事务都有短超时;存储不可用只丢失预览,不影响模型显示。 */\nexport class AssistantAvatarPreviewStore {\n private database: Promise<IDBDatabase | undefined> | undefined\n constructor(private readonly factory: () => IDBFactory | undefined = () => typeof indexedDB === 'undefined' ? undefined : indexedDB,\n private readonly now: () => number = Date.now,\n private readonly databaseName = DATABASE,\n private readonly limits: { readonly maxAgeMs?: number; readonly maxEntries?: number } = {}) {}\n\n async read(key: string, signal?: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n return this.transaction('readonly', (store, result) => {\n const request = store.get(key)\n request.onsuccess = () => {\n const record = request.result as PreviewRecord | undefined\n if (this.validRecord(record) && record.key === key) result({ blob: record.blob, width: record.width, height: record.height,\n ...(record.cropAreaPercentages === undefined ? {} : { cropAreaPercentages: record.cropAreaPercentages }) })\n }\n }, signal)\n }\n\n async write(key: string, modelId: string, surface: AssistantAvatarSurface, preview: AssistantAvatarPreview, signal?: AbortSignal): Promise<boolean> {\n if (!validAssistantAvatarPreview(preview)) return false\n return await this.transaction<boolean>('readwrite', (store, result) => {\n const request = store.getAll()\n request.onsuccess = () => {\n const records: PreviewRecord[] = []\n for (const entry of request.result as PreviewRecord[]) {\n // 同一形象/展示位置只留最新版本;默认预览最多 8 项,用户头像可配置独立上限。\n if (!this.validRecord(entry) || (entry.modelId === modelId && entry.surface === surface)) store.delete(entry.key)\n else records.push(entry)\n }\n records.sort((a, b) => b.savedAt - a.savedAt)\n for (const entry of records.slice((this.limits.maxEntries ?? AVATAR_PREVIEW_MAX_ENTRIES) - 1)) store.delete(entry.key)\n store.put({ key, modelId, surface, ...preview, savedAt: this.now() } satisfies PreviewRecord)\n result(true)\n }\n }, signal) ?? false\n }\n\n async remove(key: string): Promise<void> { await this.transaction('readwrite', (store) => { store.delete(key) }) }\n async removeModel(modelId: string): Promise<void> {\n await this.transaction('readwrite', (store) => {\n const request = store.getAll()\n request.onsuccess = () => { for (const entry of request.result as PreviewRecord[]) if (entry.modelId === modelId) store.delete(entry.key) }\n })\n }\n\n private validRecord(value: unknown): value is PreviewRecord {\n if (!validAssistantAvatarPreview(value)) return false\n const entry = value as PreviewRecord\n return typeof entry.key === 'string' && typeof entry.modelId === 'string' && (entry.surface === 'floating' || entry.surface === 'dialog')\n && Number.isFinite(entry.savedAt) && entry.savedAt <= this.now() && this.now() - entry.savedAt < (this.limits.maxAgeMs ?? MAX_AGE)\n }\n\n private open(): Promise<IDBDatabase | undefined> {\n if (this.database !== undefined) return this.database\n const task = new Promise<IDBDatabase | undefined>((resolve) => {\n let request: IDBOpenDBRequest\n try {\n const factory = this.factory()\n if (factory === undefined) { resolve(undefined); return }\n request = factory.open(this.databaseName, 1)\n } catch { resolve(undefined); return }\n let settled = false\n const finish = (database?: IDBDatabase): void => { if (settled) { database?.close(); return }; settled = true; clearTimeout(timer); resolve(database) }\n const timer = setTimeout(() => finish(), 1000)\n request.onupgradeneeded = () => { if (!request.result.objectStoreNames.contains(STORE)) request.result.createObjectStore(STORE, { keyPath: 'key' }) }\n request.onerror = () => finish()\n request.onblocked = () => finish()\n request.onsuccess = () => {\n request.result.onversionchange = () => { request.result.close(); this.database = undefined }\n finish(request.result)\n }\n })\n this.database = task\n void task.then((database) => { if (database === undefined && this.database === task) this.database = undefined })\n return task\n }\n\n private async transaction<T>(mode: IDBTransactionMode, action: (store: IDBObjectStore, result: (value: T) => void) => void,\n signal?: AbortSignal): Promise<T | undefined> {\n if (signal?.aborted) return undefined\n const database = await this.open()\n if (database === undefined || signal?.aborted) return undefined\n return new Promise((resolve) => {\n let transaction: IDBTransaction\n try { transaction = database.transaction(STORE, mode) } catch { this.database = undefined; resolve(undefined); return }\n let value: T | undefined\n const abort = (): void => { try { transaction.abort() } catch { /* 事务已结束,无需再次处理。 */ } }\n const timer = setTimeout(abort, 1000)\n const finish = (success: boolean): void => { clearTimeout(timer); signal?.removeEventListener('abort', abort); resolve(success ? value : undefined) }\n transaction.oncomplete = () => finish(true)\n transaction.onabort = () => finish(false)\n transaction.onerror = () => finish(false)\n signal?.addEventListener('abort', abort, { once: true })\n try { action(transaction.objectStore(STORE), (next) => { value = next }) } catch { abort(); finish(false) }\n })\n }\n}\n\nexport const assistantAvatarPreviewStore = new AssistantAvatarPreviewStore()\n","import { AVATAR_PREVIEW_MAX_EDGE, validAssistantAvatarPreview } from './preview-store.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\n\n/** 在同步绘制窗口拷贝到 2D 画布;PNG 编码异步执行,不保留原 GPU 缓冲。 */\nfunction copyCanvasFrame(source: HTMLCanvasElement): HTMLCanvasElement | undefined {\n if (source.width <= 0 || source.height <= 0) return undefined\n const canvas = document.createElement('canvas')\n const scale = Math.min(1, AVATAR_PREVIEW_MAX_EDGE / Math.max(source.width, source.height))\n canvas.width = Math.max(1, Math.round(source.width * scale)); canvas.height = Math.max(1, Math.round(source.height * scale))\n const context = canvas.getContext('2d', { willReadFrequently: true })\n if (context === null) return undefined\n context.drawImage(source, 0, 0, canvas.width, canvas.height)\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data\n // 全透明不代表已渲染,不能写入缓存并在刷新后显示空白。\n for (let index = 3; index < pixels.length; index += 4) if (pixels[index]! > 0) return canvas\n return undefined\n}\n\n/** 只临时观察当前上下文的绘制,在同一帧微任务中捕获完整图像,完成/取消后还原。 */\nexport function captureAssistantAvatarPreview(source: HTMLCanvasElement, signal?: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n if (signal?.aborted) return Promise.resolve(undefined)\n return new Promise((resolve) => {\n let settled = false\n let queued = false\n const restore: (() => void)[] = []\n const finish = (preview?: AssistantAvatarPreview): void => {\n if (settled) return\n settled = true; clearTimeout(timer); signal?.removeEventListener('abort', abort)\n for (const release of restore.splice(0).reverse()) release()\n resolve(preview)\n }\n const abort = (): void => finish()\n const timer = setTimeout(abort, 1000)\n signal?.addEventListener('abort', abort, { once: true })\n const capture = (): boolean => {\n if (settled || signal?.aborted) return true\n try {\n const canvas = copyCanvasFrame(source)\n if (canvas === undefined) return false\n // 图片已拷贝,不再挂住引擎绘制函数,编码期间也不干扰后续动画。\n for (const release of restore.splice(0).reverse()) release()\n canvas.toBlob((blob) => {\n const preview = blob === null ? undefined : { blob, width: canvas.width, height: canvas.height }\n finish(validAssistantAvatarPreview(preview) ? preview : undefined)\n }, 'image/png')\n return true\n } catch { finish(); return true } // 跨域或不可读取的模型继续显示,只跳过预览。\n }\n try {\n const context = source.getContext('webgl2') ?? source.getContext('webgl')\n if (context === null) { if (!capture()) finish(); return }\n for (const name of ['drawElements', 'drawArrays'] as const) {\n const original = context[name]\n const descriptor = Object.getOwnPropertyDescriptor(context, name)\n const observe = (...args: number[]): void => {\n Reflect.apply(original, context, args)\n if (!queued && !settled) {\n queued = true\n queueMicrotask(() => { queued = false; capture() })\n }\n }\n Object.defineProperty(context, name, { configurable: true, writable: true, value: observe })\n restore.push(() => {\n if (context[name] !== observe) return\n try {\n if (descriptor === undefined) delete (context as unknown as Record<string, unknown>)[name]\n else Object.defineProperty(context, name, descriptor)\n } catch { /* 外部冻结上下文时仍结束等待,不将预览清理失败传播给模型。 */ }\n })\n }\n capture()\n } catch { finish() }\n })\n}\n","import type { AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport { assistantAvatarImageSource, BUILTIN_ASSISTANT_AVATAR, BUILTIN_ASSISTANT_AVATAR_SOURCES } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\n\nexport const ASSISTANT_AVATAR_PORTRAIT_SIZE = 128\nexport interface AssistantAvatarPortraitCrop { readonly x: number; readonly y: number; readonly size: number }\nexport interface AssistantAvatarPortraitArea { readonly x: number; readonly y: number; readonly width: number; readonly height: number }\n\n/** 先去掉透明边距,再取上部角色轮廓;不修改原素材,也不识别具体角色 ID。 */\nexport function assistantAvatarPortraitCrop(pixels: Uint8ClampedArray, width: number, height: number): AssistantAvatarPortraitCrop | undefined {\n if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) || width < 1 || height < 1 || width > 512 || height > 512 || pixels.length !== width * height * 4) return undefined\n let left = width, right = -1, top = height, bottom = -1\n for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) {\n if (pixels[(y * width + x) * 4 + 3]! < 24) continue\n left = Math.min(left, x); right = Math.max(right, x); top = Math.min(top, y); bottom = Math.max(bottom, y)\n }\n if (right < left) return undefined\n const upperBottom = Math.min(bottom, top + Math.ceil((bottom - top + 1) * .56))\n let upperLeft = width, upperRight = -1\n for (let y = top; y <= upperBottom; y++) for (let x = left; x <= right; x++) {\n if (pixels[(y * width + x) * 4 + 3]! < 24) continue\n upperLeft = Math.min(upperLeft, x); upperRight = Math.max(upperRight, x)\n }\n const size = Math.max(1, Math.ceil(Math.max(upperRight - upperLeft + 1, upperBottom - top + 1) * 1.08))\n return { x: (upperLeft + upperRight + 1 - size) / 2, y: top - size * .04, size }\n}\n\n/** 图片和动作图集只加载一张现有素材;跨域不允许截图时安静回退。 */\nexport async function createImageAssistantAvatarPortrait(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n return portraitFromImage(assistantAvatarImageSource(model, 'idle'), signal)\n}\nexport async function createBuiltinAssistantAvatarPortrait(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n return portraitFromImage(BUILTIN_ASSISTANT_AVATAR_SOURCES[model.id] ?? BUILTIN_ASSISTANT_AVATAR_SOURCES[BUILTIN_ASSISTANT_AVATAR.id]!, signal)\n}\nexport async function createSpriteAssistantAvatarPortrait(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const image = await loadImage(model.source, signal)\n const rows = model.spriteVersion === 2 ? 11 : 9\n if (image === undefined || image.naturalWidth !== 1536 || image.naturalHeight !== 208 * rows) return undefined\n // v1/v2 的待机首帧均为左上 192×208,绝不能缩放整张图集作为头像。\n return cropImage(image, signal, { x: 0, y: 0, width: 192, height: 208 })\n}\n/** 微调使用完整静态角色或图集首帧,避免在已裁好的小头像上继续损失构图。 */\nexport async function createImageAssistantAvatarPortraitSource(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const image = await loadImage(assistantAvatarImageSource(model, 'idle'), signal)\n return image === undefined ? undefined : imageFrame(image, signal)\n}\nexport async function createBuiltinAssistantAvatarPortraitSource(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n return createImageAssistantAvatarPortraitSource({ ...model, source: BUILTIN_ASSISTANT_AVATAR_SOURCES[model.id] ?? BUILTIN_ASSISTANT_AVATAR_SOURCES[BUILTIN_ASSISTANT_AVATAR.id]! }, signal)\n}\nexport async function createSpriteAssistantAvatarPortraitSource(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const image = await loadImage(model.source, signal)\n if (image === undefined || image.naturalWidth !== 1536 || image.naturalHeight !== 208 * (model.spriteVersion === 2 ? 11 : 9)) return undefined\n return imageFrame(image, signal, { x: 0, y: 0, width: 192, height: 208 })\n}\nasync function imageFrame(image: HTMLImageElement, signal: AbortSignal,\n frame = { x: 0, y: 0, width: image.naturalWidth, height: image.naturalHeight }): Promise<AssistantAvatarPreview | undefined> {\n if (signal.aborted || typeof document === 'undefined') return undefined\n try {\n const scale = Math.min(1, 512 / Math.max(frame.width, frame.height)), canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(frame.width * scale)); canvas.height = Math.max(1, Math.round(frame.height * scale))\n const context = canvas.getContext('2d')\n if (context === null) return undefined\n context.drawImage(image, frame.x, frame.y, frame.width, frame.height, 0, 0, canvas.width, canvas.height)\n return await encodePortrait(canvas, signal)\n } catch { return undefined }\n}\n/** 裁剪组件仅负责交互及坐标;像素输出保留透明背景并统一成 128px。 */\nexport async function cropAssistantAvatarPortrait(source: AssistantAvatarPreview, area: AssistantAvatarPortraitArea,\n signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n if (signal.aborted || ![area.x, area.y, area.width, area.height].every(Number.isFinite)\n || area.width <= 0 || area.height <= 0 || Math.abs(area.width - area.height) > 1\n || area.x < 0 || area.y < 0 || area.x + area.width > source.width + 1 || area.y + area.height > source.height + 1) return undefined\n const url = URL.createObjectURL(source.blob)\n try {\n const image = await loadImage(url, signal)\n if (image === undefined || typeof document === 'undefined') return undefined\n const canvas = document.createElement('canvas'); canvas.width = 128; canvas.height = 128\n const context = canvas.getContext('2d')\n if (context === null) return undefined\n context.imageSmoothingQuality = 'high'\n context.drawImage(image, area.x, area.y, area.width, area.height, 0, 0, 128, 128)\n return await encodePortrait(canvas, signal)\n } catch { return undefined }\n finally { URL.revokeObjectURL(url) }\n}\n/** 初始化裁剪框仍落在角色上部,组件随后负责拖动与缩放。 */\nexport async function initialAssistantAvatarPortraitArea(source: AssistantAvatarPreview, signal: AbortSignal): Promise<AssistantAvatarPortraitArea | undefined> {\n if (signal.aborted) return undefined\n const url = URL.createObjectURL(source.blob)\n try {\n const image = await loadImage(url, signal)\n if (image === undefined || typeof document === 'undefined') return undefined\n const canvas = document.createElement('canvas'); canvas.width = source.width; canvas.height = source.height\n const context = canvas.getContext('2d', { willReadFrequently: true })\n if (context === null) return undefined\n context.drawImage(image, 0, 0, canvas.width, canvas.height)\n const crop = assistantAvatarPortraitCrop(context.getImageData(0, 0, canvas.width, canvas.height).data, canvas.width, canvas.height)\n if (crop === undefined) return undefined\n const size = Math.min(crop.size, canvas.width, canvas.height)\n return { x: Math.max(0, Math.min(canvas.width - size, crop.x)) / canvas.width * 100,\n y: Math.max(0, Math.min(canvas.height - size, crop.y)) / canvas.height * 100, width: size / canvas.width * 100, height: size / canvas.height * 100 }\n } catch { return undefined }\n finally { URL.revokeObjectURL(url) }\n}\nexport async function createAssistantAvatarPortraitFromPreview(preview: AssistantAvatarPreview, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n if (signal.aborted) return undefined\n const url = URL.createObjectURL(preview.blob)\n try { return await portraitFromImage(url, signal) }\n finally { URL.revokeObjectURL(url) }\n}\nasync function portraitFromImage(source: string, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const image = await loadImage(source, signal)\n return image === undefined ? undefined : cropImage(image, signal)\n}\nfunction loadImage(source: string, signal: AbortSignal): Promise<HTMLImageElement | undefined> {\n if (signal.aborted || typeof Image === 'undefined') return Promise.resolve(undefined)\n return new Promise((resolve) => {\n const image = new Image()\n let finished = false\n const finish = (success = false): void => {\n if (finished) return\n finished = true; clearTimeout(timer); signal.removeEventListener('abort', abort)\n image.onload = null; image.onerror = null\n if (!success) image.src = ''\n resolve(success ? image : undefined)\n }\n const abort = (): void => finish()\n const timer = setTimeout(abort, 30000)\n signal.addEventListener('abort', abort, { once: true })\n image.crossOrigin = 'anonymous'\n image.onload = () => finish(image.naturalWidth > 0 && image.naturalHeight > 0)\n image.onerror = abort\n image.src = source\n })\n}\nasync function cropImage(image: HTMLImageElement, signal: AbortSignal,\n frame = { x: 0, y: 0, width: image.naturalWidth, height: image.naturalHeight }): Promise<AssistantAvatarPreview | undefined> {\n if (signal.aborted || typeof document === 'undefined') return undefined\n try {\n // 轮廓分析最多读取 512×512,避免大图和整张动作图集增加头像生成成本。\n const scale = Math.min(1, 512 / Math.max(frame.width, frame.height))\n const sample = document.createElement('canvas')\n sample.width = Math.max(1, Math.round(frame.width * scale)); sample.height = Math.max(1, Math.round(frame.height * scale))\n const context = sample.getContext('2d', { willReadFrequently: true })\n if (context === null) return undefined\n context.drawImage(image, frame.x, frame.y, frame.width, frame.height, 0, 0, sample.width, sample.height)\n const crop = assistantAvatarPortraitCrop(context.getImageData(0, 0, sample.width, sample.height).data, sample.width, sample.height)\n if (crop === undefined) return undefined\n const output = document.createElement('canvas')\n output.width = ASSISTANT_AVATAR_PORTRAIT_SIZE; output.height = ASSISTANT_AVATAR_PORTRAIT_SIZE\n const target = output.getContext('2d')\n if (target === null) return undefined\n target.imageSmoothingEnabled = true; target.imageSmoothingQuality = 'high'\n // 用平移缩放保留越界透明边距,避免 drawImage 对负裁剪坐标缩短头像。\n const zoom = output.width / crop.size\n target.setTransform(zoom, 0, 0, zoom, -crop.x * zoom, -crop.y * zoom)\n target.drawImage(sample, 0, 0)\n return await encodePortrait(output, signal)\n } catch { return undefined }\n}\nfunction encodePortrait(canvas: HTMLCanvasElement, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n return new Promise((resolve) => {\n let settled = false\n const finish = (blob?: Blob | null): void => {\n if (settled) return\n settled = true; clearTimeout(timer); signal.removeEventListener('abort', abort)\n resolve(!signal.aborted && blob !== undefined && blob !== null && blob.size > 0 && blob.size <= 512 * 1024\n ? { blob, width: canvas.width, height: canvas.height } : undefined)\n }\n const abort = (): void => finish()\n const timer = setTimeout(abort, 1000)\n signal.addEventListener('abort', abort, { once: true })\n if (signal.aborted) { finish(); return }\n canvas.toBlob((blob) => finish(blob), 'image/png')\n })\n}\n","import { createElement, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { ASSISTANT_AVATAR_RUNTIME_PATH, assistantAvatarVoicePriority } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarAsset, AssistantAvatarReaction, AssistantAvatarState } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarRendererProps } from './registry.js'\nimport type { AssistantAvatarLoadProgress } from './loading.js'\nimport { readAssistantAvatarCacheStatus } from './cache-status.js'\nimport { captureAssistantAvatarPreview } from './preview-capture.js'\nimport type { AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport { createAssistantAvatarPortraitFromPreview } from './portrait-capture.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\nimport { assistantAvatarRuntimeRevision } from '../../shared/assistant-avatar-engine.js'\n\n/** 仅声明适配器消费的事件契约,编译和默认安装均不依赖外部引擎代码。 */\nexport interface AssistantLive2dEventMap {\n loadstart: (total: number) => void\n loadprogress: (loaded: number, total: number, path: string) => void\n loaded: () => void\n}\nexport interface AssistantLive2dRuntime {\n load(options: { path: string; scale: number; position?: [number, number]; volume: number; logLevel: 'warn' }): Promise<void>\n getMotions(): Record<string, string[]>\n playMotion(group: string, index?: number, priority?: number): void\n getExpressions?(): string[]\n setExpression?(id: string): void\n /** l2d 2.1.1 没有清除接口;缺少此能力时不设置持续表情,避免随机表情假装复位。 */\n clearExpression?(): void\n resize(): void\n destroy(): void\n getCanvas?(): HTMLCanvasElement\n on?<K extends keyof AssistantLive2dEventMap>(event: K, listener: AssistantLive2dEventMap[K]): unknown\n}\ninterface AssistantLive2dModule { init(canvas: HTMLCanvasElement): AssistantLive2dRuntime | null }\n\n/** 成功共享引擎;失败更换模块 URL,避免浏览器缓存失败的动态导入而无法恢复。 */\nexport class AssistantLive2dModuleLoader {\n private module: Promise<AssistantLive2dModule> | undefined\n private attempt = 0\n private retryAt = 0\n private revision = assistantAvatarRuntimeRevision()\n constructor(private readonly importModule: (url: string) => Promise<AssistantLive2dModule> = (url) => import(/* @vite-ignore */ url),\n private readonly fetchStatus: typeof fetch = (...args) => fetch(...args)) {}\n load(location: string): Promise<AssistantLive2dModule> {\n if (this.revision !== assistantAvatarRuntimeRevision() || (this.retryAt > 0 && Date.now() >= this.retryAt)) {\n this.revision = assistantAvatarRuntimeRevision(); this.module = undefined; this.retryAt = 0\n }\n if (this.module !== undefined) return this.module\n const url = new URL(ASSISTANT_AVATAR_RUNTIME_PATH, location)\n url.searchParams.set('v', '2.1.1')\n const attempt = this.attempt++\n if (attempt > 0) url.searchParams.set('retry', String(attempt))\n const request = withLoadDeadline(this.importModule(url.href), 45000).then((module) => {\n if (typeof module.init !== 'function') throw new Error('avatar_runtime_invalid')\n return module\n }).catch(async (error: unknown) => {\n if (this.module === request) this.retryAt = Date.now() + 30_000\n // 动态 import 的错误不包含 HTTP 状态;只在失败时读取状态,不增加成功加载请求。\n let status: number | undefined\n try { status = (await this.fetchStatus(url, { credentials: 'same-origin', signal: AbortSignal.timeout(5000) })).status }\n catch { /* 状态探测失败时保留最初的引擎错误。 */ }\n if (status === 503) throw new Error('avatar_runtime_unavailable')\n if (status !== undefined && status !== 200) throw new Error(`avatar_runtime_http_${status}`)\n throw error\n })\n this.module = request\n return request\n }\n}\nconst runtimeModuleLoader = new AssistantLive2dModuleLoader()\n\n/** 固定同源独立 ESM,只在用户选择 Live2D 时加载;不进入主 Client bundle。 */\nfunction loadLive2dModule(): Promise<AssistantLive2dModule> {\n return runtimeModuleLoader.load(window.location.href)\n}\n\n/** l2d 某些下载失败只记录日志而不拒绝 Promise,必须限制永久等待。 */\nasync function withLoadDeadline<T>(task: Promise<T>, timeoutMs: number,\n observeActivity?: (refresh: (() => void) | undefined) => void): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([task, new Promise<never>((_resolve, reject) => {\n const refresh = (): void => {\n clearTimeout(timer)\n timer = setTimeout(() => reject(new Error('avatar_load_timeout')), timeoutMs)\n }\n observeActivity?.(refresh)\n refresh()\n })])\n } finally { clearTimeout(timer); observeActivity?.(undefined) }\n}\n\n/** 参考上游 load/setState/resize/destroy;旧加载完成不能复活已销毁实例。 */\nexport class AssistantLive2dController {\n private disposed = false\n private state: AssistantAvatarState = 'idle'\n private reaction: AssistantAvatarReaction | undefined\n private appliedExpression: string | undefined\n private appliedMotion: string | undefined\n private loaded = false\n private loadConfirmed = false\n private cancelLoad: (() => void) | undefined\n private refreshDeadline: (() => void) | undefined\n private report: ((progress: AssistantAvatarLoadProgress) => void) | undefined\n constructor(private readonly runtime: AssistantLive2dRuntime, private readonly motionGroups?: AssistantAvatarAsset['motionGroups'],\n private readonly options?: AssistantAvatarAsset['live2d'], report?: (progress: AssistantAvatarLoadProgress) => void,\n private readonly timeoutMs = 45000,\n private readonly reactions?: Pick<AssistantAvatarAsset, 'reactionMotionGroups' | 'reactionExpressions'>) {\n this.report = report\n runtime.on?.('loadstart', (total) => {\n if (this.disposed) return\n this.refreshDeadline?.()\n this.report?.({ phase: 'resources', loaded: 0, total })\n })\n runtime.on?.('loadprogress', (loaded, total) => {\n if (this.disposed) return\n this.refreshDeadline?.()\n this.report?.({ phase: total > 0 && loaded >= total ? 'rendering' : 'resources', loaded, total })\n })\n runtime.on?.('loaded', () => { if (!this.disposed) this.loadConfirmed = true })\n }\n async load(source: string): Promise<boolean> {\n if (this.disposed) return false\n this.loadConfirmed = false\n try {\n const operation = this.runtime.load({ path: source, scale: this.options?.scale ?? 1, volume: 0, logLevel: 'warn',\n ...(this.options?.position === undefined ? {} : { position: [...this.options.position] as [number, number] }) })\n .then(() => {\n if (this.disposed) { this.runtime.destroy(); return false }\n // 真实引擎可能静默返回;只有 loaded 事件才证明初始化成功。\n if (this.runtime.on !== undefined && !this.loadConfirmed) throw new Error('avatar_model_not_loaded')\n return true\n }, (error: unknown) => { if (this.disposed) { this.runtime.destroy(); return false } throw error })\n const cancelled = new Promise<false>((resolve) => { this.cancelLoad = () => resolve(false) })\n // 大模型持续有文件进度时继续等待,只对长时间没有进展的加载超时。\n if (!await withLoadDeadline(Promise.race([operation, cancelled]), this.timeoutMs, (refresh) => { this.refreshDeadline = refresh })) return false\n this.loaded = true\n this.setState(this.state)\n return true\n } catch (error) { this.dispose(); throw error }\n finally { this.cancelLoad = undefined }\n }\n setState(state: AssistantAvatarState): void {\n if (this.disposed) return\n this.state = state\n if (!this.loaded) return\n this.apply()\n }\n setReaction(reaction: AssistantAvatarReaction | undefined): void {\n if (this.disposed || this.reaction === reaction) return\n this.reaction = reaction\n if (this.loaded) this.apply()\n }\n private apply(): void {\n const state = this.state\n const groups = Object.keys(this.runtime.getMotions())\n const desired = state === 'speaking' ? /talk|speak/iu : state === 'thinking' ? /think|work/iu\n : state === 'error' ? /fail|error|sad/iu : state === 'listening' || state === 'waiting' ? /listen|wait/iu : /idle/iu\n const configured = this.motionGroups?.[state]\n const reactionMotion = this.reaction === undefined || assistantAvatarVoicePriority(state) ? undefined : this.reactions?.reactionMotionGroups?.[this.reaction]\n const group = typeof reactionMotion === 'string' && groups.includes(reactionMotion) ? reactionMotion\n : configured !== undefined && groups.includes(configured) ? configured\n : groups.find((name) => desired.test(name)) ?? groups.find((name) => /idle/iu.test(name))\n if (group !== undefined && group !== this.appliedMotion) { this.runtime.playMotion(group, undefined, 2); this.appliedMotion = group }\n this.applyExpression()\n }\n private applyExpression(): void {\n const runtime = this.runtime\n // 完整能力与模型声明同时成立才应用;当前引擎不能清除时使用角标/动作。\n if (typeof runtime.getExpressions !== 'function' || typeof runtime.setExpression !== 'function' || typeof runtime.clearExpression !== 'function') return\n try {\n const requested = this.reaction === undefined || assistantAvatarVoicePriority(this.state)\n ? undefined : this.reactions?.reactionExpressions?.[this.reaction]\n const next = requested !== undefined && runtime.getExpressions().includes(requested) ? requested : undefined\n if (next === this.appliedExpression) return\n if (next === undefined) runtime.clearExpression()\n else runtime.setExpression(next)\n this.appliedExpression = next\n } catch { /* 可选表情能力失败时保留语音动作和角标,不关闭形象。 */ }\n }\n resize(): void { if (!this.disposed && this.loaded) this.runtime.resize() }\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n // 上游只有 on,没有 off;清空回调引用并隔离迟到事件,避免持有旧 React 插槽。\n this.report = undefined\n if (this.appliedExpression !== undefined) { try { this.runtime.clearExpression?.() } catch { /* 销毁仍继续。 */ } }\n this.cancelLoad?.()\n this.runtime.destroy()\n }\n}\n\n/** 没有已绘制预览时只生成一次头像;捕获后立即销毁临时 WebGL 实例。 */\nexport async function createLive2dAssistantAvatarPortrait(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const preview = await createLive2dAssistantAvatarPortraitSource(model, signal)\n return preview === undefined ? undefined : createAssistantAvatarPortraitFromPreview(preview, signal)\n}\n/** 编辑器复用同一静态帧来源,临时实例的销毁仍由适配器统一完成。 */\nexport async function createLive2dAssistantAvatarPortraitSource(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n if (signal.aborted || typeof document === 'undefined') return undefined\n const module = await loadLive2dModule()\n if (signal.aborted) return undefined\n const canvas = document.createElement('canvas')\n canvas.width = 512; canvas.height = 555\n canvas.style.cssText = 'position:fixed;left:-10000px;top:0;width:256px;height:277.5px;pointer-events:none;opacity:0'\n canvas.setAttribute('aria-hidden', 'true')\n document.body.appendChild(canvas)\n let controller: AssistantLive2dController | undefined\n const abort = (): void => controller?.dispose()\n try {\n const runtime = module.init(canvas)\n if (runtime === null) return undefined\n controller = new AssistantLive2dController(runtime, model.motionGroups, model.live2d)\n signal.addEventListener('abort', abort, { once: true })\n if (signal.aborted || !await controller.load(model.source) || signal.aborted) return undefined\n return await captureAssistantAvatarPreview(runtime.getCanvas?.() ?? canvas, signal)\n } finally { signal.removeEventListener('abort', abort); controller?.dispose(); canvas.remove() }\n}\n\nexport function Live2dAssistantAvatar({ model, state, reaction, size, onError, onLoadProgress, diagnostics = false, onPreview }: AssistantAvatarRendererProps): ReactElement {\n const configKey = JSON.stringify([model.motionGroups, model.live2d, model.reactionMotionGroups, model.reactionExpressions])\n // 设置归一化会复制 JSON;等值映射不能因为父组件刷新而重载整个 WebGL 模型。\n const config = useMemo(() => ({ motionGroups: model.motionGroups, options: model.live2d, reactionMotionGroups: model.reactionMotionGroups, reactionExpressions: model.reactionExpressions }), [configKey])\n const canvas = useRef<HTMLCanvasElement | null>(null)\n const controller = useRef<AssistantLive2dController | undefined>(undefined)\n const currentState = useRef(state)\n currentState.current = state\n const currentReaction = useRef(reaction)\n currentReaction.current = reaction\n const [visible, setVisible] = useState(() => typeof document === 'undefined' || !document.hidden)\n useEffect(() => {\n const refresh = (): void => setVisible(!document.hidden)\n document.addEventListener('visibilitychange', refresh)\n return () => document.removeEventListener('visibilitychange', refresh)\n }, [])\n useEffect(() => {\n const target = canvas.current\n if (target === null || !visible) return undefined\n let disposed = false\n let instance: AssistantLive2dController | undefined\n const previewController = new AbortController()\n const started = diagnostics ? performance.now() : 0\n let progress: AssistantAvatarLoadProgress = { phase: 'engine' }\n const report = (next: AssistantAvatarLoadProgress): void => {\n if (disposed) return\n if (!diagnostics) { onLoadProgress?.(next); return }\n const elapsedMs = performance.now() - started\n progress = { ...progress, ...next, elapsedMs,\n ...(next.phase === 'rendering' && progress.resourcesMs === undefined ? { resourcesMs: elapsedMs } : {}) }\n onLoadProgress?.(progress)\n }\n report(progress)\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(() => instance?.resize())\n observer?.observe(target)\n // 正式环境不启动缓存诊断,也不等待它;Stage0 才采集真实前后快照。\n void Promise.all([loadLive2dModule(), diagnostics ? readAssistantAvatarCacheStatus(model.source, window.location.href) : undefined]).then(async ([module, before]) => {\n if (disposed) return\n report({ phase: 'resources', ...(before === undefined ? {} : { cacheBefore: before }) })\n const runtime = module.init(target)\n if (runtime === null) throw new Error('avatar_webgl_unavailable')\n instance = new AssistantLive2dController(runtime, config.motionGroups, config.options, report, 45000, {\n ...(config.reactionMotionGroups === undefined ? {} : { reactionMotionGroups: config.reactionMotionGroups }),\n ...(config.reactionExpressions === undefined ? {} : { reactionExpressions: config.reactionExpressions }) })\n controller.current = instance\n instance.setState(currentState.current)\n instance.setReaction(currentReaction.current)\n if (!await instance.load(model.source) || disposed) return\n if (onPreview !== undefined) {\n // 引擎 loaded 时首帧可能还未绘制;等待有效绘制后才替换本地静态预览。\n const preview = await captureAssistantAvatarPreview(runtime.getCanvas?.() ?? target, previewController.signal)\n if (disposed) return\n if (preview !== undefined) onPreview(preview)\n }\n report({ phase: 'ready' })\n if (!diagnostics) return\n // 加载已完成,诊断不推迟角色显示;保留真实完成耗时,排除诊断响应时间。\n const finished = progress\n const after = await readAssistantAvatarCacheStatus(model.source, window.location.href)\n if (!disposed && after !== undefined) {\n progress = { ...finished, cacheAfter: after }\n onLoadProgress?.(progress)\n }\n }).catch((error: unknown) => { if (!disposed) onError(error instanceof Error ? error.message : String(error)) })\n return () => { disposed = true; previewController.abort(); observer?.disconnect(); instance?.dispose(); controller.current = undefined }\n }, [model.source, config, visible, onError, onLoadProgress, diagnostics, onPreview])\n useEffect(() => { controller.current?.setState(state) }, [state])\n useEffect(() => { controller.current?.setReaction(reaction) }, [reaction])\n return createElement('canvas', { ref: canvas, width: Math.round(size * 2), height: Math.round(size * 208 / 192 * 2), 'aria-hidden': true,\n style: { width: size, height: 'auto', aspectRatio: '192 / 208', maxWidth: '100%', display: 'block' } })\n}\n","/** 所有形象适配器与渲染器共用稳定注册快照;注销只清理自己的一代。 */\nexport class AssistantAvatarRegistration<T extends { readonly id: string }> {\n private readonly entries = new Map<string, T>()\n private readonly reserved: Set<string>\n private readonly listeners = new Set<() => void>()\n private snapshot: readonly T[]\n constructor(builtins: readonly T[] = []) {\n for (const entry of builtins) this.entries.set(entry.id, entry)\n this.reserved = new Set(this.entries.keys())\n this.snapshot = Object.freeze([...this.entries.values()])\n }\n readonly subscribe = (listener: () => void): (() => void) => { this.listeners.add(listener); return () => { this.listeners.delete(listener) } }\n readonly getSnapshot = (): readonly T[] => this.snapshot\n get(id: string): T | undefined { return this.entries.get(id) }\n register(entry: T): () => void {\n if (!/^[A-Za-z][A-Za-z0-9_-]{0,79}$/u.test(entry.id) || this.reserved.has(entry.id)) throw new TypeError('形象扩展 ID 无效或占用内置名称')\n if (this.entries.has(entry.id)) throw new TypeError(`形象扩展已注册: ${entry.id}`)\n this.entries.set(entry.id, entry); this.emit()\n return () => {\n if (this.entries.get(entry.id) !== entry) return\n this.entries.delete(entry.id); this.emit()\n }\n }\n private emit(): void { this.snapshot = Object.freeze([...this.entries.values()]); for (const listener of this.listeners) listener() }\n}\n","import type { ComponentType } from 'react'\nimport type { AssistantAvatarModel, AssistantAvatarReaction, AssistantAvatarState, AssistantAvatarSurface } from '../../shared/assistant-avatar.js'\nimport type { CodingNsClientServices } from '../features/types.js'\nimport { BuiltinAssistantAvatar } from './builtin.js'\nimport { ImageAssistantAvatar } from './image.js'\nimport { SpriteSheetAssistantAvatar } from './spritesheet.js'\nimport { Live2dAssistantAvatar, createLive2dAssistantAvatarPortrait, createLive2dAssistantAvatarPortraitSource } from './live2d.js'\nimport { createBuiltinAssistantAvatarPortrait, createImageAssistantAvatarPortrait, createSpriteAssistantAvatarPortrait,\n createBuiltinAssistantAvatarPortraitSource, createImageAssistantAvatarPortraitSource, createSpriteAssistantAvatarPortraitSource } from './portrait-capture.js'\nimport { AssistantAvatarRegistration } from './registration.js'\nimport type { AssistantAvatarLoadProgress } from './loading.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\n\nexport interface AssistantAvatarRendererProps {\n readonly model: AssistantAvatarModel\n readonly state: AssistantAvatarState\n readonly reaction?: AssistantAvatarReaction\n readonly surface: AssistantAvatarSurface\n readonly size: number\n readonly onError: (message: string) => void\n readonly onLoadProgress?: (progress: AssistantAvatarLoadProgress) => void\n /** 统一插槽在 Stage0 开启诊断;正式环境不应采集缓存快照和耗时。 */\n readonly diagnostics?: boolean\n /** 提交成功绘制的透明预览;存储与显示生命周期由统一插槽管理。 */\n readonly onPreview?: (preview: AssistantAvatarPreview) => void\n}\nexport interface AssistantAvatarRenderer {\n readonly id: string\n readonly name?: string\n readonly labelKey?: string\n readonly component: ComponentType<AssistantAvatarRendererProps>\n /** 只有主动报告进度的渲染器才自动显示占位,旧扩展无需修改。 */\n readonly reportsLoading?: true\n readonly initialLoadPhase?: 'engine' | 'resources'\n readonly reportsCache?: true\n /** 支持预览的渲染器声明稳定版本;构图或捕获策略变化时更新版本以失效缓存。 */\n readonly previewVersion?: string\n /** 自动头像由渲染适配器提供;返回静态方形 PNG,旧扩展可不实现。 */\n readonly portraitVersion?: string\n readonly createPortrait?: (model: AssistantAvatarModel, signal: AbortSignal) => Promise<AssistantAvatarPreview | undefined>\n /** 提供可微调的完整静态帧;未实现的扩展仍可裁剪已有头像。 */\n readonly createPortraitSource?: (model: AssistantAvatarModel, signal: AbortSignal) => Promise<AssistantAvatarPreview | undefined>\n}\n\n/** 与语音适配器一样按服务实例隔离,页面卸载不会污染另一份 Client。 */\nexport class AssistantAvatarRegistry extends AssistantAvatarRegistration<AssistantAvatarRenderer> {\n constructor() {\n super([\n { id: 'builtin', component: BuiltinAssistantAvatar, reportsLoading: true, portraitVersion: '1', createPortrait: createBuiltinAssistantAvatarPortrait, createPortraitSource: createBuiltinAssistantAvatarPortraitSource },\n { id: 'image', labelKey: 'avatar.type.image', component: ImageAssistantAvatar, reportsLoading: true, portraitVersion: '1', createPortrait: createImageAssistantAvatarPortrait, createPortraitSource: createImageAssistantAvatarPortraitSource },\n { id: 'spritesheet', labelKey: 'avatar.type.spritesheet', component: SpriteSheetAssistantAvatar, reportsLoading: true, portraitVersion: '1', createPortrait: createSpriteAssistantAvatarPortrait, createPortraitSource: createSpriteAssistantAvatarPortraitSource },\n { id: 'live2d', labelKey: 'avatar.type.live2d', component: Live2dAssistantAvatar,\n reportsLoading: true, initialLoadPhase: 'engine', reportsCache: true, previewVersion: '1', portraitVersion: '1', createPortrait: createLive2dAssistantAvatarPortrait, createPortraitSource: createLive2dAssistantAvatarPortraitSource },\n ])\n }\n}\n\nconst registries = new WeakMap<CodingNsClientServices, AssistantAvatarRegistry>()\n/** 配置草稿借用正式渲染器注册表,保留第三方扩展。 */\nexport function bindAssistantAvatarRegistry(services: CodingNsClientServices, registry: AssistantAvatarRegistry): void { registries.set(services, registry) }\nexport function getAssistantAvatarRegistry(services: CodingNsClientServices): AssistantAvatarRegistry {\n let registry = registries.get(services)\n if (registry === undefined) { registry = new AssistantAvatarRegistry(); registries.set(services, registry) }\n return registry\n}\n/** 扩展模块应将返回的注销函数登记到自己的 context.resources。 */\nexport function registerAssistantAvatarRenderer(services: CodingNsClientServices, renderer: AssistantAvatarRenderer): () => void {\n return getAssistantAvatarRegistry(services).register(renderer)\n}\n","import { createElement } from 'react'\nimport type { ReactElement } from 'react'\nimport type { AssistantAvatarCacheStatus } from '../../shared/assistant-avatar-resources.js'\nimport type { CodingNsTranslator } from '../locale.js'\nimport { dshThemeColor } from '../theme.js'\nimport { uiFontSize } from '../font-scale.js'\n\n/** 统一加载反馈;可选字段只在渲染器有真实证据时提供。 */\nexport interface AssistantAvatarLoadProgress {\n readonly phase: 'engine' | 'resources' | 'rendering' | 'ready'\n readonly loaded?: number\n readonly total?: number\n readonly elapsedMs?: number\n readonly resourcesMs?: number\n readonly cacheBefore?: AssistantAvatarCacheStatus\n readonly cacheAfter?: AssistantAvatarCacheStatus\n}\n\nconst loadingStyle = `\n@keyframes codingns-avatar-orbit { to { transform: rotate(360deg); } }\n@keyframes codingns-avatar-breathe { 50% { transform: scale(1.08); opacity: .65; } }\n@keyframes codingns-avatar-shimmer { from { transform: translateX(-130%); } to { transform: translateX(330%); } }\n[data-codingns-avatar-loading] .codingns-avatar-halo { animation: codingns-avatar-breathe 2.6s ease-in-out infinite; }\n[data-codingns-avatar-loading] .codingns-avatar-orbit { animation: codingns-avatar-orbit 3s linear infinite; }\n[data-codingns-avatar-loading] .codingns-avatar-indeterminate { animation: codingns-avatar-shimmer 1.6s ease-in-out infinite; }\n@media (prefers-reduced-motion: reduce) {\n [data-codingns-avatar-loading] .codingns-avatar-halo,\n [data-codingns-avatar-loading] .codingns-avatar-orbit,\n [data-codingns-avatar-loading] .codingns-avatar-indeterminate { animation: none; }\n}`\n\n/** 百分比只根据已经完成的文件计数生成;未知总数保留循环动画。 */\nexport function assistantAvatarLoadPercent(progress: AssistantAvatarLoadProgress): number | undefined {\n if (progress.total === undefined || progress.loaded === undefined || !Number.isFinite(progress.total)\n || !Number.isFinite(progress.loaded) || progress.total <= 0) return undefined\n return Math.round(Math.min(1, Math.max(0, progress.loaded / progress.total)) * 100)\n}\n\n/** 计数只在同一缓存代际内可相减,Host 重建后不能把相同数字解释成下载为零。 */\nfunction newHostDownloads(progress: AssistantAvatarLoadProgress): number | undefined {\n const before = progress.cacheBefore\n const after = progress.cacheAfter\n if (before === undefined || after === undefined || after.generation !== before.generation || after.downloads < before.downloads) return undefined\n return after.downloads - before.downloads\n}\n\nfunction cacheText(progress: AssistantAvatarLoadProgress, t: CodingNsTranslator): string {\n const before = progress.cacheBefore\n if (before === undefined) return t('avatar.cacheUnknown')\n const initial = t('avatar.cacheBefore', { cached: before.cached, total: before.total })\n const count = newHostDownloads(progress)\n return count === undefined ? initial : `${initial} · ${t('avatar.cacheDownloads', { count })}`\n}\n\n/** 透明光晕、轨道光点与细进度条,直接复用插槽尺寸和宿主主题。 */\nexport function AssistantAvatarLoading({ progress, size, t, showCache = false, diagnostics = false, preview = false, animationOnly = false }: {\n readonly progress: AssistantAvatarLoadProgress; readonly size: number; readonly t: CodingNsTranslator\n readonly showCache?: boolean; readonly diagnostics?: boolean; readonly preview?: boolean\n /** 临时预览仅显示加载动画,下载与引擎准备均不显示文字或进度条。 */\n readonly animationOnly?: boolean\n}): ReactElement | null {\n // 即使第三方渲染器仍上报诊断字段,正式环境也不能显示摘要或隐藏的调试 tooltip。\n showCache = !animationOnly && diagnostics && showCache\n if (progress.phase === 'ready' && (!diagnostics || animationOnly)) return null\n const percent = assistantAvatarLoadPercent(progress)\n const compact = size < 120\n const ready = progress.phase === 'ready'\n const elapsed = progress.elapsedMs === undefined ? '' : t('avatar.loadElapsed', { seconds: (progress.elapsedMs / 1000).toFixed(2) })\n const shortElapsed = progress.elapsedMs === undefined ? '' : t('avatar.loadElapsedCompact', { seconds: (progress.elapsedMs / 1000).toFixed(2) })\n const details = [showCache ? cacheText(progress, t) : '', elapsed,\n progress.resourcesMs === undefined ? '' : t('avatar.loadResourcesElapsed', { seconds: (progress.resourcesMs / 1000).toFixed(2) })].filter(Boolean).join(' · ')\n const newDownloads = newHostDownloads(progress)\n if (ready) return createElement('span', { 'data-codingns-avatar-load-summary': true, title: details,\n style: { position: 'absolute', bottom: 0, maxWidth: '100%', fontSize: uiFontSize(10), lineHeight: 1.4, color: dshThemeColor.labelSecondary,\n textAlign: 'center', background: dshThemeColor.cardBackground, borderRadius: 8, padding: '2px 6px' } },\n showCache ? createElement('span', { style: { display: 'block' } }, progress.cacheBefore === undefined ? t('avatar.cacheUnknown')\n : t(compact ? 'avatar.cacheTiny' : 'avatar.cacheShort', { cached: progress.cacheBefore.cached, total: progress.cacheBefore.total })) : null,\n createElement('span', { style: { display: 'block' } }, [showCache && newDownloads !== undefined\n ? t(compact ? 'avatar.cacheDownloadsTiny' : 'avatar.cacheDownloadsCompact', { count: newDownloads }) : '',\n compact && showCache && newDownloads !== undefined ? '' : shortElapsed].filter(Boolean).join(' · ')))\n const phaseText = progress.phase === 'engine' ? t('avatar.loadEngine') : progress.phase === 'rendering' ? t('avatar.loadRendering') : t('avatar.loading')\n const orbSize = preview ? 14 : Math.min(80, size * (compact ? .3 : .46))\n const cache = progress.cacheBefore\n const cacheLabel = compact ? cache === undefined ? t('avatar.cacheUnknownCompact') : t('avatar.cacheTiny', { cached: cache.cached, total: cache.total }) : cacheText(progress, t)\n return createElement('div', { 'data-codingns-avatar-loading': progress.phase, role: 'status', 'aria-label': phaseText,\n ...(showCache ? { title: cacheText(progress, t) } : {}),\n style: { position: 'absolute', inset: preview ? 'auto 0 0' : 0, display: 'flex', flexDirection: 'column', justifyContent: 'center', alignItems: 'center', gap: compact || preview ? 4 : 10,\n ...(preview ? { padding: '5px 4px', borderRadius: 10, background: dshThemeColor.cardBackground } : {}),\n pointerEvents: 'none', color: dshThemeColor.labelSecondary, textAlign: 'center' } },\n createElement('style', null, loadingStyle),\n createElement('div', { style: { display: 'flex', flexDirection: preview ? 'row' : 'column', alignItems: 'center', gap: compact || preview ? 4 : 10 } },\n createElement('div', { 'aria-hidden': true, style: { position: 'relative', flexShrink: 0, width: orbSize, height: orbSize, color: dshThemeColor.accent } },\n createElement('div', { className: 'codingns-avatar-halo', style: { position: 'absolute', inset: '-14%', borderRadius: '50%',\n background: 'radial-gradient(circle, rgba(112, 148, 255, .24), rgba(132, 204, 247, .10) 55%, transparent 72%)' } }),\n createElement('div', { className: 'codingns-avatar-orbit', style: { position: 'absolute', inset: 0, borderRadius: '50%', border: '1px solid rgba(112, 148, 255, .20)' } },\n createElement('span', { style: { position: 'absolute', top: -3, left: '50%', width: 6, height: 6, borderRadius: '50%', background: 'currentColor', boxShadow: '0 0 12px rgba(112, 148, 255, .5)' } })),\n createElement('svg', { viewBox: '0 0 64 64', style: { position: 'absolute', inset: '20%', width: '60%', height: '60%' }, fill: 'none' },\n createElement('path', { d: 'M32 9C35 23 41 29 55 32C41 35 35 41 32 55C29 41 23 35 9 32C23 29 29 23 32 9Z', fill: 'currentColor', opacity: .85 }),\n createElement('circle', { cx: 51, cy: 12, r: 3, fill: 'currentColor', opacity: .4 }))),\n animationOnly ? null : createElement('span', { style: { fontSize: compact || preview ? 10 : size < 160 ? 11 : 13, fontWeight: 500 } }, compact || preview ? t('avatar.loadingCompact') : phaseText)),\n animationOnly ? null : createElement('div', { role: 'progressbar', 'aria-label': t('avatar.loadProgress'), 'aria-valuemin': 0, 'aria-valuemax': 100,\n ...(percent === undefined ? {} : { 'aria-valuenow': percent }),\n style: { width: Math.min(130, size * .74), height: 3, flexShrink: 0, borderRadius: 3, overflow: 'hidden', background: 'rgba(112, 148, 255, .15)' } },\n createElement('div', { className: percent === undefined ? 'codingns-avatar-indeterminate' : undefined,\n style: { width: percent === undefined ? '30%' : `${percent}%`, height: '100%', borderRadius: 3,\n background: 'linear-gradient(90deg, #81c9ed, #7791f7)', transition: 'width .2s ease' } })),\n animationOnly ? null : createElement('span', { style: { fontSize: uiFontSize(10), lineHeight: 1.5, padding: '0 6px', maxWidth: '100%' } },\n percent === undefined ? null : `${progress.loaded}/${progress.total} · ${percent}%`,\n showCache ? createElement('span', { style: { display: 'block' } }, cacheLabel) : null))\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { AssistantAvatarModel, AssistantAvatarSurface } from '../../shared/assistant-avatar.js'\nimport { assistantAvatarPreviewKey, assistantAvatarPreviewStore, validAssistantAvatarPreview } from './preview-store.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\n\n/** 插槽拥有读写与 URL 生命周期;渲染器仅提交图像,不接触持久化存储。 */\nexport function useAssistantAvatarPreview(model: AssistantAvatarModel, surface: AssistantAvatarSurface, version: string | undefined) {\n const key = version === undefined ? undefined : assistantAvatarPreviewKey(model, surface, version)\n const [preview, setPreview] = useState<{ key: string; url: string; width: number; height: number } | undefined>()\n const session = useRef<{ key: string; controller: AbortController; url: string | undefined; published: boolean } | undefined>(undefined)\n useEffect(() => {\n setPreview(undefined)\n if (key === undefined) return undefined\n const active = { key, controller: new AbortController(), published: false, url: undefined } as NonNullable<typeof session.current>\n session.current = active\n void assistantAvatarPreviewStore.read(key, active.controller.signal).then((snapshot) => {\n if (snapshot === undefined || active.controller.signal.aborted || active.published) return\n active.url = URL.createObjectURL(snapshot.blob)\n setPreview({ key, url: active.url, width: snapshot.width, height: snapshot.height })\n }).catch(() => undefined)\n return () => { active.controller.abort(); if (active.url !== undefined) URL.revokeObjectURL(active.url); if (session.current === active) session.current = undefined }\n }, [key])\n\n const onPreview = useCallback((snapshot: AssistantAvatarPreview): void => {\n const active = session.current\n if (key === undefined || active?.key !== key || active.controller.signal.aborted || !validAssistantAvatarPreview(snapshot)) return\n active.published = true\n // 不等待落盘才显示动画;新预览可用于同一实例隐藏后再次载入。\n // 已有预览保持同一 DOM 图片直到淡出,避免换 src 解码时在交接帧闪白。\n if (active.url === undefined) {\n try {\n active.url = URL.createObjectURL(snapshot.blob)\n setPreview({ key, url: active.url, width: snapshot.width, height: snapshot.height })\n } catch { /* 临时图片地址不可用不阻断真实形象,也不阻断数据库写入。 */ }\n }\n void assistantAvatarPreviewStore.write(key, model.id, surface, snapshot, active.controller.signal).catch(() => undefined)\n }, [key, model.id, surface])\n const discard = useCallback((stop = false): void => {\n const active = session.current\n if (active === undefined || active.key !== key) return\n active.published = true\n if (stop) active.controller.abort()\n if (active.url !== undefined) URL.revokeObjectURL(active.url)\n active.url = undefined\n setPreview(undefined)\n if (key !== undefined) void assistantAvatarPreviewStore.remove(key).catch(() => undefined)\n }, [key])\n return { preview: preview?.key === key ? preview : undefined, onPreview: version === undefined ? undefined : onPreview, discard }\n}\n","import { ASSISTANT_AVATAR_MAX_MODELS, BUILTIN_ASSISTANT_AVATAR_SOURCES, resolveAssistantAvatarAsset } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarModel, AssistantAvatarSurface } from '../../shared/assistant-avatar.js'\nimport type { CodingNsClientServices } from '../features/types.js'\nimport type { AssistantAvatarRenderer } from './registry.js'\nimport { AssistantAvatarPreviewStore, assistantAvatarPreviewKey, assistantAvatarPreviewStore, validAssistantAvatarPreview } from './preview-store.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\nimport { createAssistantAvatarPortraitFromPreview } from './portrait-capture.js'\n\nexport interface AssistantAvatarPortraitSnapshot { readonly key: string; readonly url?: string }\ntype PortraitStore = Pick<AssistantAvatarPreviewStore, 'read' | 'write' | 'removeModel'>\ninterface PortraitEntry {\n readonly model: AssistantAvatarModel\n readonly asset: AssistantAvatarModel\n renderer: AssistantAvatarRenderer | undefined\n snapshot: AssistantAvatarPortraitSnapshot\n readonly listeners: Set<() => void>\n refs: number\n touched: number\n completed: boolean\n overrideChecked: boolean\n controller: AbortController | undefined\n}\nexport const assistantAvatarPortraitStore = new AssistantAvatarPreviewStore(undefined, undefined, 'codingns-assistant-avatar-portraits')\n/** 用户确认的头像属于本地配置,不按临时预览的 30 天规则失效。 */\nexport const assistantAvatarPortraitOverrideStore = new AssistantAvatarPreviewStore(undefined, undefined,\n 'codingns-assistant-avatar-portrait-overrides', { maxAgeMs: Infinity, maxEntries: ASSISTANT_AVATAR_MAX_MODELS })\n\n/** 头像始终采用对话形象的待机构图,语音状态、名称和显示尺寸不参与缓存键。 */\nexport function assistantAvatarPortraitKey(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined): string {\n const asset = resolveAssistantAvatarAsset(model, 'dialog')\n return JSON.stringify(['portrait', 1, renderer?.previewVersion ?? '', assistantAvatarPreviewKey(model, 'dialog', renderer?.portraitVersion ?? ''),\n asset.renderer === 'builtin' ? BUILTIN_ASSISTANT_AVATAR_SOURCES[model.id] : ''])\n}\nfunction validPortrait(value: unknown): value is AssistantAvatarPreview {\n return validAssistantAvatarPreview(value) && value.width === value.height && value.width <= 256\n}\nfunction sameAsset(a: AssistantAvatarModel, b: AssistantAvatarModel): boolean {\n // 展示位置可以不同,但必须确实使用同一份模型与构图,不能拿桌前版替代全身版头像。\n return assistantAvatarPreviewKey(a, 'dialog', '') === assistantAvatarPreviewKey({ ...b, surfaces: {} }, 'dialog', '')\n}\n\n/** 每个 Client 共用一个任务和临时 URL;多条消息不会创建多个图片或 WebGL 实例。 */\nexport class AssistantAvatarPortraitService {\n private readonly entries = new Map<string, PortraitEntry>()\n private clock = 0\n constructor(private readonly store: PortraitStore = assistantAvatarPortraitStore,\n private readonly previews: Pick<AssistantAvatarPreviewStore, 'read'> = assistantAvatarPreviewStore,\n private readonly crop: typeof createAssistantAvatarPortraitFromPreview = createAssistantAvatarPortraitFromPreview,\n private readonly createUrl: (blob: Blob) => string = (blob) => URL.createObjectURL(blob),\n private readonly revokeUrl: (url: string) => void = (url) => URL.revokeObjectURL(url),\n private readonly overrides: PortraitStore = assistantAvatarPortraitOverrideStore) {}\n\n /** 编辑器仅在用户打开时读取完整静态帧,普通头像订阅不增加素材加载。 */\n async getSource(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const asset = resolveAssistantAvatarAsset(model, 'dialog')\n const manual = await this.overrides.read(assistantAvatarPortraitKey(model, renderer), signal).catch(() => undefined)\n const withArea = (frame: AssistantAvatarPreview): AssistantAvatarPreview => ({ ...frame,\n ...(manual?.cropAreaPercentages === undefined ? {} : { cropAreaPercentages: manual.cropAreaPercentages }) })\n if (renderer?.previewVersion !== undefined) {\n for (const surface of ['dialog', 'floating'] as const) {\n if (!sameAsset(asset, resolveAssistantAvatarAsset(model, surface))) continue\n const frame = await this.previews.read(assistantAvatarPreviewKey(model, surface, renderer.previewVersion), signal).catch(() => undefined)\n if (signal.aborted) return undefined\n if (validAssistantAvatarPreview(frame)) return withArea(frame)\n }\n }\n if (signal.aborted) return undefined\n const frame = await renderer?.createPortraitSource?.(asset, signal)\n if (signal.aborted) return undefined\n if (validAssistantAvatarPreview(frame)) return withArea(frame)\n // 旧扩展只提供头像时仍能微调,不能因此禁用原来的形象。\n const fallback = manual ?? await this.store.read(assistantAvatarPortraitKey(model, renderer), signal)\n // 已裁好的旧扩展头像没有原始坐标空间,不能再次套用原图百分比。\n return fallback === undefined ? undefined : { blob: fallback.blob, width: fallback.width, height: fallback.height }\n }\n\n /** 先确保持久化成功才发布,存储失败和取消都保留当前头像。 */\n async setPortrait(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined,\n preview: AssistantAvatarPreview, signal: AbortSignal): Promise<void> {\n if (!validPortrait(preview)) throw new TypeError('avatar_portrait_invalid')\n signal.throwIfAborted()\n const entry = this.entry(model, renderer), controller = new AbortController()\n entry.controller?.abort(); entry.controller = controller\n const abort = (): void => controller.abort()\n signal.addEventListener('abort', abort, { once: true })\n try {\n const saved = await this.overrides.write(entry.snapshot.key, model.id, 'dialog', preview, controller.signal)\n signal.throwIfAborted()\n if (!saved || entry.controller !== controller || controller.signal.aborted) throw new Error('avatar_portrait_write_failed')\n this.publish(entry, preview); entry.completed = true\n } finally {\n signal.removeEventListener('abort', abort)\n if (entry.controller === controller) entry.controller = undefined\n }\n }\n\n getSnapshot(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined): AssistantAvatarPortraitSnapshot {\n return this.entry(model, renderer).snapshot\n }\n subscribe(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined, listener: () => void): () => void {\n const entry = this.entry(model, renderer)\n entry.listeners.add(listener)\n return () => { entry.listeners.delete(listener); this.trim() }\n }\n retain(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined): () => void {\n const entry = this.entry(model, renderer)\n entry.refs++; entry.touched = ++this.clock\n if (!entry.completed && entry.controller === undefined) this.start(entry)\n return () => {\n entry.refs = Math.max(0, entry.refs - 1)\n if (entry.refs === 0) { entry.controller?.abort(); entry.controller = undefined }\n this.trim()\n }\n }\n\n /** 插槽已绘制的帧优先于临时渲染任务;取消旧任务并隔离迟到结果。 */\n offerPreview(model: AssistantAvatarModel, surface: AssistantAvatarSurface, renderer: AssistantAvatarRenderer, preview: AssistantAvatarPreview): void {\n if (!validAssistantAvatarPreview(preview)) return\n const asset = resolveAssistantAvatarAsset(model, surface)\n for (const entry of this.entries.values()) {\n if (entry.refs === 0 || !entry.overrideChecked || entry.snapshot.url !== undefined || entry.renderer !== renderer || !sameAsset(entry.asset, asset)) continue\n entry.controller?.abort()\n const controller = new AbortController()\n entry.controller = controller; entry.completed = false\n void this.crop(preview, controller.signal).then((portrait) => this.commit(entry, controller, portrait)).catch(() => undefined)\n .finally(() => this.finish(entry, controller))\n }\n }\n removeModel(id: string): void {\n for (const entry of this.entries.values()) {\n if (entry.model.id !== id) continue\n entry.controller?.abort(); entry.controller = undefined; entry.completed = false\n if (entry.snapshot.url !== undefined) this.revokeUrl(entry.snapshot.url)\n entry.snapshot = { key: entry.snapshot.key }\n for (const listener of entry.listeners) listener()\n if (entry.refs === 0 && entry.listeners.size === 0) this.entries.delete(entry.snapshot.key)\n }\n void this.store.removeModel(id).catch(() => undefined)\n void this.overrides.removeModel(id).catch(() => undefined)\n }\n\n /** 配置窗口销毁时回收仅供本地预览使用的资源地址。 */\n dispose(): void { for (const entry of this.entries.values()) { entry.controller?.abort(); if (entry.snapshot.url !== undefined) this.revokeUrl(entry.snapshot.url) }; this.entries.clear() }\n\n private entry(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined): PortraitEntry {\n const key = assistantAvatarPortraitKey(model, renderer)\n let entry = this.entries.get(key)\n if (entry === undefined) {\n entry = { model, asset: resolveAssistantAvatarAsset(model, 'dialog'), renderer, snapshot: { key }, listeners: new Set(),\n refs: 0, touched: ++this.clock, completed: false, overrideChecked: false, controller: undefined }\n this.entries.set(key, entry)\n } else if (entry.renderer !== renderer) {\n entry.controller?.abort(); entry.controller = undefined; entry.renderer = renderer\n entry.completed = entry.snapshot.url !== undefined\n }\n return entry\n }\n private start(entry: PortraitEntry): void {\n const controller = new AbortController()\n entry.controller = controller\n void this.load(entry, controller.signal).then((preview) => this.commit(entry, controller, preview)).catch(() => undefined)\n .finally(() => this.finish(entry, controller))\n }\n private async load(entry: PortraitEntry, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const manual = await this.overrides.read(entry.snapshot.key, signal).catch(() => undefined)\n if (signal.aborted || validPortrait(manual)) return signal.aborted ? undefined : manual\n entry.overrideChecked = true\n const cached = await this.store.read(entry.snapshot.key, signal).catch(() => undefined)\n if (signal.aborted || validPortrait(cached)) return signal.aborted ? undefined : cached\n const version = entry.renderer?.previewVersion\n if (version !== undefined) {\n for (const surface of ['dialog', 'floating'] as const) {\n if (!sameAsset(entry.asset, resolveAssistantAvatarAsset(entry.model, surface))) continue\n const frame = await this.previews.read(assistantAvatarPreviewKey(entry.model, surface, version), signal).catch(() => undefined)\n if (signal.aborted) return undefined\n if (frame === undefined) continue\n const portrait = await this.crop(frame, signal)\n if (portrait !== undefined || signal.aborted) return portrait\n }\n }\n return signal.aborted ? undefined : entry.renderer?.createPortrait?.(entry.asset, signal)\n }\n private commit(entry: PortraitEntry, controller: AbortController, preview: AssistantAvatarPreview | undefined): void {\n if (entry.controller !== controller || controller.signal.aborted || !validPortrait(preview)) return\n this.publish(entry, preview)\n void this.store.write(entry.snapshot.key, entry.model.id, 'dialog', preview, controller.signal).catch(() => undefined)\n }\n private publish(entry: PortraitEntry, preview: AssistantAvatarPreview): void {\n const previous = entry.snapshot.url, url = this.createUrl(preview.blob)\n entry.snapshot = { key: entry.snapshot.key, url }; entry.touched = ++this.clock\n for (const listener of entry.listeners) listener()\n if (previous !== undefined) this.revokeUrl(previous)\n }\n private finish(entry: PortraitEntry, controller: AbortController): void {\n if (entry.controller !== controller) return\n entry.controller = undefined; entry.completed = !controller.signal.aborted\n this.trim()\n }\n private trim(): void {\n // 已使用头像可复用八个;只回收没有订阅者的 URL,避免正在显示的图片失效。\n const idle = [...this.entries.values()].filter((entry) => entry.refs === 0 && entry.listeners.size === 0).sort((a, b) => b.touched - a.touched)\n for (const entry of idle.slice(8)) {\n entry.controller?.abort()\n if (entry.snapshot.url !== undefined) this.revokeUrl(entry.snapshot.url)\n this.entries.delete(entry.snapshot.key)\n }\n }\n}\nconst services = new WeakMap<CodingNsClientServices, AssistantAvatarPortraitService>()\nexport function bindAssistantAvatarPortraitService(client: CodingNsClientServices, service: AssistantAvatarPortraitService): void { services.set(client, service) }\nexport function getAssistantAvatarPortraitService(client: CodingNsClientServices): AssistantAvatarPortraitService {\n let service = services.get(client)\n if (service === undefined) { service = new AssistantAvatarPortraitService(); services.set(client, service) }\n return service\n}\n","import { Component, createElement, useCallback, useRef, useState, useSyncExternalStore } from 'react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { AssistantAvatarModel, AssistantAvatarReaction, AssistantAvatarState, AssistantAvatarSurface } from '../../shared/assistant-avatar.js'\nimport { BUILTIN_ASSISTANT_AVATAR, resolveAssistantAvatarAsset } from '../../shared/assistant-avatar.js'\nimport type { CodingNsClientServices } from '../features/types.js'\nimport { useCodingNsTranslator } from '../locale.js'\nimport { dshSettingsHelpStyle, dshThemeColor } from '../theme.js'\nimport { BuiltinAssistantAvatar } from './builtin.js'\nimport { AssistantAvatarReactionBadge } from './reaction-badge.js'\nimport { getAssistantAvatarRegistry } from './registry.js'\nimport type { AssistantAvatarRenderer } from './registry.js'\nimport { AssistantAvatarLoading } from './loading.js'\nimport type { AssistantAvatarLoadProgress } from './loading.js'\nimport { useAssistantAvatarPreview } from './preview.js'\nimport { getAssistantAvatarPortraitService } from './portrait-service.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\nimport { assistantAvatarPreviewKey } from './preview-store.js'\nimport { assistantAvatarRuntimeRevision, subscribeAssistantAvatarRuntime } from '../../shared/assistant-avatar-engine.js'\n\nexport interface AssistantAvatarSlotProps {\n readonly services: CodingNsClientServices\n readonly model: AssistantAvatarModel\n readonly state: AssistantAvatarState\n readonly reaction?: AssistantAvatarReaction\n readonly surface: AssistantAvatarSurface\n readonly size: number\n /** 创建预览可隐藏开发诊断,不影响其他插槽的 Stage0 诊断行为。 */\n readonly showDiagnostics?: boolean\n /** 临时预览不写持久预览或头像缓存,失败时也不展示另一个内置角色。 */\n readonly transient?: boolean\n}\n\n/** 两个容器只调用这个插槽;渲染错误始终被限制在形象区域。 */\nexport function AssistantAvatarSlot(props: AssistantAvatarSlotProps): ReactElement {\n const model = resolveAssistantAvatarAsset(props.model, props.surface)\n const registry = getAssistantAvatarRegistry(props.services)\n const readRenderer = useCallback(() => registry.get(model.renderer), [registry, model.renderer])\n const renderer = useSyncExternalStore(registry.subscribe, readRenderer, readRenderer)\n const runtimeRevision = useSyncExternalStore(subscribeAssistantAvatarRuntime, assistantAvatarRuntimeRevision, assistantAvatarRuntimeRevision)\n const generation = useRef({ renderer, value: 0 })\n // 扩展修复后重新注册同一个 ID,也应恢复渲染,不能永久停在旧错误边界里。\n if (generation.current.renderer !== renderer) generation.current = { renderer, value: generation.current.value + 1 }\n // 安装完成重建 Live2D 的错误边界和内容状态,其他渲染器保持现有实例。\n return createElement(AvatarErrorBoundary, { key: `${JSON.stringify(props.model)}:${generation.current.value}:${model.renderer === 'live2d' ? runtimeRevision : 0}`, fallback: createElement(AvatarFallback, props) },\n createElement(AvatarContent, { ...props, model, renderer }))\n}\n\nfunction AvatarContent({ services, model, state, reaction, surface, size, renderer, showDiagnostics, transient }: AssistantAvatarSlotProps & { readonly renderer: AssistantAvatarRenderer | undefined }): ReactElement {\n const [error, setError] = useState('')\n const [progress, setProgress] = useState<AssistantAvatarLoadProgress | undefined>(() => renderer?.reportsLoading === true\n ? { phase: renderer.initialLoadPhase ?? 'resources' } : undefined)\n const { preview, onPreview, discard } = useAssistantAvatarPreview(model, surface, transient ? undefined : renderer?.previewVersion)\n const previewKey = assistantAvatarPreviewKey(model, surface, renderer?.previewVersion ?? '')\n const publishPreview = useCallback((snapshot: AssistantAvatarPreview): void => {\n onPreview?.(snapshot)\n if (!transient && renderer !== undefined) getAssistantAvatarPortraitService(services).offerPreview(model, surface, renderer, snapshot)\n }, [services, previewKey, surface, renderer, onPreview, transient])\n const onError = useCallback((message: string) => { discard(true); setError(message) }, [discard])\n const onLoadProgress = useCallback((next: AssistantAvatarLoadProgress) => setProgress(next), [])\n const t = useCodingNsTranslator(services.locale)\n const diagnostics = services.stage0 === true && showDiagnostics !== false\n const props = { model, state, surface, size, onError, onLoadProgress, diagnostics, ...(reaction === undefined ? {} : { reaction }), ...(onPreview === undefined ? {} : { onPreview: publishPreview }) }\n const component = renderer?.component\n const showCache = diagnostics && (renderer?.reportsCache === true || progress?.cacheBefore !== undefined || progress?.cacheAfter !== undefined)\n const content = component === undefined ? null : createElement(component, props)\n if (error !== '' || content === null) return createElement(AvatarFallback, { services, model, state, surface, size,\n ...(transient === undefined ? {} : { transient }), ...(error === '' ? {} : { error }) })\n return createElement('div', { 'data-codingns-avatar-slot': surface, 'data-codingns-avatar-renderer': model.renderer,\n 'data-codingns-avatar-state': state, 'aria-label': t('avatar.character', { name: model.name }),\n 'aria-busy': progress !== undefined && progress.phase !== 'ready',\n style: { position: 'relative', display: 'grid', justifyItems: 'center', maxWidth: '100%', minWidth: 0 } },\n createElement('div', { style: { opacity: progress !== undefined && progress.phase !== 'ready' ? 0 : 1,\n transition: 'opacity .25s ease', maxWidth: '100%' } }, content),\n preview === undefined ? null : createElement('img', { key: preview.url, src: preview.url, alt: '', 'aria-hidden': true, draggable: false,\n 'data-codingns-avatar-preview': true, onError: () => discard(),\n style: { position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'contain', pointerEvents: 'none',\n opacity: progress !== undefined && progress.phase !== 'ready' ? 1 : 0, transition: 'opacity .25s ease' } }),\n reaction === undefined ? null : createElement(AssistantAvatarReactionBadge, { reaction }),\n progress === undefined || (progress.phase === 'ready' && (!diagnostics || (progress.elapsedMs === undefined && !showCache))) ? null\n : createElement(AssistantAvatarLoading, { progress, size, t, showCache, diagnostics, preview: preview !== undefined, animationOnly: transient === true }))\n}\n\nconst loadErrorKeys = { avatar_runtime_unavailable: 'avatar.live2dEngineUnavailable', avatar_runtime_invalid: 'avatar.live2dRuntimeInvalid',\n avatar_webgl_unavailable: 'avatar.live2dWebglUnavailable' } as const\n\nfunction AvatarFallback(props: AssistantAvatarSlotProps & { readonly error?: string }): ReactElement {\n const t = useCodingNsTranslator(props.services.locale)\n const key = props.error === undefined ? undefined : loadErrorKeys[props.error as keyof typeof loadErrorKeys]\n const detail = props.error === undefined ? null : createElement('small', { 'data-codingns-avatar-load-error': true, style: { display: 'block', marginTop: 8, overflowWrap: 'anywhere' } },\n t('avatar.loadErrorReason', { reason: key === undefined ? props.error : t(key) }))\n if (props.transient) return createElement('div', { role: 'alert', 'data-codingns-avatar-preview-failed': true, style: dshSettingsHelpStyle },\n t(props.model.renderer === 'live2d' ? 'avatar.temporaryLive2dLoadFailed' : 'avatar.temporaryLoadFailed'), detail)\n return createElement('div', { 'data-codingns-avatar-fallback': true, style: { position: 'relative', display: 'grid', justifyItems: 'center', maxWidth: '100%' } },\n createElement(BuiltinAssistantAvatar, { ...props, model: BUILTIN_ASSISTANT_AVATAR, onError: () => undefined }),\n props.reaction === undefined ? null : createElement(AssistantAvatarReactionBadge, { reaction: props.reaction }),\n createElement('span', { role: 'status', style: { ...dshSettingsHelpStyle, color: dshThemeColor.labelSecondary, textAlign: 'center', maxWidth: props.size } }, t('avatar.loadFailed')), detail)\n}\nclass AvatarErrorBoundary extends Component<{ readonly children?: ReactNode; readonly fallback: ReactElement }, { readonly failed: boolean }> {\n override state = { failed: false }\n static getDerivedStateFromError(): { failed: boolean } { return { failed: true } }\n override render(): ReactNode { return this.state.failed ? this.props.fallback : this.props.children }\n}\n","import { createElement, useCallback, useEffect, useSyncExternalStore } from 'react'\nimport type { ReactElement } from 'react'\nimport { BUILTIN_ASSISTANT_AVATAR, BUILTIN_ASSISTANT_AVATAR_SOURCES, resolveAssistantAvatarAsset } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport type { CodingNsClientServices } from '../features/types.js'\nimport { getAssistantAvatarRegistry } from './registry.js'\nimport { assistantAvatarPortraitKey, getAssistantAvatarPortraitService } from './portrait-service.js'\n\n/** 只订阅当前形象,切换时立即回到对应占位,不显示上一角色的迟到头像。 */\nexport function useAssistantAvatarPortrait(services: CodingNsClientServices, model: AssistantAvatarModel) {\n const registry = getAssistantAvatarRegistry(services)\n const rendererId = resolveAssistantAvatarAsset(model, 'dialog').renderer\n const readRenderer = useCallback(() => registry.get(rendererId), [registry, rendererId])\n const renderer = useSyncExternalStore(registry.subscribe, readRenderer, readRenderer)\n const service = getAssistantAvatarPortraitService(services)\n const key = assistantAvatarPortraitKey(model, renderer)\n // 规范化会复制清单,只有资源键变化时才切换订阅和生成任务。\n const read = useCallback(() => service.getSnapshot(model, renderer), [service, key, renderer])\n const subscribe = useCallback((listener: () => void) => service.subscribe(model, renderer, listener), [service, key, renderer])\n const portrait = useSyncExternalStore(subscribe, read, read)\n useEffect(() => service.retain(model, renderer), [service, key, renderer])\n return { url: portrait.url ?? BUILTIN_ASSISTANT_AVATAR_SOURCES[model.id] ?? BUILTIN_ASSISTANT_AVATAR_SOURCES[BUILTIN_ASSISTANT_AVATAR.id]!, generated: portrait.url !== undefined }\n}\n\n/** 消息头像仅显示静态 PNG;名字和按钮本身提供无障碍说明。 */\nexport function AssistantAvatarPortrait({ services, model, size = 28 }: {\n readonly services: CodingNsClientServices; readonly model: AssistantAvatarModel; readonly size?: number\n}): ReactElement {\n const portrait = useAssistantAvatarPortrait(services, model)\n return createElement('span', { 'data-codingns-avatar-portrait': model.id, 'aria-hidden': true,\n style: { display: 'inline-flex', width: size, height: size, flex: `0 0 ${size}px`, borderRadius: '50%', overflow: 'hidden' } },\n createElement('img', { src: portrait.url, alt: '', draggable: false, style: assistantAvatarPortraitImageStyle(portrait.generated),\n onError: (event: { currentTarget: HTMLImageElement }) => fallbackPortraitImage(event.currentTarget) }))\n}\n\nexport function assistantAvatarPortraitImageStyle(generated: boolean) {\n return { display: 'block', width: '100%', height: '100%', objectFit: 'contain' as const, pointerEvents: 'none' as const,\n ...(generated ? {} : { transform: 'translateY(26%) scale(1.7)' }) }\n}\n\n/** 更新填充而不重建原生按钮,保留点击、焦点和无障碍属性。 */\nexport function fillAssistantAvatarButton(button: HTMLButtonElement, portrait: { readonly url: string; readonly generated: boolean }): void {\n let image = button.querySelector<HTMLImageElement>('img[data-codingns-avatar-button-portrait]')\n if (image === null) {\n image = button.ownerDocument.createElement('img')\n image.alt = ''; image.draggable = false; image.setAttribute('aria-hidden', 'true')\n image.setAttribute('data-codingns-avatar-button-portrait', 'true')\n button.replaceChildren(image)\n }\n image.style.transform = ''\n Object.assign(image.style, assistantAvatarPortraitImageStyle(portrait.generated))\n image.onerror = () => fallbackPortraitImage(image!)\n if (image.getAttribute('src') !== portrait.url) image.src = portrait.url\n button.style.overflow = 'hidden'\n}\nfunction fallbackPortraitImage(image: HTMLImageElement): void {\n const source = BUILTIN_ASSISTANT_AVATAR_SOURCES[BUILTIN_ASSISTANT_AVATAR.id]!\n if (image.getAttribute('src') === source) return\n Object.assign(image.style, assistantAvatarPortraitImageStyle(false))\n image.src = source\n}\n","import { BUILTIN_ASSISTANT_AVATAR, getBuiltinAssistantAvatar, copyAssistantAvatarModel, isAssistantAvatarSource, listAssistantAvatars, normalizeAssistantAppearance, selectedAssistantAvatar,\n validateAssistantAppearance, validateAssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport type { AssistantAppearanceSettings, AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport { BUILTIN_ASSISTANT_AVATAR_ADAPTERS } from '../../shared/assistant-avatar-adapters.js'\nimport type { AssistantAvatarAdapter } from '../../shared/assistant-avatar-adapters.js'\nimport { CODINGNS_RPC_CHANNEL } from '../../shared/contracts/transport.js'\nimport type { CodingNsSettings } from '../../shared/contracts/config.js'\nimport type { CodingNsSettingsStore } from '../../dsh-capabilities/settings-store.js'\nimport { sameSettingsValue } from '../../dsh-capabilities/settings-store.js'\nimport type { CodingNsClientServices } from '../features/types.js'\nimport { AssistantAvatarRegistration } from './registration.js'\nimport { assistantAvatarPreviewStore } from './preview-store.js'\nimport { assistantAvatarPortraitStore, assistantAvatarPortraitOverrideStore, getAssistantAvatarPortraitService } from './portrait-service.js'\nimport type { CodingNsRpcClient } from '../features/types.js'\nimport type { AssistantAvatarCandidate, AssistantAvatarInstallation } from '../../shared/assistant-avatar-installation.js'\nimport { ASSISTANT_AVATAR_CONSENT_VERSION, hasAssistantAvatarConsent } from '../../shared/assistant-avatar-catalog.js'\nimport type { AssistantAvatarCatalogEntry, AssistantAvatarTemporaryPreview } from '../../shared/assistant-avatar-catalog.js'\nimport { ASSISTANT_AVATAR_ENGINE_CONSENT_VERSION, hasAssistantAvatarEngineConsent, invalidateAssistantAvatarRuntime } from '../../shared/assistant-avatar-engine.js'\nimport type { AssistantAvatarEngineStatus } from '../../shared/assistant-avatar-engine.js'\n\nexport class AssistantAvatarAdapterRegistry extends AssistantAvatarRegistration<AssistantAvatarAdapter> {\n constructor() { super(BUILTIN_ASSISTANT_AVATAR_ADAPTERS) }\n parse(manifest: unknown, manifestUrl: string, adapterId = 'auto'): AssistantAvatarModel {\n const adapter = adapterId === 'auto' ? this.getSnapshot().find((item) => item.matches(manifest)) : this.get(adapterId)\n if (adapter === undefined || !adapter.matches(manifest)) throw new TypeError('无法识别形象包,或所选适配器未注册')\n const model = adapter.parse(manifest, { manifestUrl })\n const result = { ...model, package: { ...model.package, adapterId: adapter.id, manifestUrl } }\n validateAssistantAvatarModel(result)\n return copyAssistantAvatarModel(result)\n }\n}\n\nexport type AssistantAppearanceUpdate = Partial<Pick<AssistantAppearanceSettings, 'floatingEnabled' | 'dialogEnabled' | 'floatingSize' | 'dialogSize'>>\n\n/** 唯一写入入口:包导入与手工素材最终都变成同一清单,不拥有语音或会话。 */\nexport class AssistantAvatarManager {\n private writes: Promise<unknown> = Promise.resolve()\n private appearance: AssistantAppearanceSettings | undefined\n private catalog: readonly AssistantAvatarModel[] = []\n constructor(private readonly settings: CodingNsSettingsStore<CodingNsSettings>,\n readonly adapters = new AssistantAvatarAdapterRegistry(),\n private readonly fetchManifest: typeof fetch = (...args) => fetch(...args),\n private readonly baseUrl: string | undefined = typeof location === 'undefined' ? undefined : location.href,\n private readonly rpc?: CodingNsRpcClient,\n private readonly removePortrait: (id: string) => void = (id) => {\n void assistantAvatarPortraitStore.removeModel(id).catch(() => undefined)\n void assistantAvatarPortraitOverrideStore.removeModel(id).catch(() => undefined)\n }) {}\n\n /** React 和扩展都可以订阅这一份稳定快照,语音设置变化不会刷新形象列表。 */\n readonly getSnapshot = (): AssistantAppearanceSettings => {\n const next = normalizeAssistantAppearance(this.settings.getSnapshot().value?.assistant.appearance)\n if (this.appearance === undefined || !sameSettingsValue(this.appearance, next)) {\n this.appearance = next\n this.catalog = Object.freeze(listAssistantAvatars(next))\n }\n return this.appearance\n }\n readonly subscribe = (listener: () => void): (() => void) => {\n let previous = this.getSnapshot()\n return this.settings.subscribe(() => {\n const next = this.getSnapshot()\n if (previous === next) return\n previous = next; listener()\n })\n }\n getAppearance(): AssistantAppearanceSettings { return this.getSnapshot() }\n list(): readonly AssistantAvatarModel[] { this.getSnapshot(); return this.catalog }\n getSelected(): AssistantAvatarModel { return selectedAssistantAvatar(this.getAppearance()) }\n\n select(id: string): Promise<void> {\n return this.write((current) => { this.requireModel(current, id); return { ...current, selectedId: id } })\n }\n async add(model: AssistantAvatarModel): Promise<void> {\n validateAssistantAvatarModel(model)\n const copy = copyAssistantAvatarModel(model)\n return this.insert(copy)\n }\n async update(model: AssistantAvatarModel): Promise<void> {\n this.requireCustom(model.id); validateAssistantAvatarModel(model)\n const copy = copyAssistantAvatarModel(model)\n return this.write((current) => {\n this.requireModel(current, copy.id)\n return { ...current, models: current.models.some((item) => item.id === copy.id)\n ? current.models.map((item) => item.id === copy.id ? copy : item) : [...current.models, copy] }\n })\n }\n async remove(id: string): Promise<void> {\n this.requireCustom(id)\n const installation = this.list().find((model) => model.id === id)?.package?.installationId\n await this.write((current) => { this.requireModel(current, id); return { ...current,\n selectedId: current.selectedId === id ? BUILTIN_ASSISTANT_AVATAR.id : current.selectedId,\n models: current.models.filter((item) => item.id !== id) } })\n void assistantAvatarPreviewStore.removeModel(id).catch(() => undefined)\n this.removePortrait(id)\n if (installation !== undefined && !this.list().some((model) => model.package?.installationId === installation)) {\n await this.call('remove', { id: installation })\n }\n }\n async configure(update: AssistantAppearanceUpdate): Promise<void> {\n if (Object.keys(update).some((key) => !['floatingEnabled', 'dialogEnabled', 'floatingSize', 'dialogSize'].includes(key))) throw new TypeError('展示设置字段无效')\n return this.write((current) => ({ ...current, ...update }))\n }\n\n /** 必须从独立协议操作调用;展示配置不会隐式开启第三方目录。 */\n setThirdPartyEnabled(enabled: boolean): Promise<void> {\n return this.write((current) => {\n const { thirdPartyConsent: _previous, ...appearance } = current\n return enabled ? { ...appearance, thirdPartyConsent: { version: ASSISTANT_AVATAR_CONSENT_VERSION, acceptedAt: Date.now() } } : appearance\n })\n }\n /** 引擎许可与第三方素材协议分开记录;撤销同意不卸载已安装引擎。 */\n setEngineEnabled(enabled: boolean): Promise<void> {\n return this.write((current) => {\n const { engineConsent: _previous, ...appearance } = current\n return enabled ? { ...appearance, engineConsent: { version: ASSISTANT_AVATAR_ENGINE_CONSENT_VERSION, acceptedAt: Date.now() } } : appearance\n })\n }\n /** 只读探测;已确认许可后由安装接口写入 CodingNS 自有引擎目录。 */\n async engineStatus(signal?: AbortSignal): Promise<AssistantAvatarEngineStatus> {\n return readEngineStatus(await this.call('engineStatus', {}, signal))\n }\n async installEngine(signal?: AbortSignal): Promise<AssistantAvatarEngineStatus> {\n this.requireWritable(); this.requireEngineConsent(); signal?.throwIfAborted()\n // 配置窗口的许可尚在草稿中,随本次安装传给 Host;不能为安装提前提交整个配置。\n const result = readEngineStatus(await this.call('installEngine', { engineConsent: this.getAppearance().engineConsent }, signal))\n signal?.throwIfAborted()\n if (!result.installed) throw new Error('Live2D 引擎安装后仍未就绪,请重试')\n invalidateAssistantAvatarRuntime()\n return result\n }\n async getCatalog(signal?: AbortSignal): Promise<readonly AssistantAvatarCatalogEntry[]> {\n this.requireConsent(); signal?.throwIfAborted()\n return this.call('catalog', {}, signal) as Promise<readonly AssistantAvatarCatalogEntry[]>\n }\n async previewCatalog(id: string, revision: string, lease: string, signal?: AbortSignal): Promise<AssistantAvatarTemporaryPreview> {\n this.requireWritable(); this.requireConsent(); signal?.throwIfAborted()\n const result = await this.call('previewCatalog', { id, revision, lease }, signal) as AssistantAvatarTemporaryPreview\n validateAssistantAvatarModel(result.model)\n if (result.lease !== lease) throw new TypeError('临时形象预览标识不一致')\n return result\n }\n async releasePreview(lease: string): Promise<void> { await this.call('releasePreview', { lease }) }\n async keepPreview(lease: string): Promise<void> { await this.call('keepPreview', { lease }) }\n async installCatalog(id: string, revision: string, licenseAccepted: boolean, signal?: AbortSignal, lease?: string): Promise<AssistantAvatarModel> {\n this.requireWritable(); this.requireConsent(); signal?.throwIfAborted()\n if (!licenseAccepted) throw new TypeError('请确认所选形象的许可及应用')\n const installed = await this.call('installCatalog', { id, revision, licenseAccepted, ...(lease === undefined ? {} : { lease }) }, signal) as AssistantAvatarInstallation\n return this.registerInstallation(installed, signal, true)\n }\n\n /** 只读清单 JSON;网络/解析/取消失败都不新增形象,不修改当前选择。 */\n async importPackage(source: string, adapterId = 'auto', signal?: AbortSignal): Promise<AssistantAvatarModel> {\n this.requireWritable(); signal?.throwIfAborted()\n if (!isAssistantAvatarSource(source)) throw new TypeError('形象包清单地址无效')\n const url = new URL(source, this.baseUrl).href\n const response = await this.fetchManifest(url, { credentials: 'same-origin', ...(signal === undefined ? {} : { signal }) })\n if (!response.ok) throw new Error(`avatar_manifest_http_${response.status}`)\n const text = await response.text()\n if (text.length > 262144) throw new TypeError('形象包清单过大')\n signal?.throwIfAborted()\n const model = this.adapters.parse(JSON.parse(text), response.url || url, adapterId)\n await this.insert(model, signal)\n return model\n }\n\n /** 新入口在 Host 安装完整素材后才写入形象列表;旧外链导入 API 保持兼容。 */\n async discover(source: string, signal?: AbortSignal): Promise<readonly AssistantAvatarCandidate[]> {\n this.requireWritable(); signal?.throwIfAborted()\n return this.call('discover', { source }, signal) as Promise<readonly AssistantAvatarCandidate[]>\n }\n async installPackage(source: string, adapterId = 'auto', signal?: AbortSignal): Promise<AssistantAvatarModel> {\n this.requireWritable(); signal?.throwIfAborted()\n const installed = await this.call('install', { source, adapterId }, signal) as AssistantAvatarInstallation\n return this.registerInstallation(installed, signal)\n }\n private async registerInstallation(installed: AssistantAvatarInstallation, signal?: AbortSignal, fromCatalog = false): Promise<AssistantAvatarModel> {\n let replacedInstallation: string | undefined\n try {\n validateAssistantAvatarModel(installed.model)\n await this.write((current) => {\n signal?.throwIfAborted()\n if (fromCatalog && !hasAssistantAvatarConsent(current.thirdPartyConsent)) throw new TypeError('第三方形象列表已关闭')\n const existing = current.models.find((model) => model.id === installed.model.id)\n replacedInstallation = existing?.package?.installationId\n const sameSource = existing?.package?.manifestUrl !== undefined && existing.package.manifestUrl === installed.model.package?.manifestUrl\n if (existing !== undefined && existing.package?.installationId !== installed.id && !sameSource) throw new TypeError('形象 ID 已存在,请先移除已有记录')\n if (installed.model.package?.installationId !== installed.id || !/^[a-f0-9]{64}$/u.test(installed.id)) throw new TypeError('形象安装结果无效')\n return { ...current, selectedId: installed.model.id,\n models: existing === undefined ? [...current.models, installed.model] : current.models.map((model) => model.id === existing.id ? installed.model : model) }\n })\n // 新版本成功启用后再回收旧版本;清理失败不推翻已经保存的有效选择。\n if (replacedInstallation !== undefined && replacedInstallation !== installed.id\n && !this.list().some((model) => model.package?.installationId === replacedInstallation)) {\n await this.call('remove', { id: replacedInstallation }).catch(() => undefined)\n }\n return installed.model\n } catch (error) {\n // 只清理本次新建的素材,不删除其他窗口已成功启用的同版本资源。\n if (installed.created && !this.list().some((model) => model.package?.installationId === installed.id)) await this.call('remove', { id: installed.id }).catch(() => undefined)\n throw error\n }\n }\n private async call(action: string, payload: unknown, signal?: AbortSignal): Promise<unknown> {\n if (this.rpc === undefined) throw new Error('形象本地安装服务不可用')\n const result = await this.rpc.call(CODINGNS_RPC_CHANNEL, `avatar/${action}`, payload, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n }\n\n private insert(model: AssistantAvatarModel, signal?: AbortSignal): Promise<void> {\n this.requireCustom(model.id)\n return this.write((current) => {\n signal?.throwIfAborted()\n if (current.models.some((item) => item.id === model.id)) throw new TypeError('形象 ID 已存在,请更新已有形象或使用其他 ID')\n return { ...current, selectedId: model.id, models: [...current.models, model] }\n })\n }\n\n private write(update: (current: AssistantAppearanceSettings) => AssistantAppearanceSettings): Promise<void> {\n // 公开 API 可以并发调用,后一项必须读取前一项保存后的清单和 revision。\n const task = this.writes.then(() => this.saveAppearance(update))\n this.writes = task.catch(() => undefined)\n return task\n }\n\n private async saveAppearance(update: (current: AssistantAppearanceSettings) => AssistantAppearanceSettings): Promise<void> {\n // revision 属于整个命名空间,后台会话索引也会推进它;冲突后必须重算改动,\n // 不能撤掉版本校验或重放旧 appearance,否则会覆盖其他窗口刚保存的形象。\n for (let attempt = 0; attempt < 3; attempt++) {\n const snapshot = this.requireWritable()\n const current = normalizeAssistantAppearance(snapshot.value!.assistant.appearance)\n const next = update(current)\n validateAssistantAppearance(next)\n if (JSON.stringify(next) === JSON.stringify(current)) return\n try {\n const accepted = await this.settings.mutate([{ op: 'set', path: ['assistant', 'appearance'], value: next }], snapshot.revision)\n if (!accepted) throw new Error('形象设置保存被拒绝,请刷新后重试')\n return\n } catch (error) {\n if (!isSettingsConflict(error) || this.settings.reload === undefined) throw error\n if (attempt === 2) throw new Error('形象设置持续被其他操作更新,请稍后重试', { cause: error })\n await this.settings.reload()\n }\n }\n }\n private requireWritable() {\n const snapshot = this.settings.getSnapshot()\n if (snapshot.status !== 'ready' || snapshot.value === undefined) throw new Error('形象设置尚未就绪')\n if (!snapshot.writable) throw new Error('当前形象设置为只读')\n return snapshot\n }\n private requireConsent(): void {\n if (!hasAssistantAvatarConsent(this.getAppearance().thirdPartyConsent)) throw new TypeError('请先同意第三方形象使用说明')\n }\n private requireEngineConsent(): void {\n if (!hasAssistantAvatarEngineConsent(this.getAppearance().engineConsent)) throw new TypeError('请先确认 Live2D 引擎许可')\n }\n private requireModel(current: AssistantAppearanceSettings, id: string): void {\n if (!listAssistantAvatars(current).some((item) => item.id === id)) throw new TypeError('形象不在清单中')\n }\n private requireCustom(id: string): void {\n if (getBuiltinAssistantAvatar(id) !== undefined) throw new TypeError('内置形象不可替换或删除')\n }\n}\n\n/** 引擎状态来自 Host;形状异常按不可用处理,避免把坏数据当成就绪。 */\nfunction readEngineStatus(value: unknown): AssistantAvatarEngineStatus {\n const status = value as AssistantAvatarEngineStatus | null\n if (status === null || typeof status !== 'object' || typeof status.installed !== 'boolean'\n || typeof status.version !== 'string' || !['managed', 'dependency', 'missing'].includes(status.source)) {\n throw new TypeError('Live2D 引擎状态无效')\n }\n return { installed: status.installed, version: status.version, source: status.source }\n}\n\n/** 兼容原生异常、RPC 稳定错误码,以及旧 Host 只透传正文的响应。 */\nfunction isSettingsConflict(error: unknown): boolean {\n if (error === null || typeof error !== 'object') return false\n const failure = error as { readonly code?: unknown; readonly name?: unknown; readonly message?: unknown }\n return failure.code === 'SETTINGS_CONFLICT' || failure.code === 'SettingsConflictError'\n || failure.name === 'SettingsConflictError'\n || (typeof failure.message === 'string' && /^settings namespace \".+\" changed since it was read \\(expected revision /u.test(failure.message))\n}\n\nconst managers = new WeakMap<CodingNsClientServices, AssistantAvatarManager>()\nexport function bindAssistantAvatarManager(services: CodingNsClientServices, manager: AssistantAvatarManager): void { managers.set(services, manager) }\nexport function getAssistantAvatarManager(services: CodingNsClientServices): AssistantAvatarManager {\n let manager = managers.get(services)\n if (manager === undefined) {\n manager = new AssistantAvatarManager(services.settings, undefined, undefined, undefined, services.rpc,\n (id) => getAssistantAvatarPortraitService(services).removeModel(id))\n managers.set(services, manager)\n }\n return manager\n}\n/** 扩展应将注销函数登记到 context.resources,已导入的数据不会随适配器注销丢失。 */\nexport function registerAssistantAvatarAdapter(services: CodingNsClientServices, adapter: AssistantAvatarAdapter): () => void {\n return getAssistantAvatarManager(services).adapters.register(adapter)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.manager.js","names":["ASSISTANT_AVATAR_RESOURCE_PACKS","useState","useRef","createElement","createElement","resolveCodingNsTranslator","createElement","useRef","createElement","useMemo","useRef","useState","createElement","createElement","uiFontSize","dshThemeColor","useState","useRef","useCallback","useCallback","useSyncExternalStore","useRef","createElement","useState","useCodingNsTranslator","dshSettingsHelpStyle","dshThemeColor","Component","useCallback","useSyncExternalStore","createElement","CODINGNS_RPC_CHANNEL"],"sources":["../../../../src/dsh-capabilities/settings-store.ts","../../../../src/shared/assistant-lifecycle.ts","../../../../src/shared/assistant-avatar-resources.ts","../../../../src/shared/assistant-avatar-legacy-resources.ts","../../../../src/shared/assistant-avatar-legacy.ts","../../../../src/shared/assistant-avatar-catalog.ts","../../../../src/shared/assistant-avatar-engine.ts","../../../../src/shared/assistant-avatar.ts","../../../../src/shared/assistant-avatar-adapters.ts","../../../../src/shared/assistant-avatar-installation.ts","../../../../src/shared/assistant-tts.ts","../../../../src/client/global-voice-runtime-registry.ts","../../../../src/client/avatar/image.ts","../../../../src/client/avatar/builtin.ts","../../../../src/client/avatar/reaction-badge.ts","../../../../src/client/avatar/spritesheet.ts","../../../../src/client/avatar/cache-status.ts","../../../../src/client/avatar/preview-store.ts","../../../../src/client/avatar/preview-capture.ts","../../../../src/client/avatar/portrait-capture.ts","../../../../src/client/avatar/live2d.ts","../../../../src/shared/assistant-avatar-registration.ts","../../../../src/client/avatar/registry.ts","../../../../src/client/avatar/loading.ts","../../../../src/client/avatar/preview.ts","../../../../src/client/avatar/portrait-service.ts","../../../../src/client/avatar/slot.ts","../../../../src/client/avatar/portrait.ts","../../../../src/client/avatar/manager.ts"],"sourcesContent":["/**\n * Codingns4DSH 内部设置存储契约。\n *\n * 业务模块只依赖这个最小接口,不直接依赖 DSH 的 SettingsScope 或未来的\n * ConfigForm。不同 DSH 版本的读写、revision 和订阅语义都在边界适配器中收敛。\n */\nexport interface CodingNsSettingsSnapshot<T> {\n readonly value: T | undefined\n readonly revision: number | undefined\n readonly writable: boolean\n readonly status: 'loading' | 'ready' | 'unavailable'\n}\n\nexport interface CodingNsSettingsOperation {\n readonly op: 'set' | 'unset'\n readonly path: readonly string[]\n readonly value?: unknown\n}\n\nexport interface CodingNsSettingsStore<T> {\n getSnapshot(): CodingNsSettingsSnapshot<T>\n subscribe(listener: () => void): () => void\n mutate(operations: readonly CodingNsSettingsOperation[], expectedRevision?: number): Promise<boolean>\n set(field: string, value: unknown): Promise<boolean>\n unset(field: string): Promise<boolean>\n load?(): Promise<void>\n /** Host 专用业务 RPC 修改设置后,显式重读权威快照;普通 load 保持缓存语义。 */\n reload?(): Promise<void>\n dispose?(): void | Promise<void>\n}\n\n/** 将 DSH 两代写入结果统一成内部成功布尔值。 */\nexport function accepted(write: Promise<void | boolean>): Promise<boolean> {\n return write.then((result) => result !== false)\n}\n\n/**\n * 判断两份设置快照在内容上是否等价。\n *\n * DSH 的 ConfigForm、SettingsScope 和插件自己的 Host RPC 都会在每次读取时\n * 构造新对象。`useSyncExternalStore` 要求 `getSnapshot()` 在内容未变化时返回\n * 同一个引用,否则 React 会在每次渲染后重新比对快照并强制再次渲染,直到抛出\n * “Maximum update depth exceeded”(React #185)。所有适配器都必须先比较内容、\n * 再决定是否替换快照并唤醒订阅者。\n */\nexport function sameSettingsSnapshot<T>(\n left: CodingNsSettingsSnapshot<T>,\n right: CodingNsSettingsSnapshot<T>,\n): boolean {\n return sameSettingsValue(left.value, right.value)\n && left.revision === right.revision\n && left.writable === right.writable\n && left.status === right.status\n}\n\n/** 设置内容的结构比较:数组按顺序、对象按键,标量按 Object.is。 */\nexport function sameSettingsValue(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true\n if (left === null || right === null || typeof left !== 'object' || typeof right !== 'object') return false\n if (Array.isArray(left) || Array.isArray(right)) {\n if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) return false\n return left.every((value, index) => sameSettingsValue(value, right[index]))\n }\n const leftRecord = left as Record<string, unknown>\n const rightRecord = right as Record<string, unknown>\n const leftKeys = Object.keys(leftRecord)\n const rightKeys = Object.keys(rightRecord)\n if (leftKeys.length !== rightKeys.length) return false\n return leftKeys.every((key) => Object.prototype.hasOwnProperty.call(rightRecord, key) && sameSettingsValue(leftRecord[key], rightRecord[key]))\n}\n","import type { AssistantProfileSettings, AssistantSettings } from './contracts/config.js'\nimport { parseVirtualWorkspaceId } from './contracts/peer-host.js'\n\nexport const DEFAULT_ASSISTANT_NAME = '我的助理'\n/** 首次创建预填的标准性格;作为草稿数据,用户可修改或清空。 */\nexport const DEFAULT_ASSISTANT_PERSONALITY = '你是一位友善、耐心、可靠的智能助理,是用户工作与生活中的伙伴。善于倾听,表达自然简洁,优先给出清晰结论和可执行建议,再按需解释细节。遇到不确定的信息会如实说明并主动澄清,尊重用户的选择与隐私,不编造事实或经历。'\nexport const ASSISTANT_PERSONALITY_MAX_CHARS = 4000\n\n/** 只为未创建且尚无设定的助理补默认值;显式空白和已有档案保持原样。 */\nexport function readAssistantPersonality(profile: AssistantProfileSettings): string {\n return profile.personality ?? (profile.initialized ? '' : DEFAULT_ASSISTANT_PERSONALITY)\n}\n\n/** 角色设定可以留空,但不能绕过正式配置与预览共同的长度限制。 */\nexport function validateAssistantPersonality(value: unknown): asserts value is string {\n if (typeof value !== 'string' || value.length > ASSISTANT_PERSONALITY_MAX_CHARS) throw new TypeError('助理性格背景必须是最多 4000 字符的文字')\n}\n\n/** 原生侧栏可能投影虚拟 ID;范围比较保留用户选择,同时核对其所属 Host。 */\nexport function assistantWorkspaceMatches(selected: string, hostId: string, workspaceId: string, local = false): boolean {\n if (selected === workspaceId || selected === `${hostId}:${workspaceId}`) return true\n const virtual = parseVirtualWorkspaceId(selected)\n return virtual !== null && virtual.workspaceId === workspaceId && (virtual.hostId === hostId || local && virtual.targetHostId === null)\n}\n\n/** 只有显式档案表示已创建;旧能力配置仅预填表单,不能跳过首次创建。 */\nexport function readAssistantProfile(settings: AssistantSettings): AssistantProfileSettings {\n if (settings.profile !== undefined) return { ...settings.profile }\n return { name: DEFAULT_ASSISTANT_NAME, initialized: false, createdAt: null }\n}\n\n/** 设置和生命周期接口共用严格校验,写入失败不能被默认值掩盖。 */\nexport function validateAssistantProfile(value: unknown): asserts value is AssistantProfileSettings {\n const profile = value as Partial<AssistantProfileSettings> | null\n if (profile === null || typeof profile !== 'object' || Array.isArray(profile)\n || typeof profile.name !== 'string' || !profile.name.trim() || profile.name.length > 80\n || profile.personality !== undefined && (typeof profile.personality !== 'string' || profile.personality.length > ASSISTANT_PERSONALITY_MAX_CHARS)\n || typeof profile.initialized !== 'boolean'\n || profile.createdAt !== null && (!Number.isSafeInteger(profile.createdAt) || profile.createdAt! < 0)) throw new TypeError('助理档案无效')\n}\n\nexport function validateAssistantModel(value: unknown): asserts value is NonNullable<AssistantSettings['model']> {\n const model = value as AssistantSettings['model'] | null\n if (model === null || typeof model !== 'object' || Array.isArray(model)\n || typeof model.provider !== 'string' || !model.provider.trim() || model.provider.length > 200\n || typeof model.model !== 'string' || !model.model.trim() || model.model.length > 200) throw new TypeError('助理模型无效')\n}\n","/** 可复用的资源包描述,不包含任何角色素材来源或目录。 */\nexport interface AssistantAvatarResourcePack {\n readonly basePath: string\n readonly upstreamRoot: string\n readonly manifest: string\n readonly motionGroups: Readonly<Record<string, string>>\n readonly files: readonly { readonly path: string; readonly contentType: string; readonly maxBytes: number; readonly preload?: false }[]\n}\nexport interface AssistantAvatarCacheStatus {\n readonly version: 1\n readonly generation: string\n readonly pack: string\n readonly cached: number\n readonly pending: number\n readonly total: number\n readonly downloads: number\n}\nexport function assistantAvatarCacheStatusPath(pack: AssistantAvatarResourcePack): string { return `${pack.basePath}cache-status.json` }\n/** 默认没有第三方资源包,保留旧内部调用的目录形状。 */\nexport const ASSISTANT_AVATAR_RESOURCE_PACKS: readonly AssistantAvatarResourcePack[] = Object.freeze([])\n","import type { AssistantAvatarResourcePack } from './assistant-avatar-resources.js'\nexport { assistantAvatarCacheStatusPath } from './assistant-avatar-resources.js'\n\n/** 地址包含上游提交与精简策略版本;修改资源或策略时必须更新版本,避免浏览器旧缓存。 */\nexport const WHALE_LIVE2D_RESOURCE_PACK: AssistantAvatarResourcePack = Object.freeze({\n basePath: '/api/codingns/assistant-avatar-assets/whale-185c02bf-v1/',\n upstreamRoot: 'https://raw.githubusercontent.com/A8Chann/dsh-pet-live2d/185c02bfbb3b886e1a236b5c2ec035cc085b9ca2/dsh-live2d-pet/pets/ds-whale-girl/',\n manifest: 'c_0120.model3.json',\n motionGroups: Object.freeze({ idle: 'Idle', thinking: 'Idle', listening: 'Idle', waiting: 'Idle', error: 'SprayWater' }),\n files: Object.freeze([\n { path: 'c_0120.model3.json', contentType: 'application/json', maxBytes: 262144 },\n { path: 'model/c_0120.moc3', contentType: 'application/octet-stream', maxBytes: 4194304 },\n { path: 'model/c_0120.physics3.json', contentType: 'application/json', maxBytes: 1048576 },\n { path: 'model/c_0120.cdi3.json', contentType: 'application/json', maxBytes: 1048576, preload: false as const },\n { path: 'textures/texture_00.png', contentType: 'image/png', maxBytes: 4194304 },\n { path: 'textures/texture_01.png', contentType: 'image/png', maxBytes: 1048576 },\n { path: 'motions/idle.motion3.json', contentType: 'application/json', maxBytes: 1048576 },\n { path: 'motions/spray-water.motion3.json', contentType: 'application/json', maxBytes: 1048576 },\n ].map((file) => Object.freeze(file))),\n})\n\nexport const ASSISTANT_AVATAR_RESOURCE_PACKS: readonly AssistantAvatarResourcePack[] = Object.freeze([WHALE_LIVE2D_RESOURCE_PACK])\n","import type { AssistantAvatarModel } from './assistant-avatar.js'\nimport { WHALE_LIVE2D_RESOURCE_PACK } from './assistant-avatar-legacy-resources.js'\n\nexport interface AssistantAvatarPreset {\n readonly labelKey: string\n readonly model: AssistantAvatarModel\n}\n\nconst spriteRoot = 'https://raw.githubusercontent.com/YunYueSama/codex-deepseek-pet/7661c8b304c5400701f91da01b1a643a207331de/codex-deepseek-pet/'\nconst live2dRoot = WHALE_LIVE2D_RESOURCE_PACK.upstreamRoot\n\n/**\n * 目录保存经 Codex/DSH 适配器转换并核验的统一模型数据,不包含美术文件。\n * 固定提交避免上游 main 更新悄悄改变素材;读取目录不请求网络,选中后才由渲染器加载。\n * 预设使用独立 ID,保留此前按上游 ID 导入的用户形象与自定义清单容量。\n */\n// 仅用于迁移旧版已经选中的记录;新安装不提供第三方内置目录。\nexport const LEGACY_ASSISTANT_AVATAR_PRESETS: readonly AssistantAvatarPreset[] = Object.freeze([\n Object.freeze({ labelKey: 'avatar.preset.whaleSprite', model: Object.freeze({\n id: 'codingns-preset-whale-sprite', name: '大肥鱼 · Q版全身',\n renderer: 'spritesheet', source: `${spriteRoot}spritesheet.webp`, spriteVersion: 2,\n package: Object.freeze({ adapterId: 'codex-pet', manifestUrl: `${spriteRoot}pet.json`, author: 'YunYueSama',\n license: '大肥鱼项目署名许可 1.0:仅授权作者有权授权的新增贡献;第三方角色与参考作品权利另行确认,非 DeepSeek 官方授权。',\n homepage: 'https://github.com/YunYueSama/codex-deepseek-pet/blob/7661c8b304c5400701f91da01b1a643a207331de/ASSET_LICENSE.md' }),\n }) }),\n Object.freeze({ labelKey: 'avatar.preset.whaleLive2d', model: Object.freeze({\n id: 'codingns-preset-whale-live2d', name: '大肥鱼 · Live2D 桌前',\n renderer: 'live2d', source: `${WHALE_LIVE2D_RESOURCE_PACK.basePath}${WHALE_LIVE2D_RESOURCE_PACK.manifest}`, spriteVersion: 2,\n motionGroups: WHALE_LIVE2D_RESOURCE_PACK.motionGroups,\n live2d: Object.freeze({ scale: 1, position: Object.freeze([0, 0] as const) }),\n package: Object.freeze({ adapterId: 'dsh-live2d-pet', manifestUrl: `${live2dRoot}pet.json`,\n author: '模型:上善无形 / ZipZipPipe / 氵六青 · 插件:A8Chann',\n license: 'CC BY-NC-SA 4.0:署名、非商业、相同方式共享;商业使用须分别取得各权利人授权。清单已精简,模型与贴图未修改。',\n homepage: 'https://github.com/A8Chann/dsh-pet-live2d/blob/185c02bfbb3b886e1a236b5c2ec035cc085b9ca2/NOTICE.md' }),\n }) }),\n])\n\nexport function getAssistantAvatarPreset(id: string): AssistantAvatarPreset | undefined {\n return LEGACY_ASSISTANT_AVATAR_PRESETS.find((preset) => preset.model.id === id)\n}\n\n/** 保留旧扩展的导出名称;第三方角色现在必须手工安装。 */\nexport const ASSISTANT_AVATAR_PRESETS: readonly AssistantAvatarPreset[] = Object.freeze([])\n","/** 目录仅提供安装清单链接;浏览目录不注册角色,也不下载第三方素材。 */\nexport const ASSISTANT_AVATAR_CATALOG_URL = 'https://github.com/jingyi0605/Codingns4DSH/blob/main/assets/assistant-avatar-catalog.md'\n\n/** 使用说明单独版本化;升级说明后必须重新确认,不能继承旧版同意。 */\nexport const ASSISTANT_AVATAR_CONSENT_VERSION = '2026-10-07.1'\nexport const ASSISTANT_AVATAR_CATALOG_PREVIEW_PATH = '/api/codingns/assistant-avatar-catalog-preview'\n/** 临时素材只通过随机预览租约读取,不与正式安装目录混用。 */\nexport const ASSISTANT_AVATAR_TEMPORARY_ASSET_PATH = '/api/codingns/assistant-avatar-temporary-assets'\nexport interface AssistantAvatarTemporaryPreview {\n readonly lease: string\n readonly model: import('./assistant-avatar.js').AssistantAvatarModel\n}\nexport interface AssistantAvatarConsent {\n readonly version: string\n readonly acceptedAt: number\n}\n/** 目录只传元数据;完整素材始终由用户另外确认安装。 */\nexport interface AssistantAvatarCatalogEntry {\n readonly id: string\n readonly number: number\n readonly name: string\n readonly author: string\n readonly description: string\n readonly remarks: string\n readonly repositoryUrl: string\n readonly licenseUrl: string\n readonly license: string\n readonly homepage: string\n readonly format: string\n readonly revision: string\n readonly bytes: number\n readonly files: number\n readonly previewAvailable: boolean\n}\nexport function validAssistantAvatarConsent(value: unknown): value is AssistantAvatarConsent {\n if (value === null || typeof value !== 'object') return false\n const consent = value as Partial<AssistantAvatarConsent>\n return typeof consent.version === 'string' && consent.version.length > 0 && consent.version.length <= 80\n && Number.isSafeInteger(consent.acceptedAt) && consent.acceptedAt! > 0\n}\nexport function hasAssistantAvatarConsent(value: unknown): boolean {\n return validAssistantAvatarConsent(value) && value.version === ASSISTANT_AVATAR_CONSENT_VERSION\n}\nexport function assistantAvatarCatalogPreviewUrl(entry: Pick<AssistantAvatarCatalogEntry, 'id' | 'revision'>): string {\n return `${ASSISTANT_AVATAR_CATALOG_PREVIEW_PATH}?${new URLSearchParams({ id: entry.id, revision: entry.revision })}`\n}\n","/**\n * Live2D 引擎的固定版本与许可契约。\n *\n * 引擎不随插件打包:Host 在用户确认引擎许可后,从固定 registry 地址下载\n * 精确版本并校验摘要,安装到 CodingNS 自有目录;源码开发仍可直接解析\n * 仓库中的开发依赖。升级版本必须同时更新 tarball 地址、摘要与许可说明。\n */\nexport const ASSISTANT_AVATAR_ENGINE_VERSION = '2.1.1'\nlet runtimeRevision = 0\nconst runtimeListeners = new Set<() => void>()\n/** Host 与 Client 各自维护代次,安装成功立即解除缺失引擎的短期缓存。 */\nexport function invalidateAssistantAvatarRuntime(): void {\n runtimeRevision += 1\n for (const listener of runtimeListeners) listener()\n}\nexport function assistantAvatarRuntimeRevision(): number { return runtimeRevision }\n/** 已经显示加载失败的形象也需要重新挂载,不能只清除模块缓存。 */\nexport function subscribeAssistantAvatarRuntime(listener: () => void): () => void {\n runtimeListeners.add(listener)\n return () => { runtimeListeners.delete(listener) }\n}\nexport const ASSISTANT_AVATAR_ENGINE_TARBALL = 'https://registry.npmjs.org/l2d/-/l2d-2.1.1.tgz'\nexport const ASSISTANT_AVATAR_ENGINE_SHA512 = 'Q9Rp3uDPiZyS4SJZ/RJ+tuR1YQ75gKhGeS2gZNCO6KvydDB6okPQJk+zsKt8KyJ6Y5g0okVMtj3Sisjxr35ptA=='\n/** npm tarball 顶层固定为 package/,入口是真正的 ESM 文件而非全局 IIFE。 */\nexport const ASSISTANT_AVATAR_ENGINE_ENTRY = 'package/dist/index.js'\n/** 真实入口约 820 KB;明显偏小说明下载或解压不完整。 */\nexport const ASSISTANT_AVATAR_ENGINE_MIN_ENTRY_BYTES = 512 * 1024\nexport const ASSISTANT_AVATAR_ENGINE_MAX_ARCHIVE_BYTES = 8 * 1024 * 1024\n/** 引擎许可单独版本化:Cubism SDK 条款与第三方素材许可分别确认。 */\nexport const ASSISTANT_AVATAR_ENGINE_CONSENT_VERSION = '2026-10-08.1'\nexport interface AssistantAvatarEngineConsent {\n readonly version: string\n readonly acceptedAt: number\n}\n/** managed 为 CodingNS 自有目录安装,dependency 为源码开发或用户手工安装。 */\nexport type AssistantAvatarEngineSource = 'managed' | 'dependency' | 'missing'\nexport interface AssistantAvatarEngineStatus {\n readonly installed: boolean\n readonly version: string\n readonly source: AssistantAvatarEngineSource\n}\nexport function validAssistantAvatarEngineConsent(value: unknown): value is AssistantAvatarEngineConsent {\n if (value === null || typeof value !== 'object') return false\n const consent = value as Partial<AssistantAvatarEngineConsent>\n return typeof consent.version === 'string' && consent.version.length > 0 && consent.version.length <= 80\n && Number.isSafeInteger(consent.acceptedAt) && consent.acceptedAt! > 0\n}\nexport function hasAssistantAvatarEngineConsent(value: unknown): boolean {\n return validAssistantAvatarEngineConsent(value) && value.version === ASSISTANT_AVATAR_ENGINE_CONSENT_VERSION\n}\n","import { getAssistantAvatarPreset } from './assistant-avatar-legacy.js'\nimport { validAssistantAvatarConsent } from './assistant-avatar-catalog.js'\nimport type { AssistantAvatarConsent } from './assistant-avatar-catalog.js'\nimport { validAssistantAvatarEngineConsent } from './assistant-avatar-engine.js'\nimport type { AssistantAvatarEngineConsent } from './assistant-avatar-engine.js'\n\n/** 形象只消费助理状态,不持有会话、语音设备或工作区权限。 */\nexport type AssistantAvatarState = 'idle' | 'listening' | 'thinking' | 'speaking' | 'waiting' | 'error'\nexport type AssistantAvatarSurface = 'floating' | 'dialog'\n/** 会话反馈独立于六种语音动作,旧渲染器可忽略这个可选输入。 */\nexport type AssistantAvatarReaction = 'success' | 'concerned' | 'question' | 'approval'\nexport const ASSISTANT_AVATAR_REACTIONS: readonly AssistantAvatarReaction[] = ['success', 'concerned', 'question', 'approval']\n\nexport const ASSISTANT_AVATAR_STATES: readonly AssistantAvatarState[] = ['idle', 'listening', 'thinking', 'speaking', 'waiting', 'error']\n\n/** 素材与角色身份分开,同一个包可以为两个展示位置提供不同素材。 */\nexport interface AssistantAvatarAsset {\n /** 内置 ID 为 builtin/image/spritesheet/live2d;其他 ID 由扩展注册。 */\n readonly renderer: string\n readonly source: string\n readonly spriteVersion: 1 | 2\n /** 图片差分按统一助理状态选择,未声明的状态使用 source。 */\n readonly stateSources?: Readonly<Partial<Record<AssistantAvatarState, string>>>\n /** Live2D 动作组显式映射,未声明的状态保留自动识别与待机回落。 */\n readonly motionGroups?: Readonly<Partial<Record<AssistantAvatarState, string>>>\n readonly reactionSources?: Readonly<Partial<Record<AssistantAvatarReaction, string>>>\n /** Live2D 使用已有组名,精灵使用包明确声明且落在已有图集内的帧。 */\n readonly reactionMotionGroups?: Readonly<Partial<Record<AssistantAvatarReaction, string | AssistantSpriteMotion>>>\n readonly reactionExpressions?: Readonly<Partial<Record<AssistantAvatarReaction, string>>>\n /** 模型自适应后再应用包内缩放和位置,适配不同模型的构图。 */\n readonly live2d?: { readonly scale?: number; readonly position?: readonly [number, number] }\n}\nexport interface AssistantAvatarPackageInfo {\n readonly adapterId: string\n readonly manifestUrl?: string\n readonly author?: string\n readonly license?: string\n readonly homepage?: string\n /** 本地素材安装的内容版本;不持有渲染实例或绝对磁盘路径。 */\n readonly installationId?: string\n}\nexport interface AssistantAvatarModel extends AssistantAvatarAsset {\n readonly id: string\n readonly name: string\n readonly package?: AssistantAvatarPackageInfo\n readonly surfaces?: Readonly<Partial<Record<AssistantAvatarSurface, AssistantAvatarAsset>>>\n}\n/** CodingNS 原生包清单;其他格式由适配器转换后使用相同的存储与展示接口。 */\nexport interface AssistantAvatarManifest {\n readonly avatarManifestVersion: 1\n readonly id: string\n readonly name: string\n readonly asset: AssistantAvatarAsset\n readonly surfaces?: AssistantAvatarModel['surfaces']\n readonly author?: string\n readonly license?: string\n readonly homepage?: string\n}\n\nexport interface AssistantAppearanceSettings {\n readonly floatingEnabled: boolean\n readonly dialogEnabled: boolean\n readonly floatingSize: number\n readonly dialogSize: number\n readonly selectedId: string\n readonly models: readonly AssistantAvatarModel[]\n /** 仅控制第三方目录访问,撤销同意不会删除已安装形象。 */\n readonly thirdPartyConsent?: AssistantAvatarConsent\n /** 仅控制 Live2D 引擎下载;撤销同意不会删除已安装引擎。 */\n readonly engineConsent?: AssistantAvatarEngineConsent\n}\n\nexport const ASSISTANT_AVATAR_RUNTIME_PATH = '/api/codingns/assistant-avatar-runtime'\n/** 尺寸档位只映射到既有数值字段,旧自定义尺寸无需迁移。 */\nexport const ASSISTANT_AVATAR_FLOATING_STANDARD_SIZE = 144\nexport const ASSISTANT_AVATAR_FLOATING_MINI_SIZE = ASSISTANT_AVATAR_FLOATING_STANDARD_SIZE / 2\nexport const BUILTIN_ASSISTANT_AVATAR: AssistantAvatarModel = {\n id: 'codingns-default', name: '鱼妞', renderer: 'builtin', source: '', spriteVersion: 2,\n}\n/** 保留旧默认 ID 和存储字段;实际生图素材通过固定的同源 URL 加载。 */\nexport const BUILTIN_ASSISTANT_AVATARS: readonly AssistantAvatarModel[] = [BUILTIN_ASSISTANT_AVATAR,\n { id: 'codingns-basic-male', name: '鱼仔', renderer: 'builtin', source: '', spriteVersion: 2 }]\n/** 旧名称仅用于写入兼容;读取归一化后统一显示新名称,其他内置字段仍不可替换。 */\nconst legacyBuiltinNames: Readonly<Record<string, string>> = {\n 'codingns-default': 'CodingNS', 'codingns-basic-male': '基础形象 · 男生',\n}\nexport const BUILTIN_ASSISTANT_AVATAR_SOURCES: Readonly<Record<string, string>> = {\n 'codingns-default': '/api/codingns/assistant-avatar-basic/female-v1.png',\n 'codingns-basic-male': '/api/codingns/assistant-avatar-basic/male-v1.png',\n}\n/** 两个基础形象加原有的 19 个自定义名额,升级时不会丢掉已登记角色。 */\nexport const ASSISTANT_AVATAR_MAX_MODELS = 21\nexport function getBuiltinAssistantAvatar(id: unknown): AssistantAvatarModel | undefined {\n return BUILTIN_ASSISTANT_AVATARS.find((model) => model.id === id)\n}\nexport function builtinAssistantAvatarLabelKey(id: string): string | undefined {\n if (id === BUILTIN_ASSISTANT_AVATAR.id) return 'avatar.builtinName'\n if (id === 'codingns-basic-male') return 'avatar.builtinMaleName'\n return undefined\n}\nexport const DEFAULT_ASSISTANT_APPEARANCE: AssistantAppearanceSettings = {\n floatingEnabled: false, dialogEnabled: true, floatingSize: ASSISTANT_AVATAR_FLOATING_STANDARD_SIZE, dialogSize: 240,\n selectedId: BUILTIN_ASSISTANT_AVATAR.id, models: BUILTIN_ASSISTANT_AVATARS,\n}\n\n/** 资源只允许网页地址;任意脚本、file: 和协议相对地址均不能作为素材入口。 */\nexport function isAssistantAvatarSource(value: string): boolean {\n if (value.length === 0 || value.length > 2048 || /[\\s\\\\\\u0000-\\u001f]/u.test(value)) return false\n if (value.startsWith('/') && !value.startsWith('//')) return true\n try {\n const url = new URL(value)\n return (url.protocol === 'https:' || url.protocol === 'http:') && url.username === '' && url.password === ''\n } catch { return false }\n}\n\n/** 读取旧设置时补默认值;非法模型被过滤,绝不让坏配置阻止助理入口。 */\nexport function normalizeAssistantAppearance(value: unknown): AssistantAppearanceSettings {\n const record = asRecord(value)\n const models = [...BUILTIN_ASSISTANT_AVATARS]\n const seen = new Set(models.map((model) => model.id))\n for (const item of Array.isArray(record.models) ? record.models.slice(0, ASSISTANT_AVATAR_MAX_MODELS) : []) {\n if (models.length >= ASSISTANT_AVATAR_MAX_MODELS) break\n const model = asRecord(item)\n if (!validModel(model) || seen.has(model.id as string)) continue\n seen.add(model.id as string)\n models.push(copyAssistantAvatarModel(model as unknown as AssistantAvatarModel))\n }\n return {\n floatingEnabled: record.floatingEnabled === true,\n dialogEnabled: record.dialogEnabled !== false,\n floatingSize: boundedSize(record.floatingSize, ASSISTANT_AVATAR_FLOATING_MINI_SIZE, 320, ASSISTANT_AVATAR_FLOATING_STANDARD_SIZE),\n dialogSize: boundedSize(record.dialogSize, 120, 480, 240),\n selectedId: typeof record.selectedId === 'string' && (seen.has(record.selectedId) || getAssistantAvatarPreset(record.selectedId) !== undefined) ? record.selectedId : BUILTIN_ASSISTANT_AVATAR.id,\n models,\n ...(validAssistantAvatarConsent(record.thirdPartyConsent) ? { thirdPartyConsent: {\n version: record.thirdPartyConsent.version, acceptedAt: record.thirdPartyConsent.acceptedAt } } : {}),\n ...(validAssistantAvatarEngineConsent(record.engineConsent) ? { engineConsent: {\n version: record.engineConsent.version, acceptedAt: record.engineConsent.acceptedAt } } : {}),\n }\n}\n\n/** 写入必须严格校验,不能把被静默修正的数据报告为保存成功。 */\nexport function validateAssistantAppearance(value: unknown): void {\n const record = asRecord(value)\n if (record.thirdPartyConsent !== undefined && !validAssistantAvatarConsent(record.thirdPartyConsent)) throw new TypeError('第三方形象协议记录无效')\n if (record.engineConsent !== undefined && !validAssistantAvatarEngineConsent(record.engineConsent)) throw new TypeError('Live2D 引擎许可记录无效')\n if (typeof record.floatingEnabled !== 'boolean' || typeof record.dialogEnabled !== 'boolean') throw new TypeError('形象显示开关无效')\n for (const [key, min, max] of [['floatingSize', ASSISTANT_AVATAR_FLOATING_MINI_SIZE, 320], ['dialogSize', 120, 480]] as const) {\n if (typeof record[key] !== 'number' || !Number.isInteger(record[key]) || record[key] < min || record[key] > max) throw new TypeError('形象尺寸超出范围')\n }\n if (!Array.isArray(record.models) || record.models.length === 0 || record.models.length > ASSISTANT_AVATAR_MAX_MODELS) throw new TypeError(`形象清单必须包含 1 到 ${ASSISTANT_AVATAR_MAX_MODELS} 项`)\n const seen = new Set<string>()\n for (const item of record.models) {\n const model = asRecord(item)\n validateAssistantAvatarModel(model)\n if (typeof model.id !== 'string' || seen.has(model.id)) throw new TypeError('形象 ID 重复或无效')\n seen.add(model.id)\n }\n if (!seen.has(BUILTIN_ASSISTANT_AVATAR.id) || typeof record.selectedId !== 'string'\n || (!seen.has(record.selectedId) && getAssistantAvatarPreset(record.selectedId) === undefined)) throw new TypeError('当前形象不在清单中')\n}\n\n/** 所有导入和管理写入共享同一校验,不能由某个适配器绕过资源边界。 */\nexport function validateAssistantAvatarModel(value: unknown): asserts value is AssistantAvatarModel {\n const model = asRecord(value)\n const builtin = getBuiltinAssistantAvatar(model.id)\n if (builtin !== undefined) {\n const keys = Object.keys(builtin) as (keyof AssistantAvatarModel)[]\n if (keys.some((key) => model[key] !== builtin[key] && !(key === 'name' && model[key] === legacyBuiltinNames[builtin.id]))\n || Object.keys(model).some((key) => !keys.includes(key as keyof AssistantAvatarModel) && model[key] !== undefined)) throw new TypeError('内置形象不可替换')\n return\n }\n if (!validModel(model)) throw new TypeError('形象名称、类型或资源地址无效')\n}\n\n/** 保留旧存储字段,复制白名单内的数据,避免扩展把运行对象写进设置。 */\nexport function copyAssistantAvatarModel(model: AssistantAvatarModel): AssistantAvatarModel {\n return { id: model.id, name: model.name.trim(), ...copyAsset(model),\n ...(model.package === undefined ? {} : { package: { ...model.package } }),\n ...(model.surfaces === undefined ? {} : { surfaces: Object.fromEntries(Object.entries(model.surfaces).map(([surface, asset]) => [surface, copyAsset(asset)])) }),\n }\n}\n\nexport function selectedAssistantAvatar(appearance: AssistantAppearanceSettings): AssistantAvatarModel {\n return appearance.models.find((model) => model.id === appearance.selectedId)\n ?? getAssistantAvatarPreset(appearance.selectedId)?.model ?? BUILTIN_ASSISTANT_AVATAR\n}\n\n/** 创建表单只列已登记形象;已创建助理和管理器可保留旧选择的兼容入口。 */\nexport function listAssistantAvatars(appearance: AssistantAppearanceSettings, includeLegacy = true): readonly AssistantAvatarModel[] {\n if (!includeLegacy) return appearance.models\n const legacy = getAssistantAvatarPreset(appearance.selectedId)?.model\n return legacy === undefined || appearance.models.some((model) => model.id === legacy.id)\n ? appearance.models : [...appearance.models, legacy]\n}\n\n/** 展示位置只覆盖素材,不覆盖身份;状态映射也跟随所选素材,不串用另一种格式。 */\nexport function resolveAssistantAvatarAsset(model: AssistantAvatarModel, surface: AssistantAvatarSurface): AssistantAvatarModel {\n const asset = model.surfaces?.[surface]\n return asset === undefined ? model : { id: model.id, name: model.name, ...copyAsset(asset),\n ...(model.package === undefined ? {} : { package: model.package }), ...(model.surfaces === undefined ? {} : { surfaces: model.surfaces }) }\n}\n\nexport function assistantAvatarImageSource(model: AssistantAvatarAsset, state: AssistantAvatarState, reaction?: AssistantAvatarReaction): string {\n if (reaction !== undefined && !assistantAvatarVoicePriority(state) && model.reactionSources?.[reaction] !== undefined) return model.reactionSources[reaction]!\n return model.stateSources?.[state] ?? model.source\n}\n/** 单动作通道不能抢占监听、思考或说话;角标仍可同时展示。 */\nexport function assistantAvatarVoicePriority(state: AssistantAvatarState): boolean {\n return state === 'listening' || state === 'thinking' || state === 'speaking'\n}\n\nexport function resolveAssistantAvatarState(state: string | undefined, pending = false): AssistantAvatarState {\n if (state === 'error') return 'error'\n if (state === 'speaking') return 'speaking'\n if (pending || state === 'loading' || state === 'thinking') return 'thinking'\n if (state === 'listening' || state === 'recording') return 'listening'\n if (state === 'waiting') return 'waiting'\n return 'idle'\n}\n\nexport interface AssistantSpriteMotion { readonly row: number; readonly frames: number; readonly interval: number }\nexport function assistantSpriteReactionMotion(model: AssistantAvatarAsset, state: AssistantAvatarState, reaction?: AssistantAvatarReaction): AssistantSpriteMotion {\n const motion = reaction === undefined || assistantAvatarVoicePriority(state) ? undefined : model.reactionMotionGroups?.[reaction]\n return typeof motion === 'object' ? motion : assistantSpriteMotion(state)\n}\n\n/** 帧布局来自 Signalight/codex-to-dsh-pet;单帧 192×208,8 列。 */\nexport function assistantSpriteMotion(state: AssistantAvatarState): AssistantSpriteMotion {\n if (state === 'error') return { row: 5, frames: 8, interval: 140 }\n if (state === 'waiting' || state === 'listening') return { row: 6, frames: 6, interval: 150 }\n if (state === 'thinking') return { row: 7, frames: 6, interval: 120 }\n if (state === 'speaking') return { row: 8, frames: 6, interval: 150 }\n return { row: 0, frames: 6, interval: 160 }\n}\n\n/** 视口变化或旧坐标失效时让宠物保持在可点击范围。 */\nexport function clampAssistantAvatarPosition(x: number, y: number, width: number, height: number, viewportWidth: number, viewportHeight: number): { x: number; y: number } {\n return { x: Math.max(0, Math.min(Number.isFinite(x) ? x : 0, Math.max(0, viewportWidth - width))),\n y: Math.max(0, Math.min(Number.isFinite(y) ? y : 0, Math.max(0, viewportHeight - height))) }\n}\n\nfunction validModel(model: Record<string, unknown>): boolean {\n return typeof model.id === 'string' && /^[A-Za-z][A-Za-z0-9_-]{0,79}$/u.test(model.id)\n && typeof model.name === 'string' && model.name.trim().length > 0 && model.name.length <= 80\n && validAsset(model) && validPackage(model.package) && validSurfaces(model.surfaces)\n}\nfunction validAsset(asset: Record<string, unknown>): boolean {\n return typeof asset.renderer === 'string' && validId(asset.renderer) && asset.renderer !== 'builtin'\n && typeof asset.source === 'string' && isAssistantAvatarSource(asset.source)\n && (asset.spriteVersion === 1 || asset.spriteVersion === 2)\n && validStateMap(asset.stateSources, (source) => asset.renderer === 'image' && isAssistantAvatarSource(source))\n && validStateMap(asset.motionGroups, (group) => asset.renderer === 'live2d' && group.trim().length > 0 && group.length <= 120)\n && validReactionMap(asset.reactionSources, (source) => asset.renderer === 'image' && typeof source === 'string' && isAssistantAvatarSource(source))\n && validReactionMap(asset.reactionMotionGroups, (motion) => asset.renderer === 'live2d' ? validMotionName(motion)\n : asset.renderer === 'spritesheet' && validSpriteReaction(motion, asset.spriteVersion))\n && validReactionMap(asset.reactionExpressions, (expression) => asset.renderer === 'live2d' && validMotionName(expression))\n && validLive2dOptions(asset.live2d, asset.renderer)\n}\nfunction validStateMap(value: unknown, valid: (value: string) => boolean): boolean {\n return value === undefined || (isRecord(value) && Object.entries(value).every(([state, item]) =>\n ASSISTANT_AVATAR_STATES.includes(state as AssistantAvatarState) && typeof item === 'string' && valid(item)))\n}\nfunction validReactionMap(value: unknown, valid: (value: unknown) => boolean): boolean {\n return value === undefined || (isRecord(value) && Object.entries(value).every(([reaction, item]) =>\n ASSISTANT_AVATAR_REACTIONS.includes(reaction as AssistantAvatarReaction) && valid(item)))\n}\nfunction validMotionName(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0 && value.length <= 120 && !/[\\u0000-\\u001f]/u.test(value)\n}\nfunction validSpriteReaction(value: unknown, version: unknown): boolean {\n return isRecord(value) && Object.keys(value).every((key) => ['row', 'frames', 'interval'].includes(key))\n && Number.isInteger(value.row) && Number(value.row) >= 0 && Number(value.row) < (version === 2 ? 11 : 9)\n && Number.isInteger(value.frames) && Number(value.frames) >= 1 && Number(value.frames) <= 8\n && Number.isInteger(value.interval) && Number(value.interval) >= 16 && Number(value.interval) <= 10000\n}\nfunction validPackage(value: unknown): boolean {\n if (value === undefined) return true\n if (!isRecord(value) || typeof value.adapterId !== 'string' || !validId(value.adapterId)) return false\n for (const key of ['manifestUrl', 'homepage']) if (value[key] !== undefined && (typeof value[key] !== 'string' || !isAssistantAvatarSource(value[key]))) return false\n for (const key of ['author', 'license']) if (value[key] !== undefined && (typeof value[key] !== 'string' || value[key].length > 2048)) return false\n if (value.installationId !== undefined && (typeof value.installationId !== 'string' || !/^[a-f0-9]{64}$/u.test(value.installationId))) return false\n return Object.keys(value).every((key) => ['adapterId', 'manifestUrl', 'homepage', 'author', 'license', 'installationId'].includes(key))\n}\nfunction validSurfaces(value: unknown): boolean {\n return value === undefined || (isRecord(value) && Object.entries(value).every(([surface, asset]) =>\n ['floating', 'dialog'].includes(surface) && isRecord(asset) && validAsset(asset)))\n}\nfunction validLive2dOptions(value: unknown, renderer: string): boolean {\n if (value === undefined) return true\n if (!isRecord(value) || renderer !== 'live2d' || Object.keys(value).some((key) => !['scale', 'position'].includes(key))) return false\n if (value.scale !== undefined && (typeof value.scale !== 'number' || !Number.isFinite(value.scale) || value.scale < 0.05 || value.scale > 10)) return false\n return value.position === undefined || (Array.isArray(value.position) && value.position.length === 2\n && value.position.every((item) => typeof item === 'number' && Number.isFinite(item) && Math.abs(item) <= 2))\n}\nfunction copyAsset(asset: AssistantAvatarAsset): AssistantAvatarAsset {\n return { renderer: asset.renderer, source: asset.source, spriteVersion: asset.spriteVersion,\n ...(asset.stateSources === undefined ? {} : { stateSources: { ...asset.stateSources } }),\n ...(asset.motionGroups === undefined ? {} : { motionGroups: { ...asset.motionGroups } }),\n ...(asset.reactionSources === undefined ? {} : { reactionSources: { ...asset.reactionSources } }),\n ...(asset.reactionMotionGroups === undefined ? {} : { reactionMotionGroups: Object.fromEntries(Object.entries(asset.reactionMotionGroups).map(([key, value]) => [key, typeof value === 'string' ? value : { ...value }])) }),\n ...(asset.reactionExpressions === undefined ? {} : { reactionExpressions: { ...asset.reactionExpressions } }),\n ...(asset.live2d === undefined ? {} : { live2d: { ...asset.live2d, ...(asset.live2d.position === undefined ? {} : { position: [...asset.live2d.position] as [number, number] }) } }),\n }\n}\nfunction validId(value: string): boolean { return /^[A-Za-z][A-Za-z0-9_-]{0,79}$/u.test(value) }\nfunction isRecord(value: unknown): value is Record<string, unknown> { return typeof value === 'object' && value !== null && !Array.isArray(value) }\nfunction boundedSize(value: unknown, min: number, max: number, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? Math.max(min, Math.min(max, Math.round(value))) : fallback\n}\nfunction asRecord(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n","import { copyAssistantAvatarModel, isAssistantAvatarSource, validateAssistantAvatarModel } from './assistant-avatar.js'\nimport type { AssistantAvatarAsset, AssistantAvatarManifest, AssistantAvatarModel, AssistantAvatarPackageInfo, AssistantAvatarState } from './assistant-avatar.js'\n\nexport interface AssistantAvatarAdapterContext { readonly manifestUrl: string }\n/** 适配器解释 JSON 数据,不负责下载脚本、会话或渲染实例。 */\nexport interface AssistantAvatarAdapter {\n readonly id: string\n readonly labelKey?: string\n readonly name?: string\n matches(manifest: unknown): boolean\n parse(manifest: unknown, context: AssistantAvatarAdapterContext): AssistantAvatarModel\n}\n\n/** 相对路径以清单实际响应 URL 为基准,重定向后不再使用旧目录。 */\nexport function resolveAssistantAvatarSource(source: unknown, manifestUrl: string): string {\n if (typeof source !== 'string' || source.trim().length === 0 || source.trim().startsWith('//') || /[\\\\\\u0000-\\u001f]/u.test(source)) throw new TypeError('形象包资源地址无效')\n if (!isAssistantAvatarSource(manifestUrl)) throw new TypeError('形象包清单地址无效')\n const resolved = new URL(source, manifestUrl).href\n if (!isAssistantAvatarSource(resolved)) throw new TypeError('形象包资源地址无效')\n return resolved\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) throw new TypeError('形象包清单必须是 JSON 对象')\n return value as Record<string, unknown>\n}\nfunction looksLike(value: unknown, key: string): boolean {\n return typeof value === 'object' && value !== null && key in value\n}\nfunction asset(value: unknown, url: string): AssistantAvatarAsset {\n const input = record(value)\n return { renderer: input.renderer as string, source: resolveAssistantAvatarSource(input.source, url),\n spriteVersion: (input.spriteVersion ?? 2) as 1 | 2,\n ...(input.stateSources === undefined ? {} : { stateSources: Object.fromEntries(Object.entries(record(input.stateSources)).map(([state, source]) => [state, resolveAssistantAvatarSource(source, url)])) }),\n ...(input.motionGroups === undefined ? {} : { motionGroups: record(input.motionGroups) as NonNullable<AssistantAvatarAsset['motionGroups']> }),\n ...(input.reactionSources === undefined ? {} : { reactionSources: Object.fromEntries(Object.entries(record(input.reactionSources)).map(([reaction, source]) => [reaction, resolveAssistantAvatarSource(source, url)])) }),\n ...(input.reactionMotionGroups === undefined ? {} : { reactionMotionGroups: record(input.reactionMotionGroups) as NonNullable<AssistantAvatarAsset['reactionMotionGroups']> }),\n ...(input.reactionExpressions === undefined ? {} : { reactionExpressions: record(input.reactionExpressions) as NonNullable<AssistantAvatarAsset['reactionExpressions']> }),\n ...(input.live2d === undefined ? {} : { live2d: record(input.live2d) as NonNullable<AssistantAvatarAsset['live2d']> }),\n }\n}\nfunction build(input: Record<string, unknown>, base: AssistantAvatarAsset, context: AssistantAvatarAdapterContext, adapterId: string,\n surfaces?: AssistantAvatarModel['surfaces']): AssistantAvatarModel {\n const info: AssistantAvatarPackageInfo = { adapterId, manifestUrl: context.manifestUrl,\n ...(input.author === undefined ? {} : { author: input.author as string }),\n ...(input.license === undefined ? {} : { license: input.license as string }),\n ...(input.homepage === undefined ? {} : { homepage: resolveAssistantAvatarSource(input.homepage, context.manifestUrl) }),\n }\n const model = { id: input.id as string, name: (input.name ?? input.displayName) as string, ...base, package: info,\n ...(surfaces === undefined ? {} : { surfaces }) }\n validateAssistantAvatarModel(model)\n return copyAssistantAvatarModel(model)\n}\n\nconst native: AssistantAvatarAdapter = {\n id: 'codingns-pack', labelKey: 'avatar.adapter.native',\n matches: (value) => looksLike(value, 'avatarManifestVersion'),\n parse(value, context) {\n const input = record(value)\n if (input.avatarManifestVersion !== 1) throw new TypeError('不支持的 CodingNS 形象包版本')\n const surfaces = input.surfaces === undefined ? undefined : Object.fromEntries(Object.entries(record(input.surfaces)).map(([surface, source]) => [surface, asset(source, context.manifestUrl)]))\n return build(input, asset(input.asset, context.manifestUrl), context, this.id, surfaces)\n },\n}\nconst codex: AssistantAvatarAdapter = {\n id: 'codex-pet', labelKey: 'avatar.adapter.codex',\n matches: (value) => looksLike(value, 'spritesheetPath'),\n parse(value, context) {\n const input = record(value)\n return build(input, { renderer: 'spritesheet', source: resolveAssistantAvatarSource(input.spritesheetPath, context.manifestUrl),\n spriteVersion: input.spriteVersionNumber as 1 | 2 }, context, this.id)\n },\n}\nconst dsh: AssistantAvatarAdapter = {\n id: 'dsh-live2d-pet', labelKey: 'avatar.adapter.dsh',\n matches: (value) => looksLike(value, 'petManifestVersion'),\n parse(value, context) {\n const input = record(value)\n if (input.petManifestVersion !== 2 || input.renderer !== 'live2d') throw new TypeError('不支持的 DSH 形象包格式')\n const live2d = record(input.live2d)\n const translate = live2d.translate === undefined ? undefined : record(live2d.translate)\n // DSH 的 failed/asking 与 CodingNS 的 error/waiting 在适配边界转换。\n const motions = live2d.motions === undefined ? {} : record(live2d.motions)\n const states: Record<AssistantAvatarState, readonly string[]> = {\n idle: ['idle'], thinking: ['thinking', 'tool'], speaking: ['speaking'],\n listening: ['listening', 'waiting'], waiting: ['waiting', 'asking', 'queued'], error: ['error', 'failed'],\n }\n const motionGroups = Object.fromEntries(Object.entries(states).flatMap(([state, aliases]) => {\n const group = aliases.map((key) => motions[key]).find((item) => item !== undefined)\n return group === undefined ? [] : [[state, group]]\n }))\n return build(input, { renderer: 'live2d', source: resolveAssistantAvatarSource(live2d.model, context.manifestUrl), spriteVersion: 2,\n ...(Object.keys(motionGroups).length === 0 ? {} : { motionGroups }),\n ...(live2d.scale === undefined && translate === undefined ? {} : { live2d: {\n ...(live2d.scale === undefined ? {} : { scale: live2d.scale as number }),\n ...(translate === undefined ? {} : { position: [translate.x, translate.y] as [number, number] }),\n } }),\n }, context, this.id)\n },\n}\nconst cubism: AssistantAvatarAdapter = {\n id: 'cubism-model', labelKey: 'avatar.adapter.cubism',\n matches: (value) => looksLike(value, 'FileReferences') || looksLike(value, 'model'),\n parse(value, context) {\n const input = record(value)\n const refs = input.FileReferences === undefined ? input : record(input.FileReferences)\n const textures = refs.Textures ?? refs.textures\n if ((input.FileReferences !== undefined && input.Version !== 3) || !Array.isArray(textures) || textures.length === 0) throw new TypeError('Live2D 模型清单不完整')\n resolveAssistantAvatarSource(refs.Moc ?? refs.model, context.manifestUrl)\n for (const texture of textures) resolveAssistantAvatarSource(texture, context.manifestUrl)\n // 模型没有角色 ID,使用来源的稳定指纹,重复导入不会生成无限副本。\n let hash = 2166136261\n for (const character of context.manifestUrl) hash = Math.imul(hash ^ character.charCodeAt(0), 16777619)\n const filename = new URL(context.manifestUrl).pathname.split('/').pop() ?? 'Live2D'\n return build({ id: `live2d-${(hash >>> 0).toString(36)}`, name: decodeURIComponent(filename).replace(/\\.model3?\\.json$/iu, '').slice(0, 80) || 'Live2D' },\n { renderer: 'live2d', source: context.manifestUrl, spriteVersion: 2 }, context, this.id)\n },\n}\n\nexport const BUILTIN_ASSISTANT_AVATAR_ADAPTERS: readonly AssistantAvatarAdapter[] = [native, codex, dsh, cubism]\n\n/** 导出原生清单时不重复嵌入导入器元数据,素材地址已统一为可访问地址。 */\nexport function assistantAvatarManifest(model: AssistantAvatarModel): AssistantAvatarManifest {\n validateAssistantAvatarModel(model)\n if (model.renderer === 'builtin') throw new TypeError('内置形象不需要导出素材包')\n const { id, name, package: info, surfaces, ...base } = copyAssistantAvatarModel(model)\n return { avatarManifestVersion: 1, id, name, asset: base, ...(surfaces === undefined ? {} : { surfaces }),\n ...(info?.author === undefined ? {} : { author: info.author }), ...(info?.license === undefined ? {} : { license: info.license }),\n ...(info?.homepage === undefined ? {} : { homepage: info.homepage }) }\n}\n","import type { AssistantAvatarModel } from './assistant-avatar.js'\n\n/** 固定入口通过内容版本和文件键读取已安装素材,不接受远程代理目标。 */\nexport const ASSISTANT_AVATAR_ASSET_PATH = '/api/codingns/assistant-avatar-assets'\nexport const ASSISTANT_AVATAR_STATUS_PATH = '/api/codingns/assistant-avatar-cache-status'\nexport interface AssistantAvatarCandidate { readonly url: string; readonly name: string }\nexport interface AssistantAvatarInstallation {\n readonly id: string\n readonly model: AssistantAvatarModel\n readonly created: boolean\n readonly files: number\n readonly bytes: number\n}\nexport function assistantAvatarInstalledSource(id: string, file: string): string {\n return `${ASSISTANT_AVATAR_ASSET_PATH}?pack=${id}&file=${encodeURIComponent(file)}`\n}\n","/** 官方 ONNX 清单版本固定,展示元数据与推理 ID 共用同一份目录。 */\nexport type AssistantVoiceGender = 'male' | 'female' | 'unknown'\nexport interface AssistantTtsVoice {\n readonly id: string\n readonly name: string\n readonly language: string\n readonly gender: AssistantVoiceGender\n readonly kind: 'builtin' | 'reference'\n /** 内置为官方 voice ID;导入为 Host 生成的缓存键,绝不接受本地路径。 */\n readonly reference: string\n readonly source: string\n readonly license: string\n}\nexport interface AssistantTtsSettings {\n readonly backend: 'browser' | 'moss-onnx'\n readonly selectedId: string\n readonly voices: readonly AssistantTtsVoice[]\n /** 老配置可以缺省,读取时统一补齐,音色切换不改变播报参数。 */\n readonly parameters?: AssistantTtsParameters\n}\nexport interface AssistantTtsParameters {\n readonly rate: number\n readonly volume: number\n readonly segmentPauseMs: number\n readonly chunkTokens: number\n /** null 为自动随机;固定种子用于比较同一段文本的生成效果。 */\n readonly seed: number | null\n}\nexport const DEFAULT_ASSISTANT_TTS_PARAMETERS: AssistantTtsParameters = Object.freeze({ rate: 1, volume: 1, segmentPauseMs: 0, chunkTokens: 75, seed: null })\nexport const ASSISTANT_TTS_PARAMETER_LIMITS = {\n rate: { min: 0.5, max: 2, step: 0.05 },\n volume: { min: 0, max: 1, step: 0.01 },\n segmentPauseMs: { min: 0, max: 2000, step: 50 },\n chunkTokens: { min: 30, max: 120, step: 1 },\n seed: { min: 0, max: 4294967295, step: 1 },\n} as const\n\n/** 已保存的旧值或损坏值用默认值恢复;写入及试听请求使用严格校验。 */\nexport function readAssistantTtsParameters(value?: Partial<AssistantTtsParameters>): AssistantTtsParameters {\n const result = { ...DEFAULT_ASSISTANT_TTS_PARAMETERS }\n for (const key of ['rate', 'volume', 'segmentPauseMs', 'chunkTokens', 'seed'] as const) {\n const item = value?.[key]\n if (validParameter(key, item)) Object.assign(result, { [key]: item })\n }\n return result\n}\n\nexport function validateAssistantTtsParameters(value: unknown, base?: Partial<AssistantTtsParameters>): AssistantTtsParameters {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) throw new Error('播报参数必须为对象')\n const result = readAssistantTtsParameters(base)\n for (const [key, item] of Object.entries(value)) {\n if (!Object.hasOwn(ASSISTANT_TTS_PARAMETER_LIMITS, key)) throw new Error(`不支持的播报参数:${key}`)\n const name = key as keyof AssistantTtsParameters\n if (!validParameter(name, item)) {\n const limit = ASSISTANT_TTS_PARAMETER_LIMITS[name]\n throw new Error(`播报参数 ${key} 需要 ${limit.min}~${limit.max}${name === 'seed' ? ' 的整数或 null' : name === 'chunkTokens' || name === 'segmentPauseMs' ? ' 的整数' : ''}`)\n }\n Object.assign(result, { [key]: item })\n }\n return result\n}\n\nfunction validParameter(key: keyof AssistantTtsParameters, value: unknown): boolean {\n if (key === 'seed' && value === null) return true\n const limit = ASSISTANT_TTS_PARAMETER_LIMITS[key]\n return typeof value === 'number' && Number.isFinite(value) && value >= limit.min && value <= limit.max\n && (key === 'rate' || key === 'volume' || Number.isInteger(value))\n}\n\nexport const DEFAULT_ASSISTANT_TTS_SETTINGS: AssistantTtsSettings = { backend: 'browser', selectedId: 'moss:Yuewen', voices: [], parameters: DEFAULT_ASSISTANT_TTS_PARAMETERS }\nexport const MOSS_TTS_REVISION = 'f52645cb467506d8e18e746ddd59482685b74e58'\nexport const MOSS_CODEC_REVISION = 'ceff0d0749bfb3fa2d61149794ec6feef0d1e1ae'\nexport const MOSS_SOURCE_REVISION = '8b7bcc9341b3b4ef3a3a58ba1338a7d85ff133eb'\nexport const MOSS_BUILTIN_VOICES: readonly AssistantTtsVoice[] = [\n { id: 'moss:Junhao', name: 'Junhao · 欢迎关注模思智能', language: 'zh', gender: 'male', kind: 'builtin', reference: 'Junhao', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Zhiming', name: 'Zhiming · 京味胡同闲聊', language: 'zh', gender: 'male', kind: 'builtin', reference: 'Zhiming', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Weiguo', name: 'Weiguo · 说书', language: 'zh', gender: 'male', kind: 'builtin', reference: 'Weiguo', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Xiaoyu', name: 'Xiaoyu · 明星', language: 'zh', gender: 'female', kind: 'builtin', reference: 'Xiaoyu', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Yuewen', name: 'Yuewen · 机车', language: 'zh', gender: 'female', kind: 'builtin', reference: 'Yuewen', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Lingyu', name: 'Lingyu · 深夜电台', language: 'zh', gender: 'female', kind: 'builtin', reference: 'Lingyu', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Trump', name: 'Trump · Trump', language: 'en', gender: 'male', kind: 'builtin', reference: 'Trump', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Ava', name: 'Ava · The Bitter Lesson', language: 'en', gender: 'female', kind: 'builtin', reference: 'Ava', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Bella', name: 'Bella · A Gentle Reminder', language: 'en', gender: 'female', kind: 'builtin', reference: 'Bella', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Adam', name: 'Adam · English News', language: 'en', gender: 'male', kind: 'builtin', reference: 'Adam', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Nathan', name: 'Nathan · The Quiet Motion of the World', language: 'en', gender: 'male', kind: 'builtin', reference: 'Nathan', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Soyo', name: 'Soyo · Soyo', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Soyo', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Saki', name: 'Saki · Saki', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Saki', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Mortis', name: 'Mortis · Mortis', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Mortis', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Umiri', name: 'Umiri · Umiri', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Umiri', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Mei', name: 'Mei · Togawa', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Mei', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Anon', name: 'Anon · Anon', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Anon', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n { id: 'moss:Arisa', name: 'Arisa · Arisa', language: 'ja', gender: 'female', kind: 'builtin', reference: 'Arisa', source: 'https://huggingface.co/OpenMOSS-Team/MOSS-TTS-Nano-100M-ONNX/blob/f52645cb467506d8e18e746ddd59482685b74e58/browser_poc_manifest.json', license: 'Apache-2.0(项目许可;参考声音授权另行确认)' },\n]\nexport const ASSISTANT_TTS_PATH = '/api/codingns/assistant/voice/tts'\nexport const ASSISTANT_VOICE_SAMPLE_PATH = '/api/codingns/assistant/voice/sample'\nexport const ASSISTANT_VOICE_SITES = [\n { id: 'kyutai', name: 'Kyutai 开放音色', url: 'https://kyutai.org/tts/', help: '试听后填写 kyutai:voice-donations/0a67.wav 等录音 ID,或 Hugging Face 音频文件网址。' },\n { id: 'aishell', name: 'AISHELL-3 中文录音', url: 'https://huggingface.co/datasets/AISHELL/AISHELL-3', help: '填写 aishell:完整录音ID,或 Hugging Face 中单个音频文件的网址。' },\n] as const\nexport interface AssistantTtsStatus {\n readonly ready: boolean\n readonly busy: boolean\n readonly phase: string\n readonly downloadedBytes: number\n readonly totalBytes: number | null\n readonly error: string | null\n}\nexport interface AssistantTtsSnapshot {\n readonly settings: AssistantTtsSettings\n readonly voices: readonly AssistantTtsVoice[]\n readonly status: AssistantTtsStatus\n}\n/** 旧设置只补默认值,内置音色始终由目录提供,不能被自定义记录覆盖。 */\nexport function readAssistantTtsSettings(value?: AssistantTtsSettings): AssistantTtsSettings {\n const voices = (value?.voices ?? []).filter((voice) => voice.kind === 'reference' && /^ref-[a-f0-9]{64}$/u.test(voice.id) && voice.reference === voice.id)\n const selectedId = value?.selectedId ?? DEFAULT_ASSISTANT_TTS_SETTINGS.selectedId\n return { backend: value?.backend === 'moss-onnx' ? 'moss-onnx' : 'browser',\n selectedId: [...MOSS_BUILTIN_VOICES, ...voices].some((voice) => voice.id === selectedId) ? selectedId : DEFAULT_ASSISTANT_TTS_SETTINGS.selectedId, voices,\n parameters: readAssistantTtsParameters(value?.parameters) }\n}\n","import type { CodingNsClientServices } from './features/types.js'\nimport type { VoiceRuntimeAdapter } from '../shared/contracts/voice-runtime.js'\n\nexport interface GlobalVoiceAdapter extends VoiceRuntimeAdapter {\n readonly capabilities: import('../shared/contracts/voice-runtime.js').VoiceRuntimeCapabilities\n readonly configuredOwnerId: string\n readonly ownerId: string | undefined\n readonly inputDeviceId: string | undefined\n readonly outputDeviceId: string | undefined\n readonly outputDeviceSupported: boolean\n readonly isMicrophoneMuted?: boolean\n readonly isSpeakerMuted?: boolean\n setMicrophoneMuted?(muted: boolean): void\n setSpeakerMuted?(muted: boolean): void\n start(ownerId?: string): Promise<void>\n stop(): Promise<void>\n interrupt(): Promise<void>\n enumerateInputDevices(): Promise<readonly { readonly deviceId: string; readonly label: string }[]>\n enumerateOutputDevices(): Promise<readonly { readonly deviceId: string; readonly label: string }[]>\n selectInputDevice(deviceId: string): Promise<void>\n selectOutputDevice(deviceId: string): Promise<void>\n dispose?(): void\n}\n\nconst adapters = new WeakMap<CodingNsClientServices, GlobalVoiceAdapter>()\n\nexport function registerGlobalVoiceAdapter(services: CodingNsClientServices, adapter: GlobalVoiceAdapter): () => void {\n adapters.set(services, adapter)\n return () => {\n if (adapters.get(services) === adapter) adapters.delete(services)\n }\n}\n\nexport function getGlobalVoiceAdapter(services: CodingNsClientServices): GlobalVoiceAdapter | undefined {\n return adapters.get(services)\n}\n","import { createElement, useEffect, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { assistantAvatarImageSource } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarRendererProps } from './registry.js'\n\n/** 图片差分也消费相同的状态接口;某张差分缺失时先回落该角色默认图片。 */\nexport function ImageAssistantAvatar({ model, state, reaction, size, onError, onLoadProgress }: AssistantAvatarRendererProps): ReactElement {\n const requested = assistantAvatarImageSource(model, state, reaction)\n const [failed, setFailed] = useState('')\n const image = useRef<HTMLImageElement | null>(null)\n useEffect(() => setFailed(''), [requested])\n const source = failed === requested ? model.source : requested\n useEffect(() => {\n // 热缓存图片可能在 effect 前触发 load,不能随后又把已就绪形象遮住。\n onLoadProgress?.({ phase: image.current?.complete && image.current.naturalWidth > 0 ? 'ready' : 'resources' })\n }, [source, onLoadProgress])\n return createElement('img', { key: source, ref: image, src: source, alt: '', draggable: false,\n onLoad: () => onLoadProgress?.({ phase: 'ready' }),\n onError: () => { if (source !== model.source) setFailed(requested); else onError('avatar_image_load_failed') },\n style: { display: 'block', width: size, maxWidth: '100%', height: size * 208 / 192, objectFit: 'contain' } })\n}\n","import { createElement } from 'react'\nimport type { ReactElement } from 'react'\nimport { BUILTIN_ASSISTANT_AVATAR, BUILTIN_ASSISTANT_AVATAR_SOURCES } from '../../shared/assistant-avatar.js'\nimport { ImageAssistantAvatar } from './image.js'\nimport type { AssistantAvatarRendererProps } from './registry.js'\n\n/** 基础形象使用生图工具生成的透明 PNG,不手绘角色,也不加载第三方引擎。 */\nexport function BuiltinAssistantAvatar(props: AssistantAvatarRendererProps): ReactElement {\n const source = BUILTIN_ASSISTANT_AVATAR_SOURCES[props.model.id] ?? BUILTIN_ASSISTANT_AVATAR_SOURCES[BUILTIN_ASSISTANT_AVATAR.id]!\n return createElement(ImageAssistantAvatar, { ...props, model: { ...props.model, source } })\n}\n","import { createElement } from 'react'\nimport type { ReactElement } from 'react'\nimport type { AssistantAvatarReaction } from '../../shared/assistant-avatar.js'\nimport { resolveCodingNsTranslator } from '../locale.js'\n\n/** 角标独立于模型能力,旧包与缺失表情接口仍可提供文字反馈。 */\nexport function AssistantAvatarReactionBadge({ reaction }: { readonly reaction: AssistantAvatarReaction }): ReactElement {\n const t = resolveCodingNsTranslator()\n const labels = { success: t('awb.notifications.completed'), concerned: t('awb.notifications.error'), question: t('awb.notifications.question'), approval: t('awb.notifications.approval') }\n const icons = { success: '✓', concerned: '!', approval: '…' }\n const icon = reaction === 'question'\n ? createElement('span', { 'data-codingns-avatar-reaction-glyph': 'speech', style: { display: 'inline-flex' } }, speechIcon())\n : icons[reaction]\n return createElement('span', { role: 'status', 'aria-label': labels[reaction], title: labels[reaction], 'data-codingns-avatar-reaction': reaction,\n style: { position: 'absolute', left: '50%', top: 0, transform: 'translateX(-50%)', width: 30, height: 26, boxSizing: 'border-box', display: 'grid', placeItems: 'center', padding: 0, borderRadius: 11,\n background: '#fff', color: '#242424', border: '1px solid #b8c3d3', lineHeight: 1, pointerEvents: 'none' } }, icon)\n}\n\n/** 提问状态使用发言气泡:圆角轮廓、右下尾巴和三个空心圆点。 */\nfunction speechIcon(): ReactElement {\n return createElement('svg', { width: 20, height: 20, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.9,\n strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': true, focusable: false },\n createElement('path', { d: 'M12 3H9a7 7 0 0 0-7 7v2a7 7 0 0 0 7 7h5.5l3.5 2.5.8-4.45A7 7 0 0 0 21 12v-2a7 7 0 0 0-7-7h-2Z' }),\n createElement('circle', { cx: 7.5, cy: 11, r: 1.45 }),\n createElement('circle', { cx: 12, cy: 11, r: 1.45 }),\n createElement('circle', { cx: 16.5, cy: 11, r: 1.45 }))\n}\n","import { createElement, useEffect, useRef } from 'react'\nimport type { ReactElement } from 'react'\nimport { assistantSpriteMotion, assistantSpriteReactionMotion } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarState, AssistantSpriteMotion } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarRendererProps } from './registry.js'\n\n/** 可测试的时钟:只推进当前动作实际拥有的帧,暂停后不追赶后台时间。 */\nexport class AssistantSpriteClock {\n private frame = 0\n private last: number | undefined\n private motion: AssistantSpriteMotion | undefined\n constructor(private state: AssistantAvatarState) {}\n setState(state: AssistantAvatarState): void { if (state !== this.state) { this.state = state; this.frame = 0; this.last = undefined } }\n setMotion(motion: AssistantSpriteMotion): void {\n if (this.motion?.row === motion.row && this.motion.frames === motion.frames && this.motion.interval === motion.interval) return\n this.motion = motion; this.frame = 0; this.last = undefined\n }\n reset(): void { this.last = undefined }\n tick(now: number): { row: number; frame: number } {\n const motion = this.motion ?? assistantSpriteMotion(this.state)\n if (this.last === undefined) this.last = now\n const steps = Math.floor(Math.max(0, now - this.last) / motion.interval)\n this.frame = (this.frame + steps) % motion.frames\n this.last += steps * motion.interval\n return { row: motion.row, frame: this.frame }\n }\n}\n\n/** 参考 Signalight 的纯 DOM 图集渲染,不引入 Pixi 或上游会话逻辑。 */\nexport function SpriteSheetAssistantAvatar({ model, state, reaction, size, onError, onLoadProgress }: AssistantAvatarRendererProps): ReactElement {\n const element = useRef<HTMLDivElement | null>(null)\n const motion = assistantSpriteReactionMotion(model, state, reaction)\n const motionRef = useRef(motion)\n motionRef.current = motion\n useEffect(() => {\n // 动画被暂停时也要立即呈现新状态的第一帧。\n if (element.current !== null) element.current.style.backgroundPosition = `0% ${motion.row * 100 / (model.spriteVersion === 2 ? 10 : 8)}%`\n }, [motion.row, motion.frames, motion.interval, model.spriteVersion])\n useEffect(() => {\n const target = element.current\n if (target === null) return undefined\n onLoadProgress?.({ phase: 'resources' })\n const image = new Image()\n let disposed = false\n let frameId = 0\n const clock = new AssistantSpriteClock('idle')\n const media = window.matchMedia?.('(prefers-reduced-motion: reduce)')\n const rows = model.spriteVersion === 2 ? 11 : 9\n const paint = (now: number): void => {\n clock.setMotion(motionRef.current)\n const frame = clock.tick(now)\n // 百分比按整张背景减去一帧的剩余范围定位,窄屏缩小也不会裁掉角色。\n target.style.backgroundPosition = `${frame.frame * 100 / 7}% ${frame.row * 100 / (rows - 1)}%`\n }\n const tick = (now: number): void => { if (disposed) return; paint(now); frameId = requestAnimationFrame(tick) }\n const refresh = (): void => {\n cancelAnimationFrame(frameId)\n clock.reset()\n paint(performance.now())\n if (!disposed && !document.hidden && !media?.matches) frameId = requestAnimationFrame(tick)\n }\n image.onload = () => {\n if (disposed) return\n if (image.naturalWidth !== 192 * 8 || image.naturalHeight !== 208 * rows) {\n onError(`avatar_sprite_dimensions_invalid: expected 1536x${208 * rows}`)\n return\n }\n target.style.backgroundImage = `url(${JSON.stringify(model.source)})`\n onLoadProgress?.({ phase: 'ready', loaded: 1, total: 1 })\n refresh()\n }\n image.onerror = () => { if (!disposed) onError('avatar_sprite_load_failed') }\n image.src = model.source\n document.addEventListener('visibilitychange', refresh)\n media?.addEventListener('change', refresh)\n return () => {\n disposed = true\n image.onload = null; image.onerror = null\n cancelAnimationFrame(frameId)\n document.removeEventListener('visibilitychange', refresh)\n media?.removeEventListener('change', refresh)\n }\n }, [model.source, model.spriteVersion, onError, onLoadProgress])\n return createElement('div', { ref: element, 'aria-hidden': true, style: { width: size, aspectRatio: '192 / 208',\n maxWidth: '100%', backgroundRepeat: 'no-repeat', backgroundSize: `800% ${model.spriteVersion === 2 ? 1100 : 900}%` } })\n}\n","import { ASSISTANT_AVATAR_RESOURCE_PACKS, assistantAvatarCacheStatusPath } from '../../shared/assistant-avatar-legacy-resources.js'\nimport type { AssistantAvatarCacheStatus } from '../../shared/assistant-avatar-resources.js'\nimport { ASSISTANT_AVATAR_ASSET_PATH, ASSISTANT_AVATAR_STATUS_PATH } from '../../shared/assistant-avatar-installation.js'\n\n/** 只诊断本站固定预设;查询失败不阻断模型加载,不推测浏览器是否命中缓存。 */\nexport async function readAssistantAvatarCacheStatus(source: string, location: string, fetchStatus: typeof fetch = (...args) => fetch(...args)): Promise<AssistantAvatarCacheStatus | undefined> {\n try {\n const origin = new URL(location)\n const model = new URL(source, origin)\n const installedId = model.origin === origin.origin && model.pathname === ASSISTANT_AVATAR_ASSET_PATH ? model.searchParams.get('pack') : null\n if (installedId !== null && /^[a-f0-9]{64}$/u.test(installedId)) {\n const response = await fetchStatus(new URL(`${ASSISTANT_AVATAR_STATUS_PATH}?pack=${installedId}`, origin).href,\n { cache: 'no-store', credentials: 'same-origin', signal: AbortSignal.timeout(250) })\n if (!response.ok) return undefined\n const value = await response.json() as AssistantAvatarCacheStatus\n if (value.version !== 1 || value.pack !== installedId || typeof value.generation !== 'string' || !value.generation || value.generation.length > 80\n || [value.cached, value.pending, value.total, value.downloads].some((number) => !Number.isSafeInteger(number) || number < 0)\n || value.total > 256 || value.cached + value.pending > value.total) return undefined\n return value\n }\n const pack = ASSISTANT_AVATAR_RESOURCE_PACKS.find((entry) => model.origin === origin.origin && model.pathname === entry.basePath + entry.manifest)\n if (pack === undefined) return undefined\n const response = await fetchStatus(new URL(assistantAvatarCacheStatusPath(pack), origin).href,\n { cache: 'no-store', credentials: 'same-origin', signal: AbortSignal.timeout(250) })\n if (!response.ok) return undefined\n const value = await response.json() as Partial<AssistantAvatarCacheStatus>\n const numbers = [value.cached, value.pending, value.total, value.downloads]\n const total = pack.files.filter((file) => file.preload !== false).length\n if (value.version !== 1 || typeof value.generation !== 'string' || value.generation.length === 0 || value.generation.length > 80\n || value.pack !== pack.basePath || value.total !== total\n || numbers.some((number) => !Number.isSafeInteger(number) || number! < 0)\n || value.cached! + value.pending! > total) return undefined\n return value as AssistantAvatarCacheStatus\n } catch { return undefined }\n}\n","import { resolveAssistantAvatarAsset } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarModel, AssistantAvatarSurface } from '../../shared/assistant-avatar.js'\n\n/** 预览只包含透明 PNG,第三方渲染器也通过相同接口提交。 */\nexport interface AssistantAvatarPreview {\n readonly blob: Blob\n readonly width: number\n readonly height: number\n /** 用户头像在原始静态帧中的百分比裁剪区域;普通全身预览无需填写。 */\n readonly cropAreaPercentages?: { readonly x: number; readonly y: number; readonly width: number; readonly height: number }\n}\ninterface PreviewRecord extends AssistantAvatarPreview {\n readonly key: string\n readonly modelId: string\n readonly surface: AssistantAvatarSurface\n readonly savedAt: number\n}\nexport const AVATAR_PREVIEW_MAX_EDGE = 512\nexport const AVATAR_PREVIEW_MAX_BYTES = 512 * 1024\nexport const AVATAR_PREVIEW_MAX_ENTRIES = 8\nconst MAX_AGE = 30 * 24 * 60 * 60 * 1000\nconst DATABASE = 'codingns-assistant-avatar-previews'\nconst STORE = 'previews'\n\n/** 排序映射,避免设置归一化复制对象或属性顺序变化造成无效缓存。 */\nexport function assistantAvatarPreviewKey(model: AssistantAvatarModel, surface: AssistantAvatarSurface, rendererVersion: string,\n baseUrl: string | undefined = typeof document === 'undefined' ? undefined : document.baseURI): string {\n const asset = resolveAssistantAvatarAsset(model, surface)\n const url = (source: string): string => { try { return new URL(source, baseUrl).href } catch { return source } }\n const entries = (map: Readonly<Record<string, string>> | undefined) => Object.entries(map ?? {}).sort(([a], [b]) => a.localeCompare(b))\n return JSON.stringify([1, model.id, surface, rendererVersion, asset.renderer, url(asset.source), asset.spriteVersion,\n asset.live2d?.scale ?? 1, asset.live2d?.position ?? [0, 0], entries(asset.motionGroups), entries(asset.stateSources).map(([state, source]) => [state, url(source)])])\n}\n\nexport function validAssistantAvatarPreview(value: unknown): value is AssistantAvatarPreview {\n if (value === null || typeof value !== 'object') return false\n const preview = value as Partial<AssistantAvatarPreview>\n return preview.blob instanceof Blob && preview.blob.type === 'image/png' && preview.blob.size > 0 && preview.blob.size <= AVATAR_PREVIEW_MAX_BYTES\n && Number.isSafeInteger(preview.width) && Number.isSafeInteger(preview.height)\n && preview.width! > 0 && preview.height! > 0 && preview.width! <= AVATAR_PREVIEW_MAX_EDGE && preview.height! <= AVATAR_PREVIEW_MAX_EDGE\n && (preview.cropAreaPercentages === undefined || validCropArea(preview.cropAreaPercentages))\n}\nfunction validCropArea(area: NonNullable<AssistantAvatarPreview['cropAreaPercentages']>): boolean {\n return area !== null && typeof area === 'object' && [area.x, area.y, area.width, area.height].every(Number.isFinite)\n && area.x >= 0 && area.y >= 0 && area.width > 0 && area.height > 0 && area.x + area.width <= 100.001 && area.y + area.height <= 100.001\n}\n\n/** 开库和事务都有短超时;存储不可用只丢失预览,不影响模型显示。 */\nexport class AssistantAvatarPreviewStore {\n private database: Promise<IDBDatabase | undefined> | undefined\n constructor(private readonly factory: () => IDBFactory | undefined = () => typeof indexedDB === 'undefined' ? undefined : indexedDB,\n private readonly now: () => number = Date.now,\n private readonly databaseName = DATABASE,\n private readonly limits: { readonly maxAgeMs?: number; readonly maxEntries?: number } = {}) {}\n\n async read(key: string, signal?: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n return this.transaction('readonly', (store, result) => {\n const request = store.get(key)\n request.onsuccess = () => {\n const record = request.result as PreviewRecord | undefined\n if (this.validRecord(record) && record.key === key) result({ blob: record.blob, width: record.width, height: record.height,\n ...(record.cropAreaPercentages === undefined ? {} : { cropAreaPercentages: record.cropAreaPercentages }) })\n }\n }, signal)\n }\n\n async write(key: string, modelId: string, surface: AssistantAvatarSurface, preview: AssistantAvatarPreview, signal?: AbortSignal): Promise<boolean> {\n if (!validAssistantAvatarPreview(preview)) return false\n return await this.transaction<boolean>('readwrite', (store, result) => {\n const request = store.getAll()\n request.onsuccess = () => {\n const records: PreviewRecord[] = []\n for (const entry of request.result as PreviewRecord[]) {\n // 同一形象/展示位置只留最新版本;默认预览最多 8 项,用户头像可配置独立上限。\n if (!this.validRecord(entry) || (entry.modelId === modelId && entry.surface === surface)) store.delete(entry.key)\n else records.push(entry)\n }\n records.sort((a, b) => b.savedAt - a.savedAt)\n for (const entry of records.slice((this.limits.maxEntries ?? AVATAR_PREVIEW_MAX_ENTRIES) - 1)) store.delete(entry.key)\n store.put({ key, modelId, surface, ...preview, savedAt: this.now() } satisfies PreviewRecord)\n result(true)\n }\n }, signal) ?? false\n }\n\n async remove(key: string): Promise<void> { await this.transaction('readwrite', (store) => { store.delete(key) }) }\n async removeModel(modelId: string): Promise<void> {\n await this.transaction('readwrite', (store) => {\n const request = store.getAll()\n request.onsuccess = () => { for (const entry of request.result as PreviewRecord[]) if (entry.modelId === modelId) store.delete(entry.key) }\n })\n }\n\n private validRecord(value: unknown): value is PreviewRecord {\n if (!validAssistantAvatarPreview(value)) return false\n const entry = value as PreviewRecord\n return typeof entry.key === 'string' && typeof entry.modelId === 'string' && (entry.surface === 'floating' || entry.surface === 'dialog')\n && Number.isFinite(entry.savedAt) && entry.savedAt <= this.now() && this.now() - entry.savedAt < (this.limits.maxAgeMs ?? MAX_AGE)\n }\n\n private open(): Promise<IDBDatabase | undefined> {\n if (this.database !== undefined) return this.database\n const task = new Promise<IDBDatabase | undefined>((resolve) => {\n let request: IDBOpenDBRequest\n try {\n const factory = this.factory()\n if (factory === undefined) { resolve(undefined); return }\n request = factory.open(this.databaseName, 1)\n } catch { resolve(undefined); return }\n let settled = false\n const finish = (database?: IDBDatabase): void => { if (settled) { database?.close(); return }; settled = true; clearTimeout(timer); resolve(database) }\n const timer = setTimeout(() => finish(), 1000)\n request.onupgradeneeded = () => { if (!request.result.objectStoreNames.contains(STORE)) request.result.createObjectStore(STORE, { keyPath: 'key' }) }\n request.onerror = () => finish()\n request.onblocked = () => finish()\n request.onsuccess = () => {\n request.result.onversionchange = () => { request.result.close(); this.database = undefined }\n finish(request.result)\n }\n })\n this.database = task\n void task.then((database) => { if (database === undefined && this.database === task) this.database = undefined })\n return task\n }\n\n private async transaction<T>(mode: IDBTransactionMode, action: (store: IDBObjectStore, result: (value: T) => void) => void,\n signal?: AbortSignal): Promise<T | undefined> {\n if (signal?.aborted) return undefined\n const database = await this.open()\n if (database === undefined || signal?.aborted) return undefined\n return new Promise((resolve) => {\n let transaction: IDBTransaction\n try { transaction = database.transaction(STORE, mode) } catch { this.database = undefined; resolve(undefined); return }\n let value: T | undefined\n const abort = (): void => { try { transaction.abort() } catch { /* 事务已结束,无需再次处理。 */ } }\n const timer = setTimeout(abort, 1000)\n const finish = (success: boolean): void => { clearTimeout(timer); signal?.removeEventListener('abort', abort); resolve(success ? value : undefined) }\n transaction.oncomplete = () => finish(true)\n transaction.onabort = () => finish(false)\n transaction.onerror = () => finish(false)\n signal?.addEventListener('abort', abort, { once: true })\n try { action(transaction.objectStore(STORE), (next) => { value = next }) } catch { abort(); finish(false) }\n })\n }\n}\n\nexport const assistantAvatarPreviewStore = new AssistantAvatarPreviewStore()\n","import { AVATAR_PREVIEW_MAX_EDGE, validAssistantAvatarPreview } from './preview-store.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\n\n/** 在同步绘制窗口拷贝到 2D 画布;PNG 编码异步执行,不保留原 GPU 缓冲。 */\nfunction copyCanvasFrame(source: HTMLCanvasElement): HTMLCanvasElement | undefined {\n if (source.width <= 0 || source.height <= 0) return undefined\n const canvas = document.createElement('canvas')\n const scale = Math.min(1, AVATAR_PREVIEW_MAX_EDGE / Math.max(source.width, source.height))\n canvas.width = Math.max(1, Math.round(source.width * scale)); canvas.height = Math.max(1, Math.round(source.height * scale))\n const context = canvas.getContext('2d', { willReadFrequently: true })\n if (context === null) return undefined\n context.drawImage(source, 0, 0, canvas.width, canvas.height)\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data\n // 全透明不代表已渲染,不能写入缓存并在刷新后显示空白。\n for (let index = 3; index < pixels.length; index += 4) if (pixels[index]! > 0) return canvas\n return undefined\n}\n\n/** 只临时观察当前上下文的绘制,在同一帧微任务中捕获完整图像,完成/取消后还原。 */\nexport function captureAssistantAvatarPreview(source: HTMLCanvasElement, signal?: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n if (signal?.aborted) return Promise.resolve(undefined)\n return new Promise((resolve) => {\n let settled = false\n let queued = false\n const restore: (() => void)[] = []\n const finish = (preview?: AssistantAvatarPreview): void => {\n if (settled) return\n settled = true; clearTimeout(timer); signal?.removeEventListener('abort', abort)\n for (const release of restore.splice(0).reverse()) release()\n resolve(preview)\n }\n const abort = (): void => finish()\n const timer = setTimeout(abort, 1000)\n signal?.addEventListener('abort', abort, { once: true })\n const capture = (): boolean => {\n if (settled || signal?.aborted) return true\n try {\n const canvas = copyCanvasFrame(source)\n if (canvas === undefined) return false\n // 图片已拷贝,不再挂住引擎绘制函数,编码期间也不干扰后续动画。\n for (const release of restore.splice(0).reverse()) release()\n canvas.toBlob((blob) => {\n const preview = blob === null ? undefined : { blob, width: canvas.width, height: canvas.height }\n finish(validAssistantAvatarPreview(preview) ? preview : undefined)\n }, 'image/png')\n return true\n } catch { finish(); return true } // 跨域或不可读取的模型继续显示,只跳过预览。\n }\n try {\n const context = source.getContext('webgl2') ?? source.getContext('webgl')\n if (context === null) { if (!capture()) finish(); return }\n for (const name of ['drawElements', 'drawArrays'] as const) {\n const original = context[name]\n const descriptor = Object.getOwnPropertyDescriptor(context, name)\n const observe = (...args: number[]): void => {\n Reflect.apply(original, context, args)\n if (!queued && !settled) {\n queued = true\n queueMicrotask(() => { queued = false; capture() })\n }\n }\n Object.defineProperty(context, name, { configurable: true, writable: true, value: observe })\n restore.push(() => {\n if (context[name] !== observe) return\n try {\n if (descriptor === undefined) delete (context as unknown as Record<string, unknown>)[name]\n else Object.defineProperty(context, name, descriptor)\n } catch { /* 外部冻结上下文时仍结束等待,不将预览清理失败传播给模型。 */ }\n })\n }\n capture()\n } catch { finish() }\n })\n}\n","import type { AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport { assistantAvatarImageSource, BUILTIN_ASSISTANT_AVATAR, BUILTIN_ASSISTANT_AVATAR_SOURCES } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\n\nexport const ASSISTANT_AVATAR_PORTRAIT_SIZE = 128\nexport interface AssistantAvatarPortraitCrop { readonly x: number; readonly y: number; readonly size: number }\nexport interface AssistantAvatarPortraitArea { readonly x: number; readonly y: number; readonly width: number; readonly height: number }\n\n/** 先去掉透明边距,再取上部角色轮廓;不修改原素材,也不识别具体角色 ID。 */\nexport function assistantAvatarPortraitCrop(pixels: Uint8ClampedArray, width: number, height: number): AssistantAvatarPortraitCrop | undefined {\n if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) || width < 1 || height < 1 || width > 512 || height > 512 || pixels.length !== width * height * 4) return undefined\n let left = width, right = -1, top = height, bottom = -1\n for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) {\n if (pixels[(y * width + x) * 4 + 3]! < 24) continue\n left = Math.min(left, x); right = Math.max(right, x); top = Math.min(top, y); bottom = Math.max(bottom, y)\n }\n if (right < left) return undefined\n const upperBottom = Math.min(bottom, top + Math.ceil((bottom - top + 1) * .56))\n let upperLeft = width, upperRight = -1\n for (let y = top; y <= upperBottom; y++) for (let x = left; x <= right; x++) {\n if (pixels[(y * width + x) * 4 + 3]! < 24) continue\n upperLeft = Math.min(upperLeft, x); upperRight = Math.max(upperRight, x)\n }\n const size = Math.max(1, Math.ceil(Math.max(upperRight - upperLeft + 1, upperBottom - top + 1) * 1.08))\n return { x: (upperLeft + upperRight + 1 - size) / 2, y: top - size * .04, size }\n}\n\n/** 图片和动作图集只加载一张现有素材;跨域不允许截图时安静回退。 */\nexport async function createImageAssistantAvatarPortrait(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n return portraitFromImage(assistantAvatarImageSource(model, 'idle'), signal)\n}\nexport async function createBuiltinAssistantAvatarPortrait(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n return portraitFromImage(BUILTIN_ASSISTANT_AVATAR_SOURCES[model.id] ?? BUILTIN_ASSISTANT_AVATAR_SOURCES[BUILTIN_ASSISTANT_AVATAR.id]!, signal)\n}\nexport async function createSpriteAssistantAvatarPortrait(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const image = await loadImage(model.source, signal)\n const rows = model.spriteVersion === 2 ? 11 : 9\n if (image === undefined || image.naturalWidth !== 1536 || image.naturalHeight !== 208 * rows) return undefined\n // v1/v2 的待机首帧均为左上 192×208,绝不能缩放整张图集作为头像。\n return cropImage(image, signal, { x: 0, y: 0, width: 192, height: 208 })\n}\n/** 微调使用完整静态角色或图集首帧,避免在已裁好的小头像上继续损失构图。 */\nexport async function createImageAssistantAvatarPortraitSource(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const image = await loadImage(assistantAvatarImageSource(model, 'idle'), signal)\n return image === undefined ? undefined : imageFrame(image, signal)\n}\nexport async function createBuiltinAssistantAvatarPortraitSource(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n return createImageAssistantAvatarPortraitSource({ ...model, source: BUILTIN_ASSISTANT_AVATAR_SOURCES[model.id] ?? BUILTIN_ASSISTANT_AVATAR_SOURCES[BUILTIN_ASSISTANT_AVATAR.id]! }, signal)\n}\nexport async function createSpriteAssistantAvatarPortraitSource(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const image = await loadImage(model.source, signal)\n if (image === undefined || image.naturalWidth !== 1536 || image.naturalHeight !== 208 * (model.spriteVersion === 2 ? 11 : 9)) return undefined\n return imageFrame(image, signal, { x: 0, y: 0, width: 192, height: 208 })\n}\nasync function imageFrame(image: HTMLImageElement, signal: AbortSignal,\n frame = { x: 0, y: 0, width: image.naturalWidth, height: image.naturalHeight }): Promise<AssistantAvatarPreview | undefined> {\n if (signal.aborted || typeof document === 'undefined') return undefined\n try {\n const scale = Math.min(1, 512 / Math.max(frame.width, frame.height)), canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(frame.width * scale)); canvas.height = Math.max(1, Math.round(frame.height * scale))\n const context = canvas.getContext('2d')\n if (context === null) return undefined\n context.drawImage(image, frame.x, frame.y, frame.width, frame.height, 0, 0, canvas.width, canvas.height)\n return await encodePortrait(canvas, signal)\n } catch { return undefined }\n}\n/** 裁剪组件仅负责交互及坐标;像素输出保留透明背景并统一成 128px。 */\nexport async function cropAssistantAvatarPortrait(source: AssistantAvatarPreview, area: AssistantAvatarPortraitArea,\n signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n if (signal.aborted || ![area.x, area.y, area.width, area.height].every(Number.isFinite)\n || area.width <= 0 || area.height <= 0 || Math.abs(area.width - area.height) > 1\n || area.x < 0 || area.y < 0 || area.x + area.width > source.width + 1 || area.y + area.height > source.height + 1) return undefined\n const url = URL.createObjectURL(source.blob)\n try {\n const image = await loadImage(url, signal)\n if (image === undefined || typeof document === 'undefined') return undefined\n const canvas = document.createElement('canvas'); canvas.width = 128; canvas.height = 128\n const context = canvas.getContext('2d')\n if (context === null) return undefined\n context.imageSmoothingQuality = 'high'\n context.drawImage(image, area.x, area.y, area.width, area.height, 0, 0, 128, 128)\n return await encodePortrait(canvas, signal)\n } catch { return undefined }\n finally { URL.revokeObjectURL(url) }\n}\n/** 初始化裁剪框仍落在角色上部,组件随后负责拖动与缩放。 */\nexport async function initialAssistantAvatarPortraitArea(source: AssistantAvatarPreview, signal: AbortSignal): Promise<AssistantAvatarPortraitArea | undefined> {\n if (signal.aborted) return undefined\n const url = URL.createObjectURL(source.blob)\n try {\n const image = await loadImage(url, signal)\n if (image === undefined || typeof document === 'undefined') return undefined\n const canvas = document.createElement('canvas'); canvas.width = source.width; canvas.height = source.height\n const context = canvas.getContext('2d', { willReadFrequently: true })\n if (context === null) return undefined\n context.drawImage(image, 0, 0, canvas.width, canvas.height)\n const crop = assistantAvatarPortraitCrop(context.getImageData(0, 0, canvas.width, canvas.height).data, canvas.width, canvas.height)\n if (crop === undefined) return undefined\n const size = Math.min(crop.size, canvas.width, canvas.height)\n return { x: Math.max(0, Math.min(canvas.width - size, crop.x)) / canvas.width * 100,\n y: Math.max(0, Math.min(canvas.height - size, crop.y)) / canvas.height * 100, width: size / canvas.width * 100, height: size / canvas.height * 100 }\n } catch { return undefined }\n finally { URL.revokeObjectURL(url) }\n}\nexport async function createAssistantAvatarPortraitFromPreview(preview: AssistantAvatarPreview, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n if (signal.aborted) return undefined\n const url = URL.createObjectURL(preview.blob)\n try { return await portraitFromImage(url, signal) }\n finally { URL.revokeObjectURL(url) }\n}\nasync function portraitFromImage(source: string, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const image = await loadImage(source, signal)\n return image === undefined ? undefined : cropImage(image, signal)\n}\nfunction loadImage(source: string, signal: AbortSignal): Promise<HTMLImageElement | undefined> {\n if (signal.aborted || typeof Image === 'undefined') return Promise.resolve(undefined)\n return new Promise((resolve) => {\n const image = new Image()\n let finished = false\n const finish = (success = false): void => {\n if (finished) return\n finished = true; clearTimeout(timer); signal.removeEventListener('abort', abort)\n image.onload = null; image.onerror = null\n if (!success) image.src = ''\n resolve(success ? image : undefined)\n }\n const abort = (): void => finish()\n const timer = setTimeout(abort, 30000)\n signal.addEventListener('abort', abort, { once: true })\n image.crossOrigin = 'anonymous'\n image.onload = () => finish(image.naturalWidth > 0 && image.naturalHeight > 0)\n image.onerror = abort\n image.src = source\n })\n}\nasync function cropImage(image: HTMLImageElement, signal: AbortSignal,\n frame = { x: 0, y: 0, width: image.naturalWidth, height: image.naturalHeight }): Promise<AssistantAvatarPreview | undefined> {\n if (signal.aborted || typeof document === 'undefined') return undefined\n try {\n // 轮廓分析最多读取 512×512,避免大图和整张动作图集增加头像生成成本。\n const scale = Math.min(1, 512 / Math.max(frame.width, frame.height))\n const sample = document.createElement('canvas')\n sample.width = Math.max(1, Math.round(frame.width * scale)); sample.height = Math.max(1, Math.round(frame.height * scale))\n const context = sample.getContext('2d', { willReadFrequently: true })\n if (context === null) return undefined\n context.drawImage(image, frame.x, frame.y, frame.width, frame.height, 0, 0, sample.width, sample.height)\n const crop = assistantAvatarPortraitCrop(context.getImageData(0, 0, sample.width, sample.height).data, sample.width, sample.height)\n if (crop === undefined) return undefined\n const output = document.createElement('canvas')\n output.width = ASSISTANT_AVATAR_PORTRAIT_SIZE; output.height = ASSISTANT_AVATAR_PORTRAIT_SIZE\n const target = output.getContext('2d')\n if (target === null) return undefined\n target.imageSmoothingEnabled = true; target.imageSmoothingQuality = 'high'\n // 用平移缩放保留越界透明边距,避免 drawImage 对负裁剪坐标缩短头像。\n const zoom = output.width / crop.size\n target.setTransform(zoom, 0, 0, zoom, -crop.x * zoom, -crop.y * zoom)\n target.drawImage(sample, 0, 0)\n return await encodePortrait(output, signal)\n } catch { return undefined }\n}\nfunction encodePortrait(canvas: HTMLCanvasElement, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n return new Promise((resolve) => {\n let settled = false\n const finish = (blob?: Blob | null): void => {\n if (settled) return\n settled = true; clearTimeout(timer); signal.removeEventListener('abort', abort)\n resolve(!signal.aborted && blob !== undefined && blob !== null && blob.size > 0 && blob.size <= 512 * 1024\n ? { blob, width: canvas.width, height: canvas.height } : undefined)\n }\n const abort = (): void => finish()\n const timer = setTimeout(abort, 1000)\n signal.addEventListener('abort', abort, { once: true })\n if (signal.aborted) { finish(); return }\n canvas.toBlob((blob) => finish(blob), 'image/png')\n })\n}\n","import { createElement, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport { ASSISTANT_AVATAR_RUNTIME_PATH, assistantAvatarVoicePriority } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarAsset, AssistantAvatarReaction, AssistantAvatarState } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarRendererProps } from './registry.js'\nimport type { AssistantAvatarLoadProgress } from './loading.js'\nimport { readAssistantAvatarCacheStatus } from './cache-status.js'\nimport { captureAssistantAvatarPreview } from './preview-capture.js'\nimport type { AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport { createAssistantAvatarPortraitFromPreview } from './portrait-capture.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\nimport { assistantAvatarRuntimeRevision } from '../../shared/assistant-avatar-engine.js'\n\n/** 仅声明适配器消费的事件契约,编译和默认安装均不依赖外部引擎代码。 */\nexport interface AssistantLive2dEventMap {\n loadstart: (total: number) => void\n loadprogress: (loaded: number, total: number, path: string) => void\n loaded: () => void\n}\nexport interface AssistantLive2dRuntime {\n load(options: { path: string; scale: number; position?: [number, number]; volume: number; logLevel: 'warn' }): Promise<void>\n getMotions(): Record<string, string[]>\n playMotion(group: string, index?: number, priority?: number): void\n getExpressions?(): string[]\n setExpression?(id: string): void\n /** l2d 2.1.1 没有清除接口;缺少此能力时不设置持续表情,避免随机表情假装复位。 */\n clearExpression?(): void\n resize(): void\n destroy(): void\n getCanvas?(): HTMLCanvasElement\n on?<K extends keyof AssistantLive2dEventMap>(event: K, listener: AssistantLive2dEventMap[K]): unknown\n}\ninterface AssistantLive2dModule { init(canvas: HTMLCanvasElement): AssistantLive2dRuntime | null }\n\n/** 成功共享引擎;失败更换模块 URL,避免浏览器缓存失败的动态导入而无法恢复。 */\nexport class AssistantLive2dModuleLoader {\n private module: Promise<AssistantLive2dModule> | undefined\n private attempt = 0\n private retryAt = 0\n private revision = assistantAvatarRuntimeRevision()\n constructor(private readonly importModule: (url: string) => Promise<AssistantLive2dModule> = (url) => import(/* @vite-ignore */ url),\n private readonly fetchStatus: typeof fetch = (...args) => fetch(...args)) {}\n load(location: string): Promise<AssistantLive2dModule> {\n if (this.revision !== assistantAvatarRuntimeRevision() || (this.retryAt > 0 && Date.now() >= this.retryAt)) {\n this.revision = assistantAvatarRuntimeRevision(); this.module = undefined; this.retryAt = 0\n }\n if (this.module !== undefined) return this.module\n const url = new URL(ASSISTANT_AVATAR_RUNTIME_PATH, location)\n url.searchParams.set('v', '2.1.1')\n const attempt = this.attempt++\n if (attempt > 0) url.searchParams.set('retry', String(attempt))\n const request = withLoadDeadline(this.importModule(url.href), 45000).then((module) => {\n if (typeof module.init !== 'function') throw new Error('avatar_runtime_invalid')\n return module\n }).catch(async (error: unknown) => {\n if (this.module === request) this.retryAt = Date.now() + 30_000\n // 动态 import 的错误不包含 HTTP 状态;只在失败时读取状态,不增加成功加载请求。\n let status: number | undefined\n try { status = (await this.fetchStatus(url, { credentials: 'same-origin', signal: AbortSignal.timeout(5000) })).status }\n catch { /* 状态探测失败时保留最初的引擎错误。 */ }\n if (status === 503) throw new Error('avatar_runtime_unavailable')\n if (status !== undefined && status !== 200) throw new Error(`avatar_runtime_http_${status}`)\n throw error\n })\n this.module = request\n return request\n }\n}\nconst runtimeModuleLoader = new AssistantLive2dModuleLoader()\n\n/** 固定同源独立 ESM,只在用户选择 Live2D 时加载;不进入主 Client bundle。 */\nfunction loadLive2dModule(): Promise<AssistantLive2dModule> {\n return runtimeModuleLoader.load(window.location.href)\n}\n\n/** l2d 某些下载失败只记录日志而不拒绝 Promise,必须限制永久等待。 */\nasync function withLoadDeadline<T>(task: Promise<T>, timeoutMs: number,\n observeActivity?: (refresh: (() => void) | undefined) => void): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([task, new Promise<never>((_resolve, reject) => {\n const refresh = (): void => {\n clearTimeout(timer)\n timer = setTimeout(() => reject(new Error('avatar_load_timeout')), timeoutMs)\n }\n observeActivity?.(refresh)\n refresh()\n })])\n } finally { clearTimeout(timer); observeActivity?.(undefined) }\n}\n\n/** 参考上游 load/setState/resize/destroy;旧加载完成不能复活已销毁实例。 */\nexport class AssistantLive2dController {\n private disposed = false\n private state: AssistantAvatarState = 'idle'\n private reaction: AssistantAvatarReaction | undefined\n private appliedExpression: string | undefined\n private appliedMotion: string | undefined\n private loaded = false\n private loadConfirmed = false\n private cancelLoad: (() => void) | undefined\n private refreshDeadline: (() => void) | undefined\n private report: ((progress: AssistantAvatarLoadProgress) => void) | undefined\n constructor(private readonly runtime: AssistantLive2dRuntime, private readonly motionGroups?: AssistantAvatarAsset['motionGroups'],\n private readonly options?: AssistantAvatarAsset['live2d'], report?: (progress: AssistantAvatarLoadProgress) => void,\n private readonly timeoutMs = 45000,\n private readonly reactions?: Pick<AssistantAvatarAsset, 'reactionMotionGroups' | 'reactionExpressions'>) {\n this.report = report\n runtime.on?.('loadstart', (total) => {\n if (this.disposed) return\n this.refreshDeadline?.()\n this.report?.({ phase: 'resources', loaded: 0, total })\n })\n runtime.on?.('loadprogress', (loaded, total) => {\n if (this.disposed) return\n this.refreshDeadline?.()\n this.report?.({ phase: total > 0 && loaded >= total ? 'rendering' : 'resources', loaded, total })\n })\n runtime.on?.('loaded', () => { if (!this.disposed) this.loadConfirmed = true })\n }\n async load(source: string): Promise<boolean> {\n if (this.disposed) return false\n this.loadConfirmed = false\n try {\n const operation = this.runtime.load({ path: source, scale: this.options?.scale ?? 1, volume: 0, logLevel: 'warn',\n ...(this.options?.position === undefined ? {} : { position: [...this.options.position] as [number, number] }) })\n .then(() => {\n if (this.disposed) { this.runtime.destroy(); return false }\n // 真实引擎可能静默返回;只有 loaded 事件才证明初始化成功。\n if (this.runtime.on !== undefined && !this.loadConfirmed) throw new Error('avatar_model_not_loaded')\n return true\n }, (error: unknown) => { if (this.disposed) { this.runtime.destroy(); return false } throw error })\n const cancelled = new Promise<false>((resolve) => { this.cancelLoad = () => resolve(false) })\n // 大模型持续有文件进度时继续等待,只对长时间没有进展的加载超时。\n if (!await withLoadDeadline(Promise.race([operation, cancelled]), this.timeoutMs, (refresh) => { this.refreshDeadline = refresh })) return false\n this.loaded = true\n this.setState(this.state)\n return true\n } catch (error) { this.dispose(); throw error }\n finally { this.cancelLoad = undefined }\n }\n setState(state: AssistantAvatarState): void {\n if (this.disposed) return\n this.state = state\n if (!this.loaded) return\n this.apply()\n }\n setReaction(reaction: AssistantAvatarReaction | undefined): void {\n if (this.disposed || this.reaction === reaction) return\n this.reaction = reaction\n if (this.loaded) this.apply()\n }\n private apply(): void {\n const state = this.state\n const groups = Object.keys(this.runtime.getMotions())\n const desired = state === 'speaking' ? /talk|speak/iu : state === 'thinking' ? /think|work/iu\n : state === 'error' ? /fail|error|sad/iu : state === 'listening' || state === 'waiting' ? /listen|wait/iu : /idle/iu\n const configured = this.motionGroups?.[state]\n const reactionMotion = this.reaction === undefined || assistantAvatarVoicePriority(state) ? undefined : this.reactions?.reactionMotionGroups?.[this.reaction]\n const group = typeof reactionMotion === 'string' && groups.includes(reactionMotion) ? reactionMotion\n : configured !== undefined && groups.includes(configured) ? configured\n : groups.find((name) => desired.test(name)) ?? groups.find((name) => /idle/iu.test(name))\n if (group !== undefined && group !== this.appliedMotion) { this.runtime.playMotion(group, undefined, 2); this.appliedMotion = group }\n this.applyExpression()\n }\n private applyExpression(): void {\n const runtime = this.runtime\n // 完整能力与模型声明同时成立才应用;当前引擎不能清除时使用角标/动作。\n if (typeof runtime.getExpressions !== 'function' || typeof runtime.setExpression !== 'function' || typeof runtime.clearExpression !== 'function') return\n try {\n const requested = this.reaction === undefined || assistantAvatarVoicePriority(this.state)\n ? undefined : this.reactions?.reactionExpressions?.[this.reaction]\n const next = requested !== undefined && runtime.getExpressions().includes(requested) ? requested : undefined\n if (next === this.appliedExpression) return\n if (next === undefined) runtime.clearExpression()\n else runtime.setExpression(next)\n this.appliedExpression = next\n } catch { /* 可选表情能力失败时保留语音动作和角标,不关闭形象。 */ }\n }\n resize(): void { if (!this.disposed && this.loaded) this.runtime.resize() }\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n // 上游只有 on,没有 off;清空回调引用并隔离迟到事件,避免持有旧 React 插槽。\n this.report = undefined\n if (this.appliedExpression !== undefined) { try { this.runtime.clearExpression?.() } catch { /* 销毁仍继续。 */ } }\n this.cancelLoad?.()\n this.runtime.destroy()\n }\n}\n\n/** 没有已绘制预览时只生成一次头像;捕获后立即销毁临时 WebGL 实例。 */\nexport async function createLive2dAssistantAvatarPortrait(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const preview = await createLive2dAssistantAvatarPortraitSource(model, signal)\n return preview === undefined ? undefined : createAssistantAvatarPortraitFromPreview(preview, signal)\n}\n/** 编辑器复用同一静态帧来源,临时实例的销毁仍由适配器统一完成。 */\nexport async function createLive2dAssistantAvatarPortraitSource(model: AssistantAvatarModel, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n if (signal.aborted || typeof document === 'undefined') return undefined\n const module = await loadLive2dModule()\n if (signal.aborted) return undefined\n const canvas = document.createElement('canvas')\n canvas.width = 512; canvas.height = 555\n canvas.style.cssText = 'position:fixed;left:-10000px;top:0;width:256px;height:277.5px;pointer-events:none;opacity:0'\n canvas.setAttribute('aria-hidden', 'true')\n document.body.appendChild(canvas)\n let controller: AssistantLive2dController | undefined\n const abort = (): void => controller?.dispose()\n try {\n const runtime = module.init(canvas)\n if (runtime === null) return undefined\n controller = new AssistantLive2dController(runtime, model.motionGroups, model.live2d)\n signal.addEventListener('abort', abort, { once: true })\n if (signal.aborted || !await controller.load(model.source) || signal.aborted) return undefined\n return await captureAssistantAvatarPreview(runtime.getCanvas?.() ?? canvas, signal)\n } finally { signal.removeEventListener('abort', abort); controller?.dispose(); canvas.remove() }\n}\n\nexport function Live2dAssistantAvatar({ model, state, reaction, size, onError, onLoadProgress, diagnostics = false, onPreview }: AssistantAvatarRendererProps): ReactElement {\n const configKey = JSON.stringify([model.motionGroups, model.live2d, model.reactionMotionGroups, model.reactionExpressions])\n // 设置归一化会复制 JSON;等值映射不能因为父组件刷新而重载整个 WebGL 模型。\n const config = useMemo(() => ({ motionGroups: model.motionGroups, options: model.live2d, reactionMotionGroups: model.reactionMotionGroups, reactionExpressions: model.reactionExpressions }), [configKey])\n const canvas = useRef<HTMLCanvasElement | null>(null)\n const controller = useRef<AssistantLive2dController | undefined>(undefined)\n const currentState = useRef(state)\n currentState.current = state\n const currentReaction = useRef(reaction)\n currentReaction.current = reaction\n const [visible, setVisible] = useState(() => typeof document === 'undefined' || !document.hidden)\n useEffect(() => {\n const refresh = (): void => setVisible(!document.hidden)\n document.addEventListener('visibilitychange', refresh)\n return () => document.removeEventListener('visibilitychange', refresh)\n }, [])\n useEffect(() => {\n const target = canvas.current\n if (target === null || !visible) return undefined\n let disposed = false\n let instance: AssistantLive2dController | undefined\n const previewController = new AbortController()\n const started = diagnostics ? performance.now() : 0\n let progress: AssistantAvatarLoadProgress = { phase: 'engine' }\n const report = (next: AssistantAvatarLoadProgress): void => {\n if (disposed) return\n if (!diagnostics) { onLoadProgress?.(next); return }\n const elapsedMs = performance.now() - started\n progress = { ...progress, ...next, elapsedMs,\n ...(next.phase === 'rendering' && progress.resourcesMs === undefined ? { resourcesMs: elapsedMs } : {}) }\n onLoadProgress?.(progress)\n }\n report(progress)\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(() => instance?.resize())\n observer?.observe(target)\n // 正式环境不启动缓存诊断,也不等待它;Stage0 才采集真实前后快照。\n void Promise.all([loadLive2dModule(), diagnostics ? readAssistantAvatarCacheStatus(model.source, window.location.href) : undefined]).then(async ([module, before]) => {\n if (disposed) return\n report({ phase: 'resources', ...(before === undefined ? {} : { cacheBefore: before }) })\n const runtime = module.init(target)\n if (runtime === null) throw new Error('avatar_webgl_unavailable')\n instance = new AssistantLive2dController(runtime, config.motionGroups, config.options, report, 45000, {\n ...(config.reactionMotionGroups === undefined ? {} : { reactionMotionGroups: config.reactionMotionGroups }),\n ...(config.reactionExpressions === undefined ? {} : { reactionExpressions: config.reactionExpressions }) })\n controller.current = instance\n instance.setState(currentState.current)\n instance.setReaction(currentReaction.current)\n if (!await instance.load(model.source) || disposed) return\n if (onPreview !== undefined) {\n // 引擎 loaded 时首帧可能还未绘制;等待有效绘制后才替换本地静态预览。\n const preview = await captureAssistantAvatarPreview(runtime.getCanvas?.() ?? target, previewController.signal)\n if (disposed) return\n if (preview !== undefined) onPreview(preview)\n }\n report({ phase: 'ready' })\n if (!diagnostics) return\n // 加载已完成,诊断不推迟角色显示;保留真实完成耗时,排除诊断响应时间。\n const finished = progress\n const after = await readAssistantAvatarCacheStatus(model.source, window.location.href)\n if (!disposed && after !== undefined) {\n progress = { ...finished, cacheAfter: after }\n onLoadProgress?.(progress)\n }\n }).catch((error: unknown) => { if (!disposed) onError(error instanceof Error ? error.message : String(error)) })\n return () => { disposed = true; previewController.abort(); observer?.disconnect(); instance?.dispose(); controller.current = undefined }\n }, [model.source, config, visible, onError, onLoadProgress, diagnostics, onPreview])\n useEffect(() => { controller.current?.setState(state) }, [state])\n useEffect(() => { controller.current?.setReaction(reaction) }, [reaction])\n return createElement('canvas', { ref: canvas, width: Math.round(size * 2), height: Math.round(size * 208 / 192 * 2), 'aria-hidden': true,\n style: { width: size, height: 'auto', aspectRatio: '192 / 208', maxWidth: '100%', display: 'block' } })\n}\n","/** 所有形象适配器与渲染器共用稳定注册快照;注销只清理自己的一代。 */\nexport class AssistantAvatarRegistration<T extends { readonly id: string }> {\n private readonly entries = new Map<string, T>()\n private readonly reserved: Set<string>\n private readonly listeners = new Set<() => void>()\n private snapshot: readonly T[]\n constructor(builtins: readonly T[] = []) {\n for (const entry of builtins) this.entries.set(entry.id, entry)\n this.reserved = new Set(this.entries.keys())\n this.snapshot = Object.freeze([...this.entries.values()])\n }\n readonly subscribe = (listener: () => void): (() => void) => { this.listeners.add(listener); return () => { this.listeners.delete(listener) } }\n readonly getSnapshot = (): readonly T[] => this.snapshot\n get(id: string): T | undefined { return this.entries.get(id) }\n register(entry: T): () => void {\n if (!/^[A-Za-z][A-Za-z0-9_-]{0,79}$/u.test(entry.id) || this.reserved.has(entry.id)) throw new TypeError('形象扩展 ID 无效或占用内置名称')\n if (this.entries.has(entry.id)) throw new TypeError(`形象扩展已注册: ${entry.id}`)\n this.entries.set(entry.id, entry); this.emit()\n return () => {\n if (this.entries.get(entry.id) !== entry) return\n this.entries.delete(entry.id); this.emit()\n }\n }\n private emit(): void { this.snapshot = Object.freeze([...this.entries.values()]); for (const listener of this.listeners) listener() }\n}\n","import type { ComponentType } from 'react'\nimport type { AssistantAvatarModel, AssistantAvatarReaction, AssistantAvatarState, AssistantAvatarSurface } from '../../shared/assistant-avatar.js'\nimport type { CodingNsClientServices } from '../features/types.js'\nimport { BuiltinAssistantAvatar } from './builtin.js'\nimport { ImageAssistantAvatar } from './image.js'\nimport { SpriteSheetAssistantAvatar } from './spritesheet.js'\nimport { Live2dAssistantAvatar, createLive2dAssistantAvatarPortrait, createLive2dAssistantAvatarPortraitSource } from './live2d.js'\nimport { createBuiltinAssistantAvatarPortrait, createImageAssistantAvatarPortrait, createSpriteAssistantAvatarPortrait,\n createBuiltinAssistantAvatarPortraitSource, createImageAssistantAvatarPortraitSource, createSpriteAssistantAvatarPortraitSource } from './portrait-capture.js'\nimport { AssistantAvatarRegistration } from './registration.js'\nimport type { AssistantAvatarLoadProgress } from './loading.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\n\nexport interface AssistantAvatarRendererProps {\n readonly model: AssistantAvatarModel\n readonly state: AssistantAvatarState\n readonly reaction?: AssistantAvatarReaction\n readonly surface: AssistantAvatarSurface\n readonly size: number\n readonly onError: (message: string) => void\n readonly onLoadProgress?: (progress: AssistantAvatarLoadProgress) => void\n /** 统一插槽在 Stage0 开启诊断;正式环境不应采集缓存快照和耗时。 */\n readonly diagnostics?: boolean\n /** 提交成功绘制的透明预览;存储与显示生命周期由统一插槽管理。 */\n readonly onPreview?: (preview: AssistantAvatarPreview) => void\n}\nexport interface AssistantAvatarRenderer {\n readonly id: string\n readonly name?: string\n readonly labelKey?: string\n readonly component: ComponentType<AssistantAvatarRendererProps>\n /** 只有主动报告进度的渲染器才自动显示占位,旧扩展无需修改。 */\n readonly reportsLoading?: true\n readonly initialLoadPhase?: 'engine' | 'resources'\n readonly reportsCache?: true\n /** 支持预览的渲染器声明稳定版本;构图或捕获策略变化时更新版本以失效缓存。 */\n readonly previewVersion?: string\n /** 自动头像由渲染适配器提供;返回静态方形 PNG,旧扩展可不实现。 */\n readonly portraitVersion?: string\n readonly createPortrait?: (model: AssistantAvatarModel, signal: AbortSignal) => Promise<AssistantAvatarPreview | undefined>\n /** 提供可微调的完整静态帧;未实现的扩展仍可裁剪已有头像。 */\n readonly createPortraitSource?: (model: AssistantAvatarModel, signal: AbortSignal) => Promise<AssistantAvatarPreview | undefined>\n}\n\n/** 与语音适配器一样按服务实例隔离,页面卸载不会污染另一份 Client。 */\nexport class AssistantAvatarRegistry extends AssistantAvatarRegistration<AssistantAvatarRenderer> {\n constructor() {\n super([\n { id: 'builtin', component: BuiltinAssistantAvatar, reportsLoading: true, portraitVersion: '1', createPortrait: createBuiltinAssistantAvatarPortrait, createPortraitSource: createBuiltinAssistantAvatarPortraitSource },\n { id: 'image', labelKey: 'avatar.type.image', component: ImageAssistantAvatar, reportsLoading: true, portraitVersion: '1', createPortrait: createImageAssistantAvatarPortrait, createPortraitSource: createImageAssistantAvatarPortraitSource },\n { id: 'spritesheet', labelKey: 'avatar.type.spritesheet', component: SpriteSheetAssistantAvatar, reportsLoading: true, portraitVersion: '1', createPortrait: createSpriteAssistantAvatarPortrait, createPortraitSource: createSpriteAssistantAvatarPortraitSource },\n { id: 'live2d', labelKey: 'avatar.type.live2d', component: Live2dAssistantAvatar,\n reportsLoading: true, initialLoadPhase: 'engine', reportsCache: true, previewVersion: '1', portraitVersion: '1', createPortrait: createLive2dAssistantAvatarPortrait, createPortraitSource: createLive2dAssistantAvatarPortraitSource },\n ])\n }\n}\n\nconst registries = new WeakMap<CodingNsClientServices, AssistantAvatarRegistry>()\n/** 配置草稿借用正式渲染器注册表,保留第三方扩展。 */\nexport function bindAssistantAvatarRegistry(services: CodingNsClientServices, registry: AssistantAvatarRegistry): void { registries.set(services, registry) }\nexport function getAssistantAvatarRegistry(services: CodingNsClientServices): AssistantAvatarRegistry {\n let registry = registries.get(services)\n if (registry === undefined) { registry = new AssistantAvatarRegistry(); registries.set(services, registry) }\n return registry\n}\n/** 扩展模块应将返回的注销函数登记到自己的 context.resources。 */\nexport function registerAssistantAvatarRenderer(services: CodingNsClientServices, renderer: AssistantAvatarRenderer): () => void {\n return getAssistantAvatarRegistry(services).register(renderer)\n}\n","import { createElement } from 'react'\nimport type { ReactElement } from 'react'\nimport type { AssistantAvatarCacheStatus } from '../../shared/assistant-avatar-resources.js'\nimport type { CodingNsTranslator } from '../locale.js'\nimport { dshThemeColor } from '../theme.js'\nimport { uiFontSize } from '../font-scale.js'\n\n/** 统一加载反馈;可选字段只在渲染器有真实证据时提供。 */\nexport interface AssistantAvatarLoadProgress {\n readonly phase: 'engine' | 'resources' | 'rendering' | 'ready'\n readonly loaded?: number\n readonly total?: number\n readonly elapsedMs?: number\n readonly resourcesMs?: number\n readonly cacheBefore?: AssistantAvatarCacheStatus\n readonly cacheAfter?: AssistantAvatarCacheStatus\n}\n\nconst loadingStyle = `\n@keyframes codingns-avatar-orbit { to { transform: rotate(360deg); } }\n@keyframes codingns-avatar-breathe { 50% { transform: scale(1.08); opacity: .65; } }\n@keyframes codingns-avatar-shimmer { from { transform: translateX(-130%); } to { transform: translateX(330%); } }\n[data-codingns-avatar-loading] .codingns-avatar-halo { animation: codingns-avatar-breathe 2.6s ease-in-out infinite; }\n[data-codingns-avatar-loading] .codingns-avatar-orbit { animation: codingns-avatar-orbit 3s linear infinite; }\n[data-codingns-avatar-loading] .codingns-avatar-indeterminate { animation: codingns-avatar-shimmer 1.6s ease-in-out infinite; }\n@media (prefers-reduced-motion: reduce) {\n [data-codingns-avatar-loading] .codingns-avatar-halo,\n [data-codingns-avatar-loading] .codingns-avatar-orbit,\n [data-codingns-avatar-loading] .codingns-avatar-indeterminate { animation: none; }\n}`\n\n/** 百分比只根据已经完成的文件计数生成;未知总数保留循环动画。 */\nexport function assistantAvatarLoadPercent(progress: AssistantAvatarLoadProgress): number | undefined {\n if (progress.total === undefined || progress.loaded === undefined || !Number.isFinite(progress.total)\n || !Number.isFinite(progress.loaded) || progress.total <= 0) return undefined\n return Math.round(Math.min(1, Math.max(0, progress.loaded / progress.total)) * 100)\n}\n\n/** 计数只在同一缓存代际内可相减,Host 重建后不能把相同数字解释成下载为零。 */\nfunction newHostDownloads(progress: AssistantAvatarLoadProgress): number | undefined {\n const before = progress.cacheBefore\n const after = progress.cacheAfter\n if (before === undefined || after === undefined || after.generation !== before.generation || after.downloads < before.downloads) return undefined\n return after.downloads - before.downloads\n}\n\nfunction cacheText(progress: AssistantAvatarLoadProgress, t: CodingNsTranslator): string {\n const before = progress.cacheBefore\n if (before === undefined) return t('avatar.cacheUnknown')\n const initial = t('avatar.cacheBefore', { cached: before.cached, total: before.total })\n const count = newHostDownloads(progress)\n return count === undefined ? initial : `${initial} · ${t('avatar.cacheDownloads', { count })}`\n}\n\n/** 透明光晕、轨道光点与细进度条,直接复用插槽尺寸和宿主主题。 */\nexport function AssistantAvatarLoading({ progress, size, t, showCache = false, diagnostics = false, preview = false, animationOnly = false }: {\n readonly progress: AssistantAvatarLoadProgress; readonly size: number; readonly t: CodingNsTranslator\n readonly showCache?: boolean; readonly diagnostics?: boolean; readonly preview?: boolean\n /** 临时预览仅显示加载动画,下载与引擎准备均不显示文字或进度条。 */\n readonly animationOnly?: boolean\n}): ReactElement | null {\n // 即使第三方渲染器仍上报诊断字段,正式环境也不能显示摘要或隐藏的调试 tooltip。\n showCache = !animationOnly && diagnostics && showCache\n if (progress.phase === 'ready' && (!diagnostics || animationOnly)) return null\n const percent = assistantAvatarLoadPercent(progress)\n const compact = size < 120\n const ready = progress.phase === 'ready'\n const elapsed = progress.elapsedMs === undefined ? '' : t('avatar.loadElapsed', { seconds: (progress.elapsedMs / 1000).toFixed(2) })\n const shortElapsed = progress.elapsedMs === undefined ? '' : t('avatar.loadElapsedCompact', { seconds: (progress.elapsedMs / 1000).toFixed(2) })\n const details = [showCache ? cacheText(progress, t) : '', elapsed,\n progress.resourcesMs === undefined ? '' : t('avatar.loadResourcesElapsed', { seconds: (progress.resourcesMs / 1000).toFixed(2) })].filter(Boolean).join(' · ')\n const newDownloads = newHostDownloads(progress)\n if (ready) return createElement('span', { 'data-codingns-avatar-load-summary': true, title: details,\n style: { position: 'absolute', bottom: 0, maxWidth: '100%', fontSize: uiFontSize(10), lineHeight: 1.4, color: dshThemeColor.labelSecondary,\n textAlign: 'center', background: dshThemeColor.cardBackground, borderRadius: 8, padding: '2px 6px' } },\n showCache ? createElement('span', { style: { display: 'block' } }, progress.cacheBefore === undefined ? t('avatar.cacheUnknown')\n : t(compact ? 'avatar.cacheTiny' : 'avatar.cacheShort', { cached: progress.cacheBefore.cached, total: progress.cacheBefore.total })) : null,\n createElement('span', { style: { display: 'block' } }, [showCache && newDownloads !== undefined\n ? t(compact ? 'avatar.cacheDownloadsTiny' : 'avatar.cacheDownloadsCompact', { count: newDownloads }) : '',\n compact && showCache && newDownloads !== undefined ? '' : shortElapsed].filter(Boolean).join(' · ')))\n const phaseText = progress.phase === 'engine' ? t('avatar.loadEngine') : progress.phase === 'rendering' ? t('avatar.loadRendering') : t('avatar.loading')\n const orbSize = preview ? 14 : Math.min(80, size * (compact ? .3 : .46))\n const cache = progress.cacheBefore\n const cacheLabel = compact ? cache === undefined ? t('avatar.cacheUnknownCompact') : t('avatar.cacheTiny', { cached: cache.cached, total: cache.total }) : cacheText(progress, t)\n return createElement('div', { 'data-codingns-avatar-loading': progress.phase, role: 'status', 'aria-label': phaseText,\n ...(showCache ? { title: cacheText(progress, t) } : {}),\n style: { position: 'absolute', inset: preview ? 'auto 0 0' : 0, display: 'flex', flexDirection: 'column', justifyContent: 'center', alignItems: 'center', gap: compact || preview ? 4 : 10,\n ...(preview ? { padding: '5px 4px', borderRadius: 10, background: dshThemeColor.cardBackground } : {}),\n pointerEvents: 'none', color: dshThemeColor.labelSecondary, textAlign: 'center' } },\n createElement('style', null, loadingStyle),\n createElement('div', { style: { display: 'flex', flexDirection: preview ? 'row' : 'column', alignItems: 'center', gap: compact || preview ? 4 : 10 } },\n createElement('div', { 'aria-hidden': true, style: { position: 'relative', flexShrink: 0, width: orbSize, height: orbSize, color: dshThemeColor.accent } },\n createElement('div', { className: 'codingns-avatar-halo', style: { position: 'absolute', inset: '-14%', borderRadius: '50%',\n background: 'radial-gradient(circle, rgba(112, 148, 255, .24), rgba(132, 204, 247, .10) 55%, transparent 72%)' } }),\n createElement('div', { className: 'codingns-avatar-orbit', style: { position: 'absolute', inset: 0, borderRadius: '50%', border: '1px solid rgba(112, 148, 255, .20)' } },\n createElement('span', { style: { position: 'absolute', top: -3, left: '50%', width: 6, height: 6, borderRadius: '50%', background: 'currentColor', boxShadow: '0 0 12px rgba(112, 148, 255, .5)' } })),\n createElement('svg', { viewBox: '0 0 64 64', style: { position: 'absolute', inset: '20%', width: '60%', height: '60%' }, fill: 'none' },\n createElement('path', { d: 'M32 9C35 23 41 29 55 32C41 35 35 41 32 55C29 41 23 35 9 32C23 29 29 23 32 9Z', fill: 'currentColor', opacity: .85 }),\n createElement('circle', { cx: 51, cy: 12, r: 3, fill: 'currentColor', opacity: .4 }))),\n animationOnly ? null : createElement('span', { style: { fontSize: compact || preview ? 10 : size < 160 ? 11 : 13, fontWeight: 500 } }, compact || preview ? t('avatar.loadingCompact') : phaseText)),\n animationOnly ? null : createElement('div', { role: 'progressbar', 'aria-label': t('avatar.loadProgress'), 'aria-valuemin': 0, 'aria-valuemax': 100,\n ...(percent === undefined ? {} : { 'aria-valuenow': percent }),\n style: { width: Math.min(130, size * .74), height: 3, flexShrink: 0, borderRadius: 3, overflow: 'hidden', background: 'rgba(112, 148, 255, .15)' } },\n createElement('div', { className: percent === undefined ? 'codingns-avatar-indeterminate' : undefined,\n style: { width: percent === undefined ? '30%' : `${percent}%`, height: '100%', borderRadius: 3,\n background: 'linear-gradient(90deg, #81c9ed, #7791f7)', transition: 'width .2s ease' } })),\n animationOnly ? null : createElement('span', { style: { fontSize: uiFontSize(10), lineHeight: 1.5, padding: '0 6px', maxWidth: '100%' } },\n percent === undefined ? null : `${progress.loaded}/${progress.total} · ${percent}%`,\n showCache ? createElement('span', { style: { display: 'block' } }, cacheLabel) : null))\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { AssistantAvatarModel, AssistantAvatarSurface } from '../../shared/assistant-avatar.js'\nimport { assistantAvatarPreviewKey, assistantAvatarPreviewStore, validAssistantAvatarPreview } from './preview-store.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\n\n/** 插槽拥有读写与 URL 生命周期;渲染器仅提交图像,不接触持久化存储。 */\nexport function useAssistantAvatarPreview(model: AssistantAvatarModel, surface: AssistantAvatarSurface, version: string | undefined) {\n const key = version === undefined ? undefined : assistantAvatarPreviewKey(model, surface, version)\n const [preview, setPreview] = useState<{ key: string; url: string; width: number; height: number } | undefined>()\n const session = useRef<{ key: string; controller: AbortController; url: string | undefined; published: boolean } | undefined>(undefined)\n useEffect(() => {\n setPreview(undefined)\n if (key === undefined) return undefined\n const active = { key, controller: new AbortController(), published: false, url: undefined } as NonNullable<typeof session.current>\n session.current = active\n void assistantAvatarPreviewStore.read(key, active.controller.signal).then((snapshot) => {\n if (snapshot === undefined || active.controller.signal.aborted || active.published) return\n active.url = URL.createObjectURL(snapshot.blob)\n setPreview({ key, url: active.url, width: snapshot.width, height: snapshot.height })\n }).catch(() => undefined)\n return () => { active.controller.abort(); if (active.url !== undefined) URL.revokeObjectURL(active.url); if (session.current === active) session.current = undefined }\n }, [key])\n\n const onPreview = useCallback((snapshot: AssistantAvatarPreview): void => {\n const active = session.current\n if (key === undefined || active?.key !== key || active.controller.signal.aborted || !validAssistantAvatarPreview(snapshot)) return\n active.published = true\n // 不等待落盘才显示动画;新预览可用于同一实例隐藏后再次载入。\n // 已有预览保持同一 DOM 图片直到淡出,避免换 src 解码时在交接帧闪白。\n if (active.url === undefined) {\n try {\n active.url = URL.createObjectURL(snapshot.blob)\n setPreview({ key, url: active.url, width: snapshot.width, height: snapshot.height })\n } catch { /* 临时图片地址不可用不阻断真实形象,也不阻断数据库写入。 */ }\n }\n void assistantAvatarPreviewStore.write(key, model.id, surface, snapshot, active.controller.signal).catch(() => undefined)\n }, [key, model.id, surface])\n const discard = useCallback((stop = false): void => {\n const active = session.current\n if (active === undefined || active.key !== key) return\n active.published = true\n if (stop) active.controller.abort()\n if (active.url !== undefined) URL.revokeObjectURL(active.url)\n active.url = undefined\n setPreview(undefined)\n if (key !== undefined) void assistantAvatarPreviewStore.remove(key).catch(() => undefined)\n }, [key])\n return { preview: preview?.key === key ? preview : undefined, onPreview: version === undefined ? undefined : onPreview, discard }\n}\n","import { ASSISTANT_AVATAR_MAX_MODELS, BUILTIN_ASSISTANT_AVATAR_SOURCES, resolveAssistantAvatarAsset } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarModel, AssistantAvatarSurface } from '../../shared/assistant-avatar.js'\nimport type { CodingNsClientServices } from '../features/types.js'\nimport type { AssistantAvatarRenderer } from './registry.js'\nimport { AssistantAvatarPreviewStore, assistantAvatarPreviewKey, assistantAvatarPreviewStore, validAssistantAvatarPreview } from './preview-store.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\nimport { createAssistantAvatarPortraitFromPreview } from './portrait-capture.js'\n\nexport interface AssistantAvatarPortraitSnapshot { readonly key: string; readonly url?: string }\ntype PortraitStore = Pick<AssistantAvatarPreviewStore, 'read' | 'write' | 'removeModel'>\ninterface PortraitEntry {\n readonly model: AssistantAvatarModel\n readonly asset: AssistantAvatarModel\n renderer: AssistantAvatarRenderer | undefined\n snapshot: AssistantAvatarPortraitSnapshot\n readonly listeners: Set<() => void>\n refs: number\n touched: number\n completed: boolean\n overrideChecked: boolean\n controller: AbortController | undefined\n}\nexport const assistantAvatarPortraitStore = new AssistantAvatarPreviewStore(undefined, undefined, 'codingns-assistant-avatar-portraits')\n/** 用户确认的头像属于本地配置,不按临时预览的 30 天规则失效。 */\nexport const assistantAvatarPortraitOverrideStore = new AssistantAvatarPreviewStore(undefined, undefined,\n 'codingns-assistant-avatar-portrait-overrides', { maxAgeMs: Infinity, maxEntries: ASSISTANT_AVATAR_MAX_MODELS })\n\n/** 头像始终采用对话形象的待机构图,语音状态、名称和显示尺寸不参与缓存键。 */\nexport function assistantAvatarPortraitKey(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined): string {\n const asset = resolveAssistantAvatarAsset(model, 'dialog')\n return JSON.stringify(['portrait', 1, renderer?.previewVersion ?? '', assistantAvatarPreviewKey(model, 'dialog', renderer?.portraitVersion ?? ''),\n asset.renderer === 'builtin' ? BUILTIN_ASSISTANT_AVATAR_SOURCES[model.id] : ''])\n}\nfunction validPortrait(value: unknown): value is AssistantAvatarPreview {\n return validAssistantAvatarPreview(value) && value.width === value.height && value.width <= 256\n}\nfunction sameAsset(a: AssistantAvatarModel, b: AssistantAvatarModel): boolean {\n // 展示位置可以不同,但必须确实使用同一份模型与构图,不能拿桌前版替代全身版头像。\n return assistantAvatarPreviewKey(a, 'dialog', '') === assistantAvatarPreviewKey({ ...b, surfaces: {} }, 'dialog', '')\n}\n\n/** 每个 Client 共用一个任务和临时 URL;多条消息不会创建多个图片或 WebGL 实例。 */\nexport class AssistantAvatarPortraitService {\n private readonly entries = new Map<string, PortraitEntry>()\n private clock = 0\n constructor(private readonly store: PortraitStore = assistantAvatarPortraitStore,\n private readonly previews: Pick<AssistantAvatarPreviewStore, 'read'> = assistantAvatarPreviewStore,\n private readonly crop: typeof createAssistantAvatarPortraitFromPreview = createAssistantAvatarPortraitFromPreview,\n private readonly createUrl: (blob: Blob) => string = (blob) => URL.createObjectURL(blob),\n private readonly revokeUrl: (url: string) => void = (url) => URL.revokeObjectURL(url),\n private readonly overrides: PortraitStore = assistantAvatarPortraitOverrideStore) {}\n\n /** 编辑器仅在用户打开时读取完整静态帧,普通头像订阅不增加素材加载。 */\n async getSource(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const asset = resolveAssistantAvatarAsset(model, 'dialog')\n const manual = await this.overrides.read(assistantAvatarPortraitKey(model, renderer), signal).catch(() => undefined)\n const withArea = (frame: AssistantAvatarPreview): AssistantAvatarPreview => ({ ...frame,\n ...(manual?.cropAreaPercentages === undefined ? {} : { cropAreaPercentages: manual.cropAreaPercentages }) })\n if (renderer?.previewVersion !== undefined) {\n for (const surface of ['dialog', 'floating'] as const) {\n if (!sameAsset(asset, resolveAssistantAvatarAsset(model, surface))) continue\n const frame = await this.previews.read(assistantAvatarPreviewKey(model, surface, renderer.previewVersion), signal).catch(() => undefined)\n if (signal.aborted) return undefined\n if (validAssistantAvatarPreview(frame)) return withArea(frame)\n }\n }\n if (signal.aborted) return undefined\n const frame = await renderer?.createPortraitSource?.(asset, signal)\n if (signal.aborted) return undefined\n if (validAssistantAvatarPreview(frame)) return withArea(frame)\n // 旧扩展只提供头像时仍能微调,不能因此禁用原来的形象。\n const fallback = manual ?? await this.store.read(assistantAvatarPortraitKey(model, renderer), signal)\n // 已裁好的旧扩展头像没有原始坐标空间,不能再次套用原图百分比。\n return fallback === undefined ? undefined : { blob: fallback.blob, width: fallback.width, height: fallback.height }\n }\n\n /** 先确保持久化成功才发布,存储失败和取消都保留当前头像。 */\n async setPortrait(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined,\n preview: AssistantAvatarPreview, signal: AbortSignal): Promise<void> {\n if (!validPortrait(preview)) throw new TypeError('avatar_portrait_invalid')\n signal.throwIfAborted()\n const entry = this.entry(model, renderer), controller = new AbortController()\n entry.controller?.abort(); entry.controller = controller\n const abort = (): void => controller.abort()\n signal.addEventListener('abort', abort, { once: true })\n try {\n const saved = await this.overrides.write(entry.snapshot.key, model.id, 'dialog', preview, controller.signal)\n signal.throwIfAborted()\n if (!saved || entry.controller !== controller || controller.signal.aborted) throw new Error('avatar_portrait_write_failed')\n this.publish(entry, preview); entry.completed = true\n } finally {\n signal.removeEventListener('abort', abort)\n if (entry.controller === controller) entry.controller = undefined\n }\n }\n\n getSnapshot(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined): AssistantAvatarPortraitSnapshot {\n return this.entry(model, renderer).snapshot\n }\n subscribe(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined, listener: () => void): () => void {\n const entry = this.entry(model, renderer)\n entry.listeners.add(listener)\n return () => { entry.listeners.delete(listener); this.trim() }\n }\n retain(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined): () => void {\n const entry = this.entry(model, renderer)\n entry.refs++; entry.touched = ++this.clock\n if (!entry.completed && entry.controller === undefined) this.start(entry)\n return () => {\n entry.refs = Math.max(0, entry.refs - 1)\n if (entry.refs === 0) { entry.controller?.abort(); entry.controller = undefined }\n this.trim()\n }\n }\n\n /** 插槽已绘制的帧优先于临时渲染任务;取消旧任务并隔离迟到结果。 */\n offerPreview(model: AssistantAvatarModel, surface: AssistantAvatarSurface, renderer: AssistantAvatarRenderer, preview: AssistantAvatarPreview): void {\n if (!validAssistantAvatarPreview(preview)) return\n const asset = resolveAssistantAvatarAsset(model, surface)\n for (const entry of this.entries.values()) {\n if (entry.refs === 0 || !entry.overrideChecked || entry.snapshot.url !== undefined || entry.renderer !== renderer || !sameAsset(entry.asset, asset)) continue\n entry.controller?.abort()\n const controller = new AbortController()\n entry.controller = controller; entry.completed = false\n void this.crop(preview, controller.signal).then((portrait) => this.commit(entry, controller, portrait)).catch(() => undefined)\n .finally(() => this.finish(entry, controller))\n }\n }\n removeModel(id: string): void {\n for (const entry of this.entries.values()) {\n if (entry.model.id !== id) continue\n entry.controller?.abort(); entry.controller = undefined; entry.completed = false\n if (entry.snapshot.url !== undefined) this.revokeUrl(entry.snapshot.url)\n entry.snapshot = { key: entry.snapshot.key }\n for (const listener of entry.listeners) listener()\n if (entry.refs === 0 && entry.listeners.size === 0) this.entries.delete(entry.snapshot.key)\n }\n void this.store.removeModel(id).catch(() => undefined)\n void this.overrides.removeModel(id).catch(() => undefined)\n }\n\n /** 配置窗口销毁时回收仅供本地预览使用的资源地址。 */\n dispose(): void { for (const entry of this.entries.values()) { entry.controller?.abort(); if (entry.snapshot.url !== undefined) this.revokeUrl(entry.snapshot.url) }; this.entries.clear() }\n\n private entry(model: AssistantAvatarModel, renderer: AssistantAvatarRenderer | undefined): PortraitEntry {\n const key = assistantAvatarPortraitKey(model, renderer)\n let entry = this.entries.get(key)\n if (entry === undefined) {\n entry = { model, asset: resolveAssistantAvatarAsset(model, 'dialog'), renderer, snapshot: { key }, listeners: new Set(),\n refs: 0, touched: ++this.clock, completed: false, overrideChecked: false, controller: undefined }\n this.entries.set(key, entry)\n } else if (entry.renderer !== renderer) {\n entry.controller?.abort(); entry.controller = undefined; entry.renderer = renderer\n entry.completed = entry.snapshot.url !== undefined\n }\n return entry\n }\n private start(entry: PortraitEntry): void {\n const controller = new AbortController()\n entry.controller = controller\n void this.load(entry, controller.signal).then((preview) => this.commit(entry, controller, preview)).catch(() => undefined)\n .finally(() => this.finish(entry, controller))\n }\n private async load(entry: PortraitEntry, signal: AbortSignal): Promise<AssistantAvatarPreview | undefined> {\n const manual = await this.overrides.read(entry.snapshot.key, signal).catch(() => undefined)\n if (signal.aborted || validPortrait(manual)) return signal.aborted ? undefined : manual\n entry.overrideChecked = true\n const cached = await this.store.read(entry.snapshot.key, signal).catch(() => undefined)\n if (signal.aborted || validPortrait(cached)) return signal.aborted ? undefined : cached\n const version = entry.renderer?.previewVersion\n if (version !== undefined) {\n for (const surface of ['dialog', 'floating'] as const) {\n if (!sameAsset(entry.asset, resolveAssistantAvatarAsset(entry.model, surface))) continue\n const frame = await this.previews.read(assistantAvatarPreviewKey(entry.model, surface, version), signal).catch(() => undefined)\n if (signal.aborted) return undefined\n if (frame === undefined) continue\n const portrait = await this.crop(frame, signal)\n if (portrait !== undefined || signal.aborted) return portrait\n }\n }\n return signal.aborted ? undefined : entry.renderer?.createPortrait?.(entry.asset, signal)\n }\n private commit(entry: PortraitEntry, controller: AbortController, preview: AssistantAvatarPreview | undefined): void {\n if (entry.controller !== controller || controller.signal.aborted || !validPortrait(preview)) return\n this.publish(entry, preview)\n void this.store.write(entry.snapshot.key, entry.model.id, 'dialog', preview, controller.signal).catch(() => undefined)\n }\n private publish(entry: PortraitEntry, preview: AssistantAvatarPreview): void {\n const previous = entry.snapshot.url, url = this.createUrl(preview.blob)\n entry.snapshot = { key: entry.snapshot.key, url }; entry.touched = ++this.clock\n for (const listener of entry.listeners) listener()\n if (previous !== undefined) this.revokeUrl(previous)\n }\n private finish(entry: PortraitEntry, controller: AbortController): void {\n if (entry.controller !== controller) return\n entry.controller = undefined; entry.completed = !controller.signal.aborted\n this.trim()\n }\n private trim(): void {\n // 已使用头像可复用八个;只回收没有订阅者的 URL,避免正在显示的图片失效。\n const idle = [...this.entries.values()].filter((entry) => entry.refs === 0 && entry.listeners.size === 0).sort((a, b) => b.touched - a.touched)\n for (const entry of idle.slice(8)) {\n entry.controller?.abort()\n if (entry.snapshot.url !== undefined) this.revokeUrl(entry.snapshot.url)\n this.entries.delete(entry.snapshot.key)\n }\n }\n}\nconst services = new WeakMap<CodingNsClientServices, AssistantAvatarPortraitService>()\nexport function bindAssistantAvatarPortraitService(client: CodingNsClientServices, service: AssistantAvatarPortraitService): void { services.set(client, service) }\nexport function getAssistantAvatarPortraitService(client: CodingNsClientServices): AssistantAvatarPortraitService {\n let service = services.get(client)\n if (service === undefined) { service = new AssistantAvatarPortraitService(); services.set(client, service) }\n return service\n}\n","import { Component, createElement, useCallback, useRef, useState, useSyncExternalStore } from 'react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { AssistantAvatarModel, AssistantAvatarReaction, AssistantAvatarState, AssistantAvatarSurface } from '../../shared/assistant-avatar.js'\nimport { BUILTIN_ASSISTANT_AVATAR, resolveAssistantAvatarAsset } from '../../shared/assistant-avatar.js'\nimport type { CodingNsClientServices } from '../features/types.js'\nimport { useCodingNsTranslator } from '../locale.js'\nimport { dshSettingsHelpStyle, dshThemeColor } from '../theme.js'\nimport { BuiltinAssistantAvatar } from './builtin.js'\nimport { AssistantAvatarReactionBadge } from './reaction-badge.js'\nimport { getAssistantAvatarRegistry } from './registry.js'\nimport type { AssistantAvatarRenderer } from './registry.js'\nimport { AssistantAvatarLoading } from './loading.js'\nimport type { AssistantAvatarLoadProgress } from './loading.js'\nimport { useAssistantAvatarPreview } from './preview.js'\nimport { getAssistantAvatarPortraitService } from './portrait-service.js'\nimport type { AssistantAvatarPreview } from './preview-store.js'\nimport { assistantAvatarPreviewKey } from './preview-store.js'\nimport { assistantAvatarRuntimeRevision, subscribeAssistantAvatarRuntime } from '../../shared/assistant-avatar-engine.js'\n\nexport interface AssistantAvatarSlotProps {\n readonly services: CodingNsClientServices\n readonly model: AssistantAvatarModel\n readonly state: AssistantAvatarState\n readonly reaction?: AssistantAvatarReaction\n readonly surface: AssistantAvatarSurface\n readonly size: number\n /** 创建预览可隐藏开发诊断,不影响其他插槽的 Stage0 诊断行为。 */\n readonly showDiagnostics?: boolean\n /** 临时预览不写持久预览或头像缓存,失败时也不展示另一个内置角色。 */\n readonly transient?: boolean\n}\n\n/** 两个容器只调用这个插槽;渲染错误始终被限制在形象区域。 */\nexport function AssistantAvatarSlot(props: AssistantAvatarSlotProps): ReactElement {\n const model = resolveAssistantAvatarAsset(props.model, props.surface)\n const registry = getAssistantAvatarRegistry(props.services)\n const readRenderer = useCallback(() => registry.get(model.renderer), [registry, model.renderer])\n const renderer = useSyncExternalStore(registry.subscribe, readRenderer, readRenderer)\n const runtimeRevision = useSyncExternalStore(subscribeAssistantAvatarRuntime, assistantAvatarRuntimeRevision, assistantAvatarRuntimeRevision)\n const generation = useRef({ renderer, value: 0 })\n // 扩展修复后重新注册同一个 ID,也应恢复渲染,不能永久停在旧错误边界里。\n if (generation.current.renderer !== renderer) generation.current = { renderer, value: generation.current.value + 1 }\n // 安装完成重建 Live2D 的错误边界和内容状态,其他渲染器保持现有实例。\n return createElement(AvatarErrorBoundary, { key: `${JSON.stringify(props.model)}:${generation.current.value}:${model.renderer === 'live2d' ? runtimeRevision : 0}`, fallback: createElement(AvatarFallback, props) },\n createElement(AvatarContent, { ...props, model, renderer }))\n}\n\nfunction AvatarContent({ services, model, state, reaction, surface, size, renderer, showDiagnostics, transient }: AssistantAvatarSlotProps & { readonly renderer: AssistantAvatarRenderer | undefined }): ReactElement {\n const [error, setError] = useState('')\n const [progress, setProgress] = useState<AssistantAvatarLoadProgress | undefined>(() => renderer?.reportsLoading === true\n ? { phase: renderer.initialLoadPhase ?? 'resources' } : undefined)\n const { preview, onPreview, discard } = useAssistantAvatarPreview(model, surface, transient ? undefined : renderer?.previewVersion)\n const previewKey = assistantAvatarPreviewKey(model, surface, renderer?.previewVersion ?? '')\n const publishPreview = useCallback((snapshot: AssistantAvatarPreview): void => {\n onPreview?.(snapshot)\n if (!transient && renderer !== undefined) getAssistantAvatarPortraitService(services).offerPreview(model, surface, renderer, snapshot)\n }, [services, previewKey, surface, renderer, onPreview, transient])\n const onError = useCallback((message: string) => { discard(true); setError(message) }, [discard])\n const onLoadProgress = useCallback((next: AssistantAvatarLoadProgress) => setProgress(next), [])\n const t = useCodingNsTranslator(services.locale)\n const diagnostics = services.stage0 === true && showDiagnostics !== false\n const props = { model, state, surface, size, onError, onLoadProgress, diagnostics, ...(reaction === undefined ? {} : { reaction }), ...(onPreview === undefined ? {} : { onPreview: publishPreview }) }\n const component = renderer?.component\n const showCache = diagnostics && (renderer?.reportsCache === true || progress?.cacheBefore !== undefined || progress?.cacheAfter !== undefined)\n const content = component === undefined ? null : createElement(component, props)\n if (error !== '' || content === null) return createElement(AvatarFallback, { services, model, state, surface, size,\n ...(transient === undefined ? {} : { transient }), ...(error === '' ? {} : { error }) })\n return createElement('div', { 'data-codingns-avatar-slot': surface, 'data-codingns-avatar-renderer': model.renderer,\n 'data-codingns-avatar-state': state, 'aria-label': t('avatar.character', { name: model.name }),\n 'aria-busy': progress !== undefined && progress.phase !== 'ready',\n style: { position: 'relative', display: 'grid', justifyItems: 'center', maxWidth: '100%', minWidth: 0 } },\n createElement('div', { style: { opacity: progress !== undefined && progress.phase !== 'ready' ? 0 : 1,\n transition: 'opacity .25s ease', maxWidth: '100%' } }, content),\n preview === undefined ? null : createElement('img', { key: preview.url, src: preview.url, alt: '', 'aria-hidden': true, draggable: false,\n 'data-codingns-avatar-preview': true, onError: () => discard(),\n style: { position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'contain', pointerEvents: 'none',\n opacity: progress !== undefined && progress.phase !== 'ready' ? 1 : 0, transition: 'opacity .25s ease' } }),\n reaction === undefined ? null : createElement(AssistantAvatarReactionBadge, { reaction }),\n progress === undefined || (progress.phase === 'ready' && (!diagnostics || (progress.elapsedMs === undefined && !showCache))) ? null\n : createElement(AssistantAvatarLoading, { progress, size, t, showCache, diagnostics, preview: preview !== undefined, animationOnly: transient === true }))\n}\n\nconst loadErrorKeys = { avatar_runtime_unavailable: 'avatar.live2dEngineUnavailable', avatar_runtime_invalid: 'avatar.live2dRuntimeInvalid',\n avatar_webgl_unavailable: 'avatar.live2dWebglUnavailable' } as const\n\nfunction AvatarFallback(props: AssistantAvatarSlotProps & { readonly error?: string }): ReactElement {\n const t = useCodingNsTranslator(props.services.locale)\n const key = props.error === undefined ? undefined : loadErrorKeys[props.error as keyof typeof loadErrorKeys]\n const detail = props.error === undefined ? null : createElement('small', { 'data-codingns-avatar-load-error': true, style: { display: 'block', marginTop: 8, overflowWrap: 'anywhere' } },\n t('avatar.loadErrorReason', { reason: key === undefined ? props.error : t(key) }))\n if (props.transient) return createElement('div', { role: 'alert', 'data-codingns-avatar-preview-failed': true, style: dshSettingsHelpStyle },\n t(props.model.renderer === 'live2d' ? 'avatar.temporaryLive2dLoadFailed' : 'avatar.temporaryLoadFailed'), detail)\n return createElement('div', { 'data-codingns-avatar-fallback': true, style: { position: 'relative', display: 'grid', justifyItems: 'center', maxWidth: '100%' } },\n createElement(BuiltinAssistantAvatar, { ...props, model: BUILTIN_ASSISTANT_AVATAR, onError: () => undefined }),\n props.reaction === undefined ? null : createElement(AssistantAvatarReactionBadge, { reaction: props.reaction }),\n createElement('span', { role: 'status', style: { ...dshSettingsHelpStyle, color: dshThemeColor.labelSecondary, textAlign: 'center', maxWidth: props.size } }, t('avatar.loadFailed')), detail)\n}\nclass AvatarErrorBoundary extends Component<{ readonly children?: ReactNode; readonly fallback: ReactElement }, { readonly failed: boolean }> {\n override state = { failed: false }\n static getDerivedStateFromError(): { failed: boolean } { return { failed: true } }\n override render(): ReactNode { return this.state.failed ? this.props.fallback : this.props.children }\n}\n","import { createElement, useCallback, useEffect, useSyncExternalStore } from 'react'\nimport type { ReactElement } from 'react'\nimport { BUILTIN_ASSISTANT_AVATAR, BUILTIN_ASSISTANT_AVATAR_SOURCES, resolveAssistantAvatarAsset } from '../../shared/assistant-avatar.js'\nimport type { AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport type { CodingNsClientServices } from '../features/types.js'\nimport { getAssistantAvatarRegistry } from './registry.js'\nimport { assistantAvatarPortraitKey, getAssistantAvatarPortraitService } from './portrait-service.js'\n\n/** 只订阅当前形象,切换时立即回到对应占位,不显示上一角色的迟到头像。 */\nexport function useAssistantAvatarPortrait(services: CodingNsClientServices, model: AssistantAvatarModel) {\n const registry = getAssistantAvatarRegistry(services)\n const rendererId = resolveAssistantAvatarAsset(model, 'dialog').renderer\n const readRenderer = useCallback(() => registry.get(rendererId), [registry, rendererId])\n const renderer = useSyncExternalStore(registry.subscribe, readRenderer, readRenderer)\n const service = getAssistantAvatarPortraitService(services)\n const key = assistantAvatarPortraitKey(model, renderer)\n // 规范化会复制清单,只有资源键变化时才切换订阅和生成任务。\n const read = useCallback(() => service.getSnapshot(model, renderer), [service, key, renderer])\n const subscribe = useCallback((listener: () => void) => service.subscribe(model, renderer, listener), [service, key, renderer])\n const portrait = useSyncExternalStore(subscribe, read, read)\n useEffect(() => service.retain(model, renderer), [service, key, renderer])\n return { url: portrait.url ?? BUILTIN_ASSISTANT_AVATAR_SOURCES[model.id] ?? BUILTIN_ASSISTANT_AVATAR_SOURCES[BUILTIN_ASSISTANT_AVATAR.id]!, generated: portrait.url !== undefined }\n}\n\n/** 消息头像仅显示静态 PNG;名字和按钮本身提供无障碍说明。 */\nexport function AssistantAvatarPortrait({ services, model, size = 28 }: {\n readonly services: CodingNsClientServices; readonly model: AssistantAvatarModel; readonly size?: number\n}): ReactElement {\n const portrait = useAssistantAvatarPortrait(services, model)\n return createElement('span', { 'data-codingns-avatar-portrait': model.id, 'aria-hidden': true,\n style: { display: 'inline-flex', width: size, height: size, flex: `0 0 ${size}px`, borderRadius: '50%', overflow: 'hidden' } },\n createElement('img', { src: portrait.url, alt: '', draggable: false, style: assistantAvatarPortraitImageStyle(portrait.generated),\n onError: (event: { currentTarget: HTMLImageElement }) => fallbackPortraitImage(event.currentTarget) }))\n}\n\nexport function assistantAvatarPortraitImageStyle(generated: boolean) {\n return { display: 'block', width: '100%', height: '100%', objectFit: 'contain' as const, pointerEvents: 'none' as const,\n ...(generated ? {} : { transform: 'translateY(26%) scale(1.7)' }) }\n}\n\n/** 更新填充而不重建原生按钮,保留点击、焦点和无障碍属性。 */\nexport function fillAssistantAvatarButton(button: HTMLButtonElement, portrait: { readonly url: string; readonly generated: boolean }): void {\n let image = button.querySelector<HTMLImageElement>('img[data-codingns-avatar-button-portrait]')\n if (image === null) {\n image = button.ownerDocument.createElement('img')\n image.alt = ''; image.draggable = false; image.setAttribute('aria-hidden', 'true')\n image.setAttribute('data-codingns-avatar-button-portrait', 'true')\n button.replaceChildren(image)\n }\n image.style.transform = ''\n Object.assign(image.style, assistantAvatarPortraitImageStyle(portrait.generated))\n image.onerror = () => fallbackPortraitImage(image!)\n if (image.getAttribute('src') !== portrait.url) image.src = portrait.url\n button.style.overflow = 'hidden'\n}\nfunction fallbackPortraitImage(image: HTMLImageElement): void {\n const source = BUILTIN_ASSISTANT_AVATAR_SOURCES[BUILTIN_ASSISTANT_AVATAR.id]!\n if (image.getAttribute('src') === source) return\n Object.assign(image.style, assistantAvatarPortraitImageStyle(false))\n image.src = source\n}\n","import { BUILTIN_ASSISTANT_AVATAR, getBuiltinAssistantAvatar, copyAssistantAvatarModel, isAssistantAvatarSource, listAssistantAvatars, normalizeAssistantAppearance, selectedAssistantAvatar,\n validateAssistantAppearance, validateAssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport type { AssistantAppearanceSettings, AssistantAvatarModel } from '../../shared/assistant-avatar.js'\nimport { BUILTIN_ASSISTANT_AVATAR_ADAPTERS } from '../../shared/assistant-avatar-adapters.js'\nimport type { AssistantAvatarAdapter } from '../../shared/assistant-avatar-adapters.js'\nimport { CODINGNS_RPC_CHANNEL } from '../../shared/contracts/transport.js'\nimport type { CodingNsSettings } from '../../shared/contracts/config.js'\nimport type { CodingNsSettingsStore } from '../../dsh-capabilities/settings-store.js'\nimport { sameSettingsValue } from '../../dsh-capabilities/settings-store.js'\nimport type { CodingNsClientServices } from '../features/types.js'\nimport { AssistantAvatarRegistration } from './registration.js'\nimport { assistantAvatarPreviewStore } from './preview-store.js'\nimport { assistantAvatarPortraitStore, assistantAvatarPortraitOverrideStore, getAssistantAvatarPortraitService } from './portrait-service.js'\nimport type { CodingNsRpcClient } from '../features/types.js'\nimport type { AssistantAvatarCandidate, AssistantAvatarInstallation } from '../../shared/assistant-avatar-installation.js'\nimport { ASSISTANT_AVATAR_CONSENT_VERSION, hasAssistantAvatarConsent } from '../../shared/assistant-avatar-catalog.js'\nimport type { AssistantAvatarCatalogEntry, AssistantAvatarTemporaryPreview } from '../../shared/assistant-avatar-catalog.js'\nimport { ASSISTANT_AVATAR_ENGINE_CONSENT_VERSION, hasAssistantAvatarEngineConsent, invalidateAssistantAvatarRuntime } from '../../shared/assistant-avatar-engine.js'\nimport type { AssistantAvatarEngineStatus } from '../../shared/assistant-avatar-engine.js'\n\nexport class AssistantAvatarAdapterRegistry extends AssistantAvatarRegistration<AssistantAvatarAdapter> {\n constructor() { super(BUILTIN_ASSISTANT_AVATAR_ADAPTERS) }\n parse(manifest: unknown, manifestUrl: string, adapterId = 'auto'): AssistantAvatarModel {\n const adapter = adapterId === 'auto' ? this.getSnapshot().find((item) => item.matches(manifest)) : this.get(adapterId)\n if (adapter === undefined || !adapter.matches(manifest)) throw new TypeError('无法识别形象包,或所选适配器未注册')\n const model = adapter.parse(manifest, { manifestUrl })\n const result = { ...model, package: { ...model.package, adapterId: adapter.id, manifestUrl } }\n validateAssistantAvatarModel(result)\n return copyAssistantAvatarModel(result)\n }\n}\n\nexport type AssistantAppearanceUpdate = Partial<Pick<AssistantAppearanceSettings, 'floatingEnabled' | 'dialogEnabled' | 'floatingSize' | 'dialogSize'>>\n\n/** 唯一写入入口:包导入与手工素材最终都变成同一清单,不拥有语音或会话。 */\nexport class AssistantAvatarManager {\n private writes: Promise<unknown> = Promise.resolve()\n private appearance: AssistantAppearanceSettings | undefined\n private catalog: readonly AssistantAvatarModel[] = []\n constructor(private readonly settings: CodingNsSettingsStore<CodingNsSettings>,\n readonly adapters = new AssistantAvatarAdapterRegistry(),\n private readonly fetchManifest: typeof fetch = (...args) => fetch(...args),\n private readonly baseUrl: string | undefined = typeof location === 'undefined' ? undefined : location.href,\n private readonly rpc?: CodingNsRpcClient,\n private readonly removePortrait: (id: string) => void = (id) => {\n void assistantAvatarPortraitStore.removeModel(id).catch(() => undefined)\n void assistantAvatarPortraitOverrideStore.removeModel(id).catch(() => undefined)\n }) {}\n\n /** React 和扩展都可以订阅这一份稳定快照,语音设置变化不会刷新形象列表。 */\n readonly getSnapshot = (): AssistantAppearanceSettings => {\n const next = normalizeAssistantAppearance(this.settings.getSnapshot().value?.assistant.appearance)\n if (this.appearance === undefined || !sameSettingsValue(this.appearance, next)) {\n this.appearance = next\n this.catalog = Object.freeze(listAssistantAvatars(next))\n }\n return this.appearance\n }\n readonly subscribe = (listener: () => void): (() => void) => {\n let previous = this.getSnapshot()\n return this.settings.subscribe(() => {\n const next = this.getSnapshot()\n if (previous === next) return\n previous = next; listener()\n })\n }\n getAppearance(): AssistantAppearanceSettings { return this.getSnapshot() }\n list(): readonly AssistantAvatarModel[] { this.getSnapshot(); return this.catalog }\n getSelected(): AssistantAvatarModel { return selectedAssistantAvatar(this.getAppearance()) }\n\n select(id: string): Promise<void> {\n return this.write((current) => { this.requireModel(current, id); return { ...current, selectedId: id } })\n }\n async add(model: AssistantAvatarModel): Promise<void> {\n validateAssistantAvatarModel(model)\n const copy = copyAssistantAvatarModel(model)\n return this.insert(copy)\n }\n async update(model: AssistantAvatarModel): Promise<void> {\n this.requireCustom(model.id); validateAssistantAvatarModel(model)\n const copy = copyAssistantAvatarModel(model)\n return this.write((current) => {\n this.requireModel(current, copy.id)\n return { ...current, models: current.models.some((item) => item.id === copy.id)\n ? current.models.map((item) => item.id === copy.id ? copy : item) : [...current.models, copy] }\n })\n }\n async remove(id: string): Promise<void> {\n this.requireCustom(id)\n const installation = this.list().find((model) => model.id === id)?.package?.installationId\n await this.write((current) => { this.requireModel(current, id); return { ...current,\n selectedId: current.selectedId === id ? BUILTIN_ASSISTANT_AVATAR.id : current.selectedId,\n models: current.models.filter((item) => item.id !== id) } })\n void assistantAvatarPreviewStore.removeModel(id).catch(() => undefined)\n this.removePortrait(id)\n if (installation !== undefined && !this.list().some((model) => model.package?.installationId === installation)) {\n await this.call('remove', { id: installation })\n }\n }\n async configure(update: AssistantAppearanceUpdate): Promise<void> {\n if (Object.keys(update).some((key) => !['floatingEnabled', 'dialogEnabled', 'floatingSize', 'dialogSize'].includes(key))) throw new TypeError('展示设置字段无效')\n return this.write((current) => ({ ...current, ...update }))\n }\n\n /** 必须从独立协议操作调用;展示配置不会隐式开启第三方目录。 */\n setThirdPartyEnabled(enabled: boolean): Promise<void> {\n return this.write((current) => {\n const { thirdPartyConsent: _previous, ...appearance } = current\n return enabled ? { ...appearance, thirdPartyConsent: { version: ASSISTANT_AVATAR_CONSENT_VERSION, acceptedAt: Date.now() } } : appearance\n })\n }\n /** 引擎许可与第三方素材协议分开记录;撤销同意不卸载已安装引擎。 */\n setEngineEnabled(enabled: boolean): Promise<void> {\n return this.write((current) => {\n const { engineConsent: _previous, ...appearance } = current\n return enabled ? { ...appearance, engineConsent: { version: ASSISTANT_AVATAR_ENGINE_CONSENT_VERSION, acceptedAt: Date.now() } } : appearance\n })\n }\n /** 只读探测;已确认许可后由安装接口写入 CodingNS 自有引擎目录。 */\n async engineStatus(signal?: AbortSignal): Promise<AssistantAvatarEngineStatus> {\n return readEngineStatus(await this.call('engineStatus', {}, signal))\n }\n async installEngine(signal?: AbortSignal): Promise<AssistantAvatarEngineStatus> {\n this.requireWritable(); this.requireEngineConsent(); signal?.throwIfAborted()\n // 配置窗口的许可尚在草稿中,随本次安装传给 Host;不能为安装提前提交整个配置。\n const result = readEngineStatus(await this.call('installEngine', { engineConsent: this.getAppearance().engineConsent }, signal))\n signal?.throwIfAborted()\n if (!result.installed) throw new Error('Live2D 引擎安装后仍未就绪,请重试')\n invalidateAssistantAvatarRuntime()\n return result\n }\n async getCatalog(signal?: AbortSignal): Promise<readonly AssistantAvatarCatalogEntry[]> {\n this.requireConsent(); signal?.throwIfAborted()\n return this.call('catalog', {}, signal) as Promise<readonly AssistantAvatarCatalogEntry[]>\n }\n async previewCatalog(id: string, revision: string, lease: string, signal?: AbortSignal): Promise<AssistantAvatarTemporaryPreview> {\n this.requireWritable(); this.requireConsent(); signal?.throwIfAborted()\n const result = await this.call('previewCatalog', { id, revision, lease }, signal) as AssistantAvatarTemporaryPreview\n validateAssistantAvatarModel(result.model)\n if (result.lease !== lease) throw new TypeError('临时形象预览标识不一致')\n return result\n }\n async releasePreview(lease: string): Promise<void> { await this.call('releasePreview', { lease }) }\n async keepPreview(lease: string): Promise<void> { await this.call('keepPreview', { lease }) }\n async installCatalog(id: string, revision: string, licenseAccepted: boolean, signal?: AbortSignal, lease?: string): Promise<AssistantAvatarModel> {\n this.requireWritable(); this.requireConsent(); signal?.throwIfAborted()\n if (!licenseAccepted) throw new TypeError('请确认所选形象的许可及应用')\n const installed = await this.call('installCatalog', { id, revision, licenseAccepted, ...(lease === undefined ? {} : { lease }) }, signal) as AssistantAvatarInstallation\n return this.registerInstallation(installed, signal, true)\n }\n\n /** 只读清单 JSON;网络/解析/取消失败都不新增形象,不修改当前选择。 */\n async importPackage(source: string, adapterId = 'auto', signal?: AbortSignal): Promise<AssistantAvatarModel> {\n this.requireWritable(); signal?.throwIfAborted()\n if (!isAssistantAvatarSource(source)) throw new TypeError('形象包清单地址无效')\n const url = new URL(source, this.baseUrl).href\n const response = await this.fetchManifest(url, { credentials: 'same-origin', ...(signal === undefined ? {} : { signal }) })\n if (!response.ok) throw new Error(`avatar_manifest_http_${response.status}`)\n const text = await response.text()\n if (text.length > 262144) throw new TypeError('形象包清单过大')\n signal?.throwIfAborted()\n const model = this.adapters.parse(JSON.parse(text), response.url || url, adapterId)\n await this.insert(model, signal)\n return model\n }\n\n /** 新入口在 Host 安装完整素材后才写入形象列表;旧外链导入 API 保持兼容。 */\n async discover(source: string, signal?: AbortSignal): Promise<readonly AssistantAvatarCandidate[]> {\n this.requireWritable(); signal?.throwIfAborted()\n return this.call('discover', { source }, signal) as Promise<readonly AssistantAvatarCandidate[]>\n }\n async installPackage(source: string, adapterId = 'auto', signal?: AbortSignal): Promise<AssistantAvatarModel> {\n this.requireWritable(); signal?.throwIfAborted()\n const installed = await this.call('install', { source, adapterId }, signal) as AssistantAvatarInstallation\n return this.registerInstallation(installed, signal)\n }\n private async registerInstallation(installed: AssistantAvatarInstallation, signal?: AbortSignal, fromCatalog = false): Promise<AssistantAvatarModel> {\n let replacedInstallation: string | undefined\n try {\n validateAssistantAvatarModel(installed.model)\n await this.write((current) => {\n signal?.throwIfAborted()\n if (fromCatalog && !hasAssistantAvatarConsent(current.thirdPartyConsent)) throw new TypeError('第三方形象列表已关闭')\n const existing = current.models.find((model) => model.id === installed.model.id)\n replacedInstallation = existing?.package?.installationId\n const sameSource = existing?.package?.manifestUrl !== undefined && existing.package.manifestUrl === installed.model.package?.manifestUrl\n if (existing !== undefined && existing.package?.installationId !== installed.id && !sameSource) throw new TypeError('形象 ID 已存在,请先移除已有记录')\n if (installed.model.package?.installationId !== installed.id || !/^[a-f0-9]{64}$/u.test(installed.id)) throw new TypeError('形象安装结果无效')\n return { ...current, selectedId: installed.model.id,\n models: existing === undefined ? [...current.models, installed.model] : current.models.map((model) => model.id === existing.id ? installed.model : model) }\n })\n // 新版本成功启用后再回收旧版本;清理失败不推翻已经保存的有效选择。\n if (replacedInstallation !== undefined && replacedInstallation !== installed.id\n && !this.list().some((model) => model.package?.installationId === replacedInstallation)) {\n await this.call('remove', { id: replacedInstallation }).catch(() => undefined)\n }\n return installed.model\n } catch (error) {\n // 只清理本次新建的素材,不删除其他窗口已成功启用的同版本资源。\n if (installed.created && !this.list().some((model) => model.package?.installationId === installed.id)) await this.call('remove', { id: installed.id }).catch(() => undefined)\n throw error\n }\n }\n private async call(action: string, payload: unknown, signal?: AbortSignal): Promise<unknown> {\n if (this.rpc === undefined) throw new Error('形象本地安装服务不可用')\n const result = await this.rpc.call(CODINGNS_RPC_CHANNEL, `avatar/${action}`, payload, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n }\n\n private insert(model: AssistantAvatarModel, signal?: AbortSignal): Promise<void> {\n this.requireCustom(model.id)\n return this.write((current) => {\n signal?.throwIfAborted()\n if (current.models.some((item) => item.id === model.id)) throw new TypeError('形象 ID 已存在,请更新已有形象或使用其他 ID')\n return { ...current, selectedId: model.id, models: [...current.models, model] }\n })\n }\n\n private write(update: (current: AssistantAppearanceSettings) => AssistantAppearanceSettings): Promise<void> {\n // 公开 API 可以并发调用,后一项必须读取前一项保存后的清单和 revision。\n const task = this.writes.then(() => this.saveAppearance(update))\n this.writes = task.catch(() => undefined)\n return task\n }\n\n private async saveAppearance(update: (current: AssistantAppearanceSettings) => AssistantAppearanceSettings): Promise<void> {\n // revision 属于整个命名空间,后台会话索引也会推进它;冲突后必须重算改动,\n // 不能撤掉版本校验或重放旧 appearance,否则会覆盖其他窗口刚保存的形象。\n for (let attempt = 0; attempt < 3; attempt++) {\n const snapshot = this.requireWritable()\n const current = normalizeAssistantAppearance(snapshot.value!.assistant.appearance)\n const next = update(current)\n validateAssistantAppearance(next)\n if (JSON.stringify(next) === JSON.stringify(current)) return\n try {\n const accepted = await this.settings.mutate([{ op: 'set', path: ['assistant', 'appearance'], value: next }], snapshot.revision)\n if (!accepted) throw new Error('形象设置保存被拒绝,请刷新后重试')\n return\n } catch (error) {\n if (!isSettingsConflict(error) || this.settings.reload === undefined) throw error\n if (attempt === 2) throw new Error('形象设置持续被其他操作更新,请稍后重试', { cause: error })\n await this.settings.reload()\n }\n }\n }\n private requireWritable() {\n const snapshot = this.settings.getSnapshot()\n if (snapshot.status !== 'ready' || snapshot.value === undefined) throw new Error('形象设置尚未就绪')\n if (!snapshot.writable) throw new Error('当前形象设置为只读')\n return snapshot\n }\n private requireConsent(): void {\n if (!hasAssistantAvatarConsent(this.getAppearance().thirdPartyConsent)) throw new TypeError('请先同意第三方形象使用说明')\n }\n private requireEngineConsent(): void {\n if (!hasAssistantAvatarEngineConsent(this.getAppearance().engineConsent)) throw new TypeError('请先确认 Live2D 引擎许可')\n }\n private requireModel(current: AssistantAppearanceSettings, id: string): void {\n if (!listAssistantAvatars(current).some((item) => item.id === id)) throw new TypeError('形象不在清单中')\n }\n private requireCustom(id: string): void {\n if (getBuiltinAssistantAvatar(id) !== undefined) throw new TypeError('内置形象不可替换或删除')\n }\n}\n\n/** 引擎状态来自 Host;形状异常按不可用处理,避免把坏数据当成就绪。 */\nfunction readEngineStatus(value: unknown): AssistantAvatarEngineStatus {\n const status = value as AssistantAvatarEngineStatus | null\n if (status === null || typeof status !== 'object' || typeof status.installed !== 'boolean'\n || typeof status.version !== 'string' || !['managed', 'dependency', 'missing'].includes(status.source)) {\n throw new TypeError('Live2D 引擎状态无效')\n }\n return { installed: status.installed, version: status.version, source: status.source }\n}\n\n/** 兼容原生异常、RPC 稳定错误码,以及旧 Host 只透传正文的响应。 */\nfunction isSettingsConflict(error: unknown): boolean {\n if (error === null || typeof error !== 'object') return false\n const failure = error as { readonly code?: unknown; readonly name?: unknown; readonly message?: unknown }\n return failure.code === 'SETTINGS_CONFLICT' || failure.code === 'SettingsConflictError'\n || failure.name === 'SettingsConflictError'\n || (typeof failure.message === 'string' && /^settings namespace \".+\" changed since it was read \\(expected revision /u.test(failure.message))\n}\n\nconst managers = new WeakMap<CodingNsClientServices, AssistantAvatarManager>()\nexport function bindAssistantAvatarManager(services: CodingNsClientServices, manager: AssistantAvatarManager): void { managers.set(services, manager) }\nexport function getAssistantAvatarManager(services: CodingNsClientServices): AssistantAvatarManager {\n let manager = managers.get(services)\n if (manager === undefined) {\n manager = new AssistantAvatarManager(services.settings, undefined, undefined, undefined, services.rpc,\n (id) => getAssistantAvatarPortraitService(services).removeModel(id))\n managers.set(services, manager)\n }\n return manager\n}\n/** 扩展应将注销函数登记到 context.resources,已导入的数据不会随适配器注销丢失。 */\nexport function registerAssistantAvatarAdapter(services: CodingNsClientServices, adapter: AssistantAvatarAdapter): () => void {\n return getAssistantAvatarManager(services).adapters.register(adapter)\n}\n"],"mappings":"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"}
|