Council synthesized — of 374 signals this session —
Wearable (12 devices): HRV, resting HR, SpO₂, skin conductance, sleep stages, activity cadence ·
Video (30): 26 Ekman FACS action units + 4 body kinematics via Azure Kinect ·
Voice (240): C-SSRS–anchored phrase library — hopelessness, ideation, withdrawal, affect flattening, agitation ·
Behavioral (92): app engagement, session attendance, sleep regularity, social isolation index, medication adherence
Generated note — Dr. Rivera
72%
Auto-filled from patient signals
Green sections trusted · Amber sections verify · Red sections require your input
3 sections need your input
Signal data — auto-trusted
Verify & edit recommended
Your words required
By signing you confirm this note accurately reflects the clinical encounter and the signal data above. Time-to-sign is logged for quality metrics.
Note signed — thank you
Beta feedback
Was this note shorter than what you'd typically write?
Did the wearable and FACS signals add clinical value?
Was your formatting preserved?
Anything else?
Feedback recorded — this shapes the next build.
'+f.name+'
'+f.st+'
';
}).join('');
// Voice
document.getElementById('voice-cssrs').textContent=p.voice.cssrs+'/6';
document.getElementById('voice-cssrs').className='voice-cssrs '+p.voice.cssCls;
document.getElementById('voice-label').textContent=p.voice.lbl;
document.getElementById('voice-phrases').textContent=p.voice.phrases;
}
// ── ROLE ─────────────────────────────────────────────────
var role='therapist';
function setRole(r,el){
role=r;
document.querySelectorAll('.rtab').forEach(function(t){t.classList.remove('active');});
if(el)el.classList.add('active');
renderSignals(r);
var lbls={therapist:'Therapist · DAP · '+PT[r].name,md:'MD / Psychiatrist · SOAP · '+PT[r].name,cm:'Case Manager · '+PT[r].name};
document.getElementById('demo-role-lbl').textContent=lbls[r];
document.getElementById('transcript').value='';
document.getElementById('demo-loaded').style.display='none';
hideResults();cancelCd();
document.getElementById('spk-tog').checked=(r==='md');
toggleSpk();
}
// ── METHOD ───────────────────────────────────────────────
var method='demo';
function setMethod(m){
method=m;
['rec','paste','demo'].forEach(function(x){
document.getElementById('mt-'+x).classList.toggle('active',x===m);
var el=document.getElementById(x+'-pane');
el.style.display=(x===m)?'block':'none';
});
if(m==='demo'){
var p=PT[role];
document.getElementById('demo-ready-lbl').textContent=p.name+'\'s signals are loaded';
document.getElementById('demo-sub-lbl').textContent=p.sigs+' signals · '+{therapist:'Therapist · DAP',md:'MD / Psychiatrist',cm:'Case Manager'}[role]+' · Demo only';
var el=document.querySelector('#demo-pane > div');if(el){var c=el.cloneNode(true);c.querySelector('#demo-ready-lbl').textContent=p.name+"'s signals are loaded";c.querySelector('#demo-sub-lbl').textContent=p.sigs+' signals · '+{therapist:'Therapist · DAP',md:'MD / Psychiatrist',cm:'Case Manager'}[role]+' · Demo only';c.querySelector('button').>'+{wearable:'Wearable',facs:'FACS video',voice:'Voice analysis',session:'Session audio',clinician:'Clinician required'}[src]+''):'';
var h='
'+header+'
'+srcBadge+'
';
if(dot==='r'){
// Red = editable textarea, clinician must complete
var ph=scaffolds?scaffolds.join('\n'):'Your clinical judgment here…';
var uid='red_'+header.replace(/\s+/g,'_').toLowerCase();
h+='';
h+='
';
}
function autoExpand(el){el.style.height='auto';el.style.height=el.scrollHeight+'px';}
function autoExpandAll(){document.querySelectorAll('.nbody-edit,.nbody-amber').forEach(function(el){autoExpand(el);el.addEventListener('input',function(){autoExpand(this);});});}
function updateCompletion(){
var edits=document.querySelectorAll('.nbody-edit');
var filled=0;
edits.forEach(function(el){
var ok=el.value.trim().length>10;
el.classList.toggle('filled',ok);
if(ok)filled++;
});
var total=edits.length;
var remaining=total-filled;
// base 72% auto-filled + up to 28% from clinician edits
var pct=total>0?Math.round(72+(filled/total)*28):72;
document.getElementById('nc-pct').textContent=pct+'%';
document.getElementById('nc-bar').style.width=pct+'%';
document.getElementById('nc-required').textContent=remaining>0?(remaining+' section'+(remaining>1?'s':'')+' need your input'):'✓ All sections complete';
document.getElementById('nc-required').style.color=remaining>0?'var(--amber)':'var(--green)';
// Enable/hint sign button
document.getElementById('sign-btn').disabled=remaining>0;
document.getElementById('sign-btn').style.opacity=remaining>0?'0.5':'1';
document.getElementById('sign-btn').title=remaining>0?('Complete '+remaining+' red section'+(remaining>1?'s':'')+' before signing'):'Ready to sign';
}
// ── GENERATE ─────────────────────────────────────────────
var tsStart=null;
function generateNote(){
cancelCd();
if(method!=='demo'&&document.getElementById('transcript').value.trim().length<20)return;
document.getElementById('gen-btn').disabled=true;
document.getElementById('gen-state').style.display='flex';
hideResults();
setTimeout(function(){
document.getElementById('gen-state').style.display='none';
document.getElementById('gen-btn').disabled=false;
renderResults();
},1800);
}
function renderResults(){
var prior=document.getElementById('prior-note').value.trim();
var pw=prior?cw(prior):0;
var tx=method==='demo'?TX[role]:document.getElementById('transcript').value;
var tw=cw(tx);
var gw=GW[role];
var base=pw>0?pw:tw;
// Pre-bake realistic compression in demo mode when no prior note — transcript vs note math zeros out
var DEMO_PCT={therapist:38,md:34,cm:41};
var pct=method==='demo'&&pw===0?DEMO_PCT[role]:(base>0?Math.round(((base-gw)/base)*100):0);
if(pct<0)pct=0;
var sMin=Math.round((pct/100)*45);
var sYr=Math.round((sMin*200)/60);
document.getElementById('sc-gen').textContent=gw;
if(pw>0){document.getElementById('sc-prior').textContent=pw;document.getElementById('sc-psub').textContent='words';}
else{document.getElementById('sc-prior').innerHTML='Add above';document.getElementById('sc-psub').textContent='to compare';}
document.getElementById('sc-comp').textContent=pct>0?(pct+'% shorter'):'0%';
document.getElementById('sc-comp').className='sc-val hero-v';
document.getElementById('sc-csub').textContent=pw>0?'vs your last note':'vs transcript';
document.getElementById('sc-time').textContent=sMin>0?(sMin+' min'):'—';
document.getElementById('sc-tyr').textContent=sYr>0?('~'+sYr+' hrs / yr'):'';
document.getElementById('sc-sigs').textContent=PT[role].sigs;
try{
document.getElementById('note-display').innerHTML=buildNote(role);
}catch(e){
document.getElementById('note-display').innerHTML='
Note generation error — please try again.
';
}
document.getElementById('scorecard').style.display='block';
document.getElementById('note-out').style.display='block';
document.getElementById('sign-sec').style.display='block';
document.getElementById('sign-btn').disabled=true;
document.getElementById('sign-btn').style.opacity='0.5';
document.getElementById('sign-btn').title='Complete the red sections before signing';
setTimeout(function(){autoExpandAll();updateCompletion();},50);
tsStart=Date.now();
setTimeout(function(){document.getElementById('scorecard').scrollIntoView({behavior:'smooth',block:'start'});},80);
}
function hideResults(){
['scorecard','note-out','sign-sec','fb-sec'].forEach(function(id){document.getElementById(id).style.display='none';});
document.getElementById('sign-ok').classList.remove('show');
}
function cw(t){return t.trim().split(/\s+/).filter(Boolean).length;}
function copyNote(){
var t=document.getElementById('note-display').innerText||'';
navigator.clipboard.writeText(t).then(function(){document.getElementById('copy-lbl').textContent='Copied!';setTimeout(function(){document.getElementById('copy-lbl').textContent='Copy note';},2000);});
}
function signNote(){
document.getElementById('sign-btn').style.display='none';
document.getElementById('sign-ok').classList.add('show');
document.getElementById('fb-sec').style.display='block';
setTimeout(function(){document.getElementById('fb-sec').scrollIntoView({behavior:'smooth',block:'start'});},150);
}
function fb(el){el.parentElement.querySelectorAll('.fb-btn').forEach(function(b){b.classList.remove('sel');});el.classList.add('sel');}
function submitFb(){
document.getElementById('fb-submit').style.display='none';
document.getElementById('fb-done').classList.add('show');
document.querySelectorAll('.fb-btn').forEach(function(b){b.disabled=true;});
document.getElementById('fb-text').disabled=true;
}
function handlePriorFile(input){
var file=input.files[0];if(!file)return;
var reader=new FileReader();
reader.onload=function(e){
document.getElementById('prior-note').value=e.target.result;
document.getElementById('prior-upload-zone').style.display='none';
document.getElementById('prior-loaded').style.display='flex';
document.getElementById('prior-loaded-name').textContent=file.name+' loaded';
};
reader.readAsText(file);
}
function handlePriorDrop(e){
e.preventDefault();
document.getElementById('prior-upload-zone').style.borderColor='var(--bdr)';
var file=e.dataTransfer.files[0];if(!file)return;
var inp=document.getElementById('prior-file-input');
var dt=new DataTransfer();dt.items.add(file);inp.files=dt.files;
handlePriorFile(inp);
}
function clearPriorNote(){
document.getElementById('prior-note').value='';
document.getElementById('prior-file-input').value='';
document.getElementById('prior-loaded').style.display='none';
document.getElementById('prior-upload-zone').style.display='flex';
}
// ── INIT ─────────────────────────────────────────────────
window.addEventListener('load',function(){
renderSignals('therapist');
setMethod('demo');
// ensure initial signal card is visible
document.getElementById('signal-card').classList.add('loaded');
});