diff --git a/apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceInput.tsx b/apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceInput.tsx index b2f1ea468..155e0ac41 100644 --- a/apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceInput.tsx +++ b/apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceInput.tsx @@ -240,6 +240,20 @@ type DraftProjection = { content: DirectCodexUserContentPart[]; }; +/** 引用在草稿文本里的稳定键:resource 用资源 id,skill 用技能名,其余用显示名。 */ +function referenceDraftKey(reference: ChatReference) { + if (reference.type === 'resource') return reference.resourceId; + if (reference.type === 'skill') return reference.name; + return reference.label; +} + +/** 引用回读成草稿文本时的 token:skill 是 `$name`,resource 与 runtime region 是 `@显示名`。 */ +function referenceDraftToken(reference: ChatReference) { + return reference.type === 'skill' + ? `$${reference.name}` + : `@${reference.label}`; +} + /** 仅供编辑器内部派生引用(重建文本草稿时用);对外只暴露 canonical content。 */ function readDraftProjectionFromNodes(): DraftProjection { const references: ChatReference[] = []; @@ -256,12 +270,8 @@ function readDraftFromNodes(): ChatComposerDraft { const projection = readDraftProjectionFromNodes(); const labels = new Map( projection.references.map((reference) => [ - reference.type === 'resource' - ? reference.resourceId - : reference.type === 'skill' - ? reference.name - : reference.label, - reference.type === 'skill' ? `$${reference.name}` : `@${reference.label}`, + referenceDraftKey(reference), + referenceDraftToken(reference), ]), ); const text = projection.content