diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/validation.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/validation.rs index 5e94adf2f..5f352dcc6 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/validation.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/validation.rs @@ -14,7 +14,7 @@ pub(crate) const MAX_DIRECT_CODEX_REFERENCES: usize = 32; pub(crate) fn validate_direct_codex_user_item( root: &Path, item: &DirectCodexUserItem, -) -> Result<(), String> { +) -> Result { let DirectCodexUserItem::Message(message) = item; if !matches!(message.role, DirectCodexUserRole::User) { return Err("DirectProject 只接受 user message item".to_string()); @@ -98,7 +98,7 @@ pub(crate) fn validate_direct_codex_user_item( if reference_count > MAX_DIRECT_CODEX_REFERENCES { return Err(format!("一次最多引用 {MAX_DIRECT_CODEX_REFERENCES} 个素材")); } - Ok(()) + Ok(manifest) } /// 整条 content 是否还有有效输入:任何一段非空白文本、或任何一个非文本 part 都算。 diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/wire.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/wire.rs index a9621a223..e180bd4c8 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/wire.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/wire.rs @@ -178,6 +178,23 @@ pub(crate) fn direct_codex_user_item_to_codex_turn_input( "text": runtime_region_summary(reference), })); } + DirectCodexUserContentPart::AgcAttachmentReference(reference) => { + let mut summary = format!( + "[附件:名称={};类型={};大小={} 字节", + reference.name.trim(), + reference.media_type.trim(), + reference.size + ); + if !reference.local_path.trim().is_empty() { + summary.push_str(&format!(";项目路径={}", reference.local_path.trim())); + } + summary.push_str(&format!(";状态={}", reference.status.trim())); + summary.push(']'); + input.push(serde_json::json!({ + "type": "text", + "text": summary, + })); + } } } Ok(Value::Array(input)) 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 82077a3cf..123cafc08 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 @@ -192,15 +192,6 @@ class SkillMentionOption extends MenuOption { } } -const BUILTIN_SKILL_REFERENCES: SkillReference[] = [ - 'agc-browser-playtest', - 'agc-client-projection', - 'agc-game-production-workflow', - 'agc-project-structure', - 'agc-web-game-development', - 'taonier-art-assets', -].map((name) => ({ type: 'skill', name })); - /** * 编辑器节点 → canonical content part,**原样透传**:段落分隔(root 子节点之间补的 * `\n`)、软换行、chip 后的分隔空格都各自成 part,不做空白过滤、不与相邻 part 合并。 @@ -265,8 +256,12 @@ function readDraftFromNodes(): ChatComposerDraft { const projection = readDraftProjectionFromNodes(); const labels = new Map( projection.references.map((reference) => [ - reference.type === 'resource' ? reference.resourceId : reference.label, - `@${reference.label}`, + reference.type === 'resource' + ? reference.resourceId + : reference.type === 'skill' + ? reference.name + : reference.label, + reference.type === 'skill' ? `$${reference.name}` : `@${reference.label}`, ]), ); const text = projection.content @@ -277,7 +272,7 @@ function readDraftFromNodes(): ChatComposerDraft { ? (labels.get(part.resourceId) ?? `@${part.resourceId}`) : part.type === 'agc_runtime_region_reference' ? `@${part.label}` - : `@${part.name}`, + : `$${part.name}`, ) .join('') .trim(); @@ -872,13 +867,13 @@ function ResourceReferenceEditor({ const currentRefKey = current.references ?.map( (reference) => - `${reference.type}:${reference.type === 'resource' ? reference.resourceId : reference.label}`, + `${reference.type}:${reference.type === 'resource' ? reference.resourceId : reference.type === 'skill' ? reference.name : reference.label}`, ) .join('|'); const desiredRefKey = desiredRefs .map( (reference) => - `${reference.type}:${reference.type === 'resource' ? reference.resourceId : reference.label}`, + `${reference.type}:${reference.type === 'resource' ? reference.resourceId : reference.type === 'skill' ? reference.name : reference.label}`, ) .join('|'); if (current.text === desiredValue && currentRefKey === desiredRefKey)