/** * StudioParameterList - Display and add discovered parameters as design variables */ import React, { useState, useEffect } from 'react'; import { Plus, Check, SlidersHorizontal, Loader2 } from 'lucide-react'; import { intakeApi } from '../../api/intake'; interface Expression { name: string; value: number | null; units: string | null; is_candidate: boolean; confidence: number; } interface StudioParameterListProps { draftId: string; onParameterAdded: () => void; } export const StudioParameterList: React.FC = ({ draftId, onParameterAdded, }) => { const [expressions, setExpressions] = useState([]); const [addedParams, setAddedParams] = useState>(new Set()); const [adding, setAdding] = useState(null); const [loading, setLoading] = useState(true); // Load expressions from spec introspection useEffect(() => { loadExpressions(); }, [draftId]); const loadExpressions = async () => { setLoading(true); try { const data = await intakeApi.getStudioDraft(draftId); const introspection = (data.spec as any)?.model?.introspection; if (introspection?.expressions) { setExpressions(introspection.expressions); // Check which are already added as DVs const existingDVs = new Set( ((data.spec as any)?.design_variables || []).map((dv: any) => dv.expression_name as string) ); setAddedParams(existingDVs); } } catch (err) { console.error('Failed to load expressions:', err); } finally { setLoading(false); } }; const addAsDesignVariable = async (expressionName: string) => { setAdding(expressionName); try { await intakeApi.createDesignVariables(draftId, [expressionName]); setAddedParams(prev => new Set([...prev, expressionName])); onParameterAdded(); } catch (err) { console.error('Failed to add design variable:', err); } finally { setAdding(null); } }; // Sort: candidates first, then by confidence const sortedExpressions = [...expressions].sort((a, b) => { if (a.is_candidate !== b.is_candidate) { return b.is_candidate ? 1 : -1; } return (b.confidence || 0) - (a.confidence || 0); }); // Show only candidates by default, with option to show all const [showAll, setShowAll] = useState(false); const displayExpressions = showAll ? sortedExpressions : sortedExpressions.filter(e => e.is_candidate); if (loading) { return (
); } if (expressions.length === 0) { return (

No expressions found. Try running introspection.

); } const candidateCount = expressions.filter(e => e.is_candidate).length; return (
{/* Header with toggle */}
{candidateCount} candidates
{/* Parameter List */}
{displayExpressions.map((expr) => { const isAdded = addedParams.has(expr.name); const isAdding = adding === expr.name; return (
{expr.name} {expr.value !== null && ( = {expr.value}{expr.units ? ` ${expr.units}` : ''} )}
{isAdded ? ( ) : ( )}
); })}
{displayExpressions.length === 0 && (

No candidate parameters found. Click "Show all" to see all expressions.

)}
); }; export default StudioParameterList;