diff --git a/crates/openfang-api/src/routes.rs b/crates/openfang-api/src/routes.rs index 14a2debfe4..4875ed099d 100644 --- a/crates/openfang-api/src/routes.rs +++ b/crates/openfang-api/src/routes.rs @@ -1409,11 +1409,15 @@ pub async fn get_agent( "network": entry.manifest.capabilities.network, }, "description": entry.manifest.description, + "system_prompt": entry.manifest.model.system_prompt, "tags": entry.manifest.tags, "identity": { "emoji": entry.identity.emoji, "avatar_url": entry.identity.avatar_url, "color": entry.identity.color, + "archetype": entry.identity.archetype, + "vibe": entry.identity.vibe, + "greeting_style": entry.identity.greeting_style, }, "skills": entry.manifest.skills, "skills_mode": if entry.manifest.skills.is_empty() { "all" } else { "allowlist" }, diff --git a/crates/openfang-api/static/js/pages/agents.js b/crates/openfang-api/static/js/pages/agents.js index 38850b4832..60b3790d86 100644 --- a/crates/openfang-api/static/js/pages/agents.js +++ b/crates/openfang-api/static/js/pages/agents.js @@ -337,29 +337,38 @@ function agentsPage() { OpenFangAPI.wsDisconnect(); }, + buildConfigForm(agent) { + var identity = (agent && agent.identity) || {}; + return { + name: (agent && agent.name) || '', + system_prompt: (agent && agent.system_prompt) || '', + emoji: identity.emoji || '', + color: identity.color || '#FF5C00', + archetype: identity.archetype || '', + vibe: identity.vibe || '' + }; + }, + async showDetail(agent) { - this.detailAgent = agent; - this.detailAgent._fallbacks = []; this.detailTab = 'info'; this.agentFiles = []; this.editingFile = null; this.fileContent = ''; this.editingFallback = false; this.newFallbackValue = ''; - this.configForm = { - name: agent.name || '', - system_prompt: agent.system_prompt || '', - emoji: (agent.identity && agent.identity.emoji) || '', - color: (agent.identity && agent.identity.color) || '#FF5C00', - archetype: (agent.identity && agent.identity.archetype) || '', - vibe: (agent.identity && agent.identity.vibe) || '' - }; - this.showDetailModal = true; - // Fetch full agent detail to get fallback_models + // Load the full detail payload before opening the modal so editable + // fields such as system_prompt and identity metadata are hydrated. + var detail = agent; try { var full = await OpenFangAPI.get('/api/agents/' + agent.id); - this.detailAgent._fallbacks = full.fallback_models || []; - } catch(e) { /* ignore */ } + detail = Object.assign({}, agent, full, { + identity: Object.assign({}, (agent && agent.identity) || {}, (full && full.identity) || {}) + }); + } catch(e) { /* fall back to list payload */ } + this.detailAgent = detail; + this.detailAgent._fallbacks = detail.fallback_models || []; + this.configForm = this.buildConfigForm(detail); + this.showDetailModal = true; }, killAgent(agent) {