// ========================================================================== // Views: ThreadView (chat + canvas of artifacts), AgentsView (scheduled). // Each view is a real functional component driven by the store. // ========================================================================== // ---- Render a single artifact (type-dispatched) ---- function Artifact({ artifact }) { const { regenerateVariant, setToast } = useStore(); const [selectedVariant, setSelectedVariant] = React.useState(null); switch (artifact.kind) { case 'parsed-files': return ( <>
{artifact.files.map(f => )}
); case 'brief': return setToast({ kind:'ok', text:'Opened in Inku production.' })} />; case 'pillars': return setToast({ kind:'ok', text:'Opened pillars.' })} />; case 'concepts': return setToast({ kind:'ok', text:'Opened concept set.' })} />; case 'calendar': return setToast({ kind:'ok', text:'Opened calendar.' })} />; case 'variant-matrix': return ( <> setSelectedVariant(v)} /> {selectedVariant && ( setSelectedVariant(null)} onRegenerate={(instructions) => regenerateVariant(selectedVariant.id, instructions)} /> )} ); case 'perf-hypothesis': return ; case 'agent-created': return (
{artifact.agent.cadence}. First run queued — results will surface in the Scheduled Agents panel.
); default: return null; } } function VariantDetail({ variant, onClose, onRegenerate }) { const [instructions, setInstructions] = React.useState(''); const [busy, setBusy] = React.useState(false); return ( }>
BRAME
{variant.copy}
Hook · {variant.hook}
"{variant.copy}"
Refine