OC
Olmedo Correa Restrepo
Agenda una reunión conmigo
Disponible
1
Tipo
2
Fecha y hora
3
Tus datos
4
Confirmado

¿Qué tipo de reunión necesitas?

Selecciona la duración que mejor se adapte.

Reunión rápida
15 minutos
💬
Reunión estándar
30 minutos
🤝
Reunión extendida
1 hora
⏱️
A definir
El anfitrión decide

Elige fecha y hora

Lun–Vie: 8:00–17:00 · Sábados: 9:00–11:00

Selecciona un día
Horarios disponibles
Selecciona un día
Los horarios aparecerán aquí

Tus datos

Completa para confirmar la reunión.

🎉
¡Reunión confirmada!
Tu reunión ha sido agendada. Olmedo Correa Restrepo recibirá una notificación inmediata.

Comparte este enlace con otras personas:

${a.titulo}

📅 Fecha: ${a.fecha}${a.hora?`  ·  🕐 Hora: ${a.hora}`:''}${a.lugar?`
📍 Lugar: ${a.lugar}`:''} ${a.asistentes?`
👥 Asistentes: ${a.asistentes}`:''}
Olmedo Correa Restrepo
${(a.temas||[]).length?`
Temas tratados
${a.temas.map(t=>`
${t}
`).join('')}
`:''} ${(a.decisiones||[]).length?`
Decisiones tomadas
${a.decisiones.map(d=>`
${d}
`).join('')}
`:''} ${(a.pendientes||[]).length?`
Pendientes / Compromisos
${a.pendientes.map(p=>`
${p.texto}
${p.responsable?`${p.responsable}`:''}${p.fecha?`📅 ${p.fecha}`:''}
`).join('')}
`:''} ${a.obs?`
Observaciones
${a.obs}
`:''}
Olmedo Correa Restrepo
Anfitrión
 
Firma participante
 
Firma participante
`; } // ══════════════════════════════════════════ // LISTEN AGENT // ══════════════════════════════════════════ let recognition=null, isListening=false, fullTranscript='', listenInterval=null, listenSeconds=0; function initRecognition(){ const SR=window.SpeechRecognition||window.webkitSpeechRecognition; if(!SR){ notify('Tu navegador no soporta reconocimiento de voz. Usa Chrome.','err'); return null; } const r=new SR(); r.lang='es-CO'; r.continuous=true; r.interimResults=true; r.onresult=(e)=>{ let interim=''; let final=''; for(let i=e.resultIndex;i{ if(e.error!=='no-speech') notify('Error de micrófono: '+e.error,'err'); }; r.onend=()=>{ if(isListening) r.start(); }; return r; } G('btn-start-listen').onclick=()=>{ recognition=initRecognition(); if(!recognition) return; fullTranscript=''; G('listen-transcript').textContent='Escuchando... Habla claramente.'; G('listen-transcript').classList.add('active'); G('listen-dot').classList.add('active'); G('listen-label').textContent='Escuchando reunión...'; G('btn-start-listen').style.display='none'; G('btn-stop-listen').style.display='inline-flex'; G('btn-clear-listen').style.display='none'; isListening=true; listenSeconds=0; listenInterval=setInterval(()=>{ listenSeconds++; const m=Math.floor(listenSeconds/60), s=listenSeconds%60; G('listen-timer').textContent=`${String(m).padStart(2,'0')}:${String(s).padStart(2,'0')}`; },1000); recognition.start(); notify('🎙️ Agente escuchando... habla con claridad','info'); }; G('btn-stop-listen').onclick=async()=>{ if(recognition){ recognition.onend=null; recognition.stop(); } isListening=false; clearInterval(listenInterval); G('listen-dot').classList.remove('active'); G('btn-stop-listen').style.display='none'; G('btn-clear-listen').style.display='inline-flex'; G('btn-start-listen').style.display='none'; if(!fullTranscript.trim()){ notify('No se capturo texto. Intenta de nuevo.','err'); G('listen-label').textContent='Listo para escuchar'; G('btn-start-listen').style.display='inline-flex'; return; } G('listen-label').textContent='✨ Procesando con IA...'; notify('✨ Generando acta profesional...','info'); await generarActaDesdeTexto(fullTranscript); }; async function generarActaDesdeTexto(texto) { var sistemaMsg = 'Eres un secretario ejecutivo experto en actas de reunion formales en espanol. ' + 'Analiza el texto de reunion que te doy y genera un acta profesional. ' + 'Responde UNICAMENTE con JSON valido, sin markdown, sin bloques de codigo, sin texto adicional. ' + 'La estructura debe ser exactamente: ' + '{"titulo":"string","temas":["string"],"decisiones":["string"],"pendientes":[{"texto":"string","responsable":"string","fecha":"string"}],"obs":"string"}'; var userMsg = 'Genera el acta profesional de esta reunion: ' + texto; try { var res = await fetch('https://api.anthropic.com/v1/messages', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'claude-sonnet-4-20250514', max_tokens: 2000, system: sistemaMsg, messages: [{ role: 'user', content: userMsg }] }) }); if (!res.ok) { throw new Error('HTTP ' + res.status); } var data = await res.json(); var rawText = ''; if (data && data.content && data.content[0] && data.content[0].text) { rawText = data.content[0].text; } var parsed = null; // Try direct parse first try { parsed = JSON.parse(rawText.trim()); } catch (e1) { // Try extracting JSON block var start = rawText.indexOf('{'); var end = rawText.lastIndexOf('}'); if (start !== -1 && end !== -1 && end > start) { try { parsed = JSON.parse(rawText.substring(start, end + 1)); } catch (e2) { parsed = null; } } } // Fallback structure if parsing failed if (!parsed) { parsed = { titulo: 'Acta de Reunion', temas: [], decisiones: [], pendientes: [], obs: rawText || 'Revisa y completa el acta manualmente.' }; } resetActaModal(); G('acta-titulo').value = parsed.titulo || 'Acta de Reunion'; G('acta-fecha').value = nowDate(); G('acta-hora').value = nowTime(); var temas = parsed.temas || []; for (var i = 0; i < temas.length; i++) { if (temas[i] && temas[i].trim()) addListItem('temas-list', temas[i]); } var decisiones = parsed.decisiones || []; for (var j = 0; j < decisiones.length; j++) { if (decisiones[j] && decisiones[j].trim()) addListItem('decisiones-list', decisiones[j]); } var pendientes = parsed.pendientes || []; for (var k = 0; k < pendientes.length; k++) { if (pendientes[k] && pendientes[k].texto) addPendienteRow(pendientes[k]); } G('acta-obs').value = parsed.obs || ''; G('acta-save').dataset.fromListen = 'true'; G('acta-modal-title').textContent = 'Acta generada por IA'; G('listen-label').textContent = 'Acta lista - revisa y guarda'; G('ov-acta').classList.add('open'); notify('Acta generada. Revisa y ajusta los detalles.', 'ok'); } catch (err) { console.error('Error generando acta:', err); // Never lose the transcript - open modal with raw content resetActaModal(); G('acta-titulo').value = 'Acta de Reunion - ' + nowDate(); G('acta-fecha').value = nowDate(); G('acta-hora').value = nowTime(); var frases = texto.split('.').filter(function(s) { return s.trim().length > 15; }).slice(0, 6); for (var fi = 0; fi < frases.length; fi++) { addListItem('temas-list', frases[fi].trim()); } G('acta-obs').value = 'Transcripcion completa: ' + texto; G('acta-save').dataset.fromListen = 'true'; G('acta-modal-title').textContent = 'Acta desde transcripcion'; G('listen-label').textContent = 'Revisa y guarda el acta'; G('ov-acta').classList.add('open'); notify('Se abrio el acta con la transcripcion. Revisa y guarda.', 'info'); } } G('btn-clear-listen').onclick=()=>{ fullTranscript=''; G('listen-transcript').textContent='El texto transcrito aparecerá aquí mientras hablas...'; G('listen-transcript').classList.remove('active'); G('listen-label').textContent='Listo para escuchar'; G('listen-timer').textContent=''; G('btn-start-listen').style.display='inline-flex'; G('btn-stop-listen').style.display='none'; G('btn-clear-listen').style.display='none'; }; // Manual text input for when mic doesn't work G('btn-manual-text').onclick=async()=>{ const txt=prompt('Pega aqui las notas o texto de tu reunion para que la IA genere el acta:'); if(!txt||!txt.trim()) return; fullTranscript=txt.trim(); G('listen-transcript').textContent=fullTranscript; G('listen-transcript').classList.add('active'); G('listen-label').textContent='✨ Procesando con IA...'; G('btn-start-listen').style.display='none'; G('btn-clear-listen').style.display='inline-flex'; notify('✨ Generando acta desde texto...','info'); await generarActaDesdeTexto(fullTranscript); }; // START checkSession();