Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions phd-advisor-frontend/src/components/SettingsModal.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ const SettingsModal = ({
const [message, setMessage] = useState(null);
const [isSubmitting, setIsSubmitting] = useState(false);

const personaIds = useMemo(() => Object.keys(advisors || {}).filter(id => id !== 'aggregated'), [advisors]);
const personaIds = useMemo(() => Object.keys(advisors || {}), [advisors]);
const [modelDraft, setModelDraft] = useState(() => {
const fallback = llmConfig?.default_backend || availableBackends?.[0];
const seed = llmConfig?.persona_backends || {};
Expand Down Expand Up @@ -274,7 +274,7 @@ const SettingsModal = ({
}`,
});

const advisorEntries = Object.entries(advisors || {}).filter(([id]) => id !== 'aggregated');
const advisorEntries = Object.entries(advisors || {});
const enabledCount = advisorEntries.filter(([id]) => isAdvisorEnabled(id)).length;
const setAll = (enabled) => setAllAdvisorsEnabled(enabled);

Expand Down Expand Up @@ -449,7 +449,7 @@ const SettingsModal = ({
{activeTab === 'model' && (
<>
<AdvisorConfigPanel
advisors={Object.fromEntries(Object.entries(advisors || {}).filter(([id]) => id !== 'aggregated'))}
advisors={advisors || {}}
availableBackends={availableBackends || []}
value={modelDraft}
onChange={setModelDraft}
Expand Down
32 changes: 16 additions & 16 deletions phd-advisor-frontend/src/contexts/AppConfigContext.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
import React, { createContext, useContext, useState, useEffect } from 'react';
import React, { createContext, useContext, useState, useEffect, useMemo } from 'react';
import * as LucideIcons from 'lucide-react';

const AppConfigContext = createContext(null);

const SYNTHETIC_PERSONAS = {
Comment thread
NeonDaniel marked this conversation as resolved.
aggregated: {
name: 'Orchestrator',
role: 'Synthesized Response',
description: 'A single combined response merging all advisor perspectives.',
color: '#7C3AED',
bgColor: '#F3E8FF',
darkColor: '#A78BFA',
darkBgColor: '#3B2A5E',
icon: LucideIcons.User,
},
};

const ADVISOR_PREFS_URL = `${process.env.REACT_APP_API_URL}/api/me/advisor-preferences`;

// The frontend tracks disabled advisors as an object keyed by id
Expand Down Expand Up @@ -137,19 +150,6 @@ export const AppConfigProvider = ({ children }) => {

useEffect(() => {
const built = buildAdvisors(personaItems, avatarOverrides);
// Synthetic persona used for aggregated/synthesized responses — represents
// a single combined "Partner" voice rather than the panel of advisors.
built.aggregated = {
name: 'Orchestrator',
role: 'Synthesized Response',
description: 'A single combined response merging all advisor perspectives.',
color: '#7C3AED',
bgColor: '#F3E8FF',
darkColor: '#A78BFA',
darkBgColor: '#3B2A5E',
icon: LucideIcons.User,
avatarUrl: avatarOverrides.aggregated || null,
};
setAdvisors(built);
}, [personaItems, avatarOverrides]);

Expand Down Expand Up @@ -273,8 +273,8 @@ export const AppConfigProvider = ({ children }) => {
}, [config]);

const getAdvisorColors = buildGetAdvisorColors(advisors);
const allPersonas = advisors;
const getAllPersonaColors = getAdvisorColors;
const allPersonas = useMemo(() => ({ ...advisors, ...SYNTHETIC_PERSONAS }), [advisors]);
const getAllPersonaColors = buildGetAdvisorColors(allPersonas);

const value = {
config,
Expand Down
4 changes: 1 addition & 3 deletions phd-advisor-frontend/src/pages/ChatPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -919,9 +919,7 @@ const handleNewChat = async (sessionId = null) => {

<div className="header-right">
<AdvisorStatusDropdown
advisors={Object.fromEntries(
Object.entries(advisors).filter(([id]) => id !== 'aggregated')
)}
advisors={advisors}
thinkingAdvisors={thinkingAdvisors}
getAdvisorColors={getAdvisorColors}
isDark={isDark}
Expand Down
Loading