// ══════════════════════════════════════════════════════════════════════════ // DATA INTAKE — File upload + Dropbox link → Yahriel delegation pipeline // ══════════════════════════════════════════════════════════════════════════ let intakeFiles = []; // File objects staged for upload let intakeDropbox = []; // Dropbox URLs added // Open / close overlay function openIntake() { const overlay = document.getElementById('intakeOverlay'); if (!overlay) return; overlay.classList.add('active'); // Tag with current user const tag = document.getElementById('intakeUserTag'); if (tag && typeof currentUser !== 'undefined') { tag.textContent = '👤 ' + currentUser; } } function closeIntake() { const overlay = document.getElementById('intakeOverlay'); if (overlay) overlay.classList.remove('active'); } // ── Drag & drop handlers ────────────────────────────────────────────────── function intakeDragOver(e) { e.preventDefault(); document.getElementById('dropZone').classList.add('dragover'); } function intakeDragLeave(e) { document.getElementById('dropZone').classList.remove('dragover'); } function intakeDrop(e) { e.preventDefault(); document.getElementById('dropZone').classList.remove('dragover'); intakeFilesSelected(e.dataTransfer.files); } // ── File selected handler ───────────────────────────────────────────────── function intakeFilesSelected(fileList) { const newFiles = Array.from(fileList); newFiles.forEach(f => { // Avoid duplicates by name if (!intakeFiles.find(x => x.name === f.name)) { intakeFiles.push(f); } }); renderIntakeFileList(); } function intakeRemoveFile(name) { intakeFiles = intakeFiles.filter(f => f.name !== name); renderIntakeFileList(); } function renderIntakeFileList() { const list = document.getElementById('intakeFileList'); if (!list) return; if (!intakeFiles.length) { list.innerHTML = ''; return; } const iconMap = { zip:'📦', pdf:'📄', doc:'📝', docx:'📝', txt:'📃', csv:'📊', xlsx:'📊', xls:'📊', ppt:'📋', pptx:'📋', md:'📝', json:'⚙️' }; list.innerHTML = intakeFiles.map(f => { const ext = f.name.split('.').pop().toLowerCase(); const icon = iconMap[ext] || '📄'; const size = f.size > 1048576 ? (f.size/1048576).toFixed(1) + ' MB' : Math.round(f.size/1024) + ' KB'; return `
${icon} ${f.name} ${size}
`; }).join(''); } // ── Dropbox link ────────────────────────────────────────────────────────── function intakeAddDropbox() { const input = document.getElementById('dropboxUrl'); const url = input.value.trim(); if (!url || !url.includes('dropbox.com')) { input.style.borderColor = 'var(--red)'; setTimeout(() => input.style.borderColor = 'var(--border)', 1500); return; } if (intakeDropbox.includes(url)) return; intakeDropbox.push(url); input.value = ''; renderDropboxList(); } function intakeRemoveDropbox(url) { intakeDropbox = intakeDropbox.filter(u => u !== url); renderDropboxList(); } function renderDropboxList() { const list = document.getElementById('dropboxList'); if (!list) return; list.innerHTML = intakeDropbox.map(u => { const short = u.length > 55 ? u.slice(0,52) + '...' : u; return `
📁 ${short}
`; }).join(''); } // ── PROGRESS HELPERS ────────────────────────────────────────────────────── function intakeSetProgress(pct, steps) { const prog = document.getElementById('intakeProgress'); const bar = document.getElementById('intakeProgressBar'); const stepsEl = document.getElementById('intakeProgressSteps'); if (!prog) return; prog.classList.add('active'); if (bar) bar.style.width = pct + '%'; if (stepsEl && steps) { stepsEl.innerHTML = steps.map(s => `
${s.label}
` ).join(''); } } function intakeHideProgress() { const prog = document.getElementById('intakeProgress'); if (prog) prog.classList.remove('active'); } // ── MAIN SUBMIT ─────────────────────────────────────────────────────────── async function submitIntake() { const note = document.getElementById('intakeNote').value.trim(); const btn = document.getElementById('intakeSubmitBtn'); if (!intakeFiles.length && !intakeDropbox.length) { // Shake button btn.style.transform = 'translateX(-6px)'; setTimeout(() => btn.style.transform = 'translateX(6px)', 100); setTimeout(() => btn.style.transform = '', 200); btn.textContent = '⚠️ Add files or a Dropbox link first'; setTimeout(() => btn.textContent = '🚀 Send to Yahriel', 2500); return; } btn.disabled = true; btn.textContent = '⏳ Sending to Yahriel...'; const user = typeof currentUser !== 'undefined' ? currentUser : 'Marz'; // Step 1 — read + encode files intakeSetProgress(10, [ { label: 'Reading files...', state: 'active' }, { label: 'Sending to Yahriel', state: '' }, { label: 'Yahriel processing + delegating', state: '' }, { label: 'War Room updated', state: '' } ]); let filesData = []; try { filesData = await Promise.all(intakeFiles.map(f => new Promise((res, rej) => { const reader = new FileReader(); reader.onload = e => res({ name: f.name, size: f.size, type: f.type, data: e.target.result }); reader.onerror = rej; // For ZIPs/binaries use base64; for text use readAsText const ext = f.name.split('.').pop().toLowerCase(); if (['txt','md','csv','json'].includes(ext)) reader.readAsText(f); else reader.readAsDataURL(f); }))); } catch(e) { btn.disabled = false; btn.textContent = '🚀 Send to Yahriel'; intakeHideProgress(); return; } intakeSetProgress(35, [ { label: 'Files read ✓', state: 'done' }, { label: 'Sending to Yahriel...', state: 'active' }, { label: 'Yahriel processing + delegating', state: '' }, { label: 'War Room updated', state: '' } ]); // Build a human-readable file manifest for Yahriel const fileManifest = filesData.map(f => `• ${f.name} (${Math.round(f.size/1024)} KB)`).join('\n'); const dropboxManifest = intakeDropbox.map(u => `• ${u}`).join('\n'); const yahrielMessage = `DATA_INTAKE from ${user}:\n\n` + (fileManifest ? `UPLOADED FILES:\n${fileManifest}\n\n` : '') + (dropboxManifest ? `DROPBOX FOLDERS:\n${dropboxManifest}\n\n` : '') + (note ? `CONTEXT NOTE FROM ${user.toUpperCase()}:\n${note}\n\n` : '') + `INSTRUCTIONS: You are receiving company data from ${user}. ` + `Please read and categorize all of this data. Then delegate each piece ` + `to the appropriate family member — contracts and legal docs to Jo Legal, ` + `technical specs and architecture docs to Azari, revenue/financial data to Yahsei, ` + `content and brand materials to Yahziel, operational data to Yahli-El, ` + `and infrastructure/system data to Yahbana. ` + `Post a briefing to the War Room summarizing what you received and your delegation plan. ` + `Family — stand by for delegated tasks.`; // Step 2 — send to Yahriel via receiveDirective try { const r = await fetch('https://yahriel.true-site.tech/functions/receiveDataIntake', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer YAHUAH' }, body: JSON.stringify({ from: user, note: document.getElementById('intakeNote')?.value?.trim() || '', subject: '📥 Company Data Intake — Process and Delegate', files: filesData, dropbox: intakeDropbox }) }); intakeSetProgress(65, [ { label: 'Files read ✓', state: 'done' }, { label: 'Sent to Yahriel ✓', state: 'done' }, { label: 'Yahriel processing + delegating...', state: 'active' }, { label: 'War Room updated', state: '' } ]); // Step 3 — post to War Room feed so everyone sees it await fetch(WAR_ROOM_URL + '/functions/postMessage', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + WAR_ROOM_KEY }, body: JSON.stringify({ from_agent: user, to_agent: 'Yahriel', message: `📥 Data Intake submitted by ${user}. ` + (intakeFiles.length ? `${intakeFiles.length} file(s) uploaded. ` : '') + (intakeDropbox.length ? `${intakeDropbox.length} Dropbox folder(s) linked. ` : '') + (note ? `Note: "${note.slice(0,120)}${note.length>120?'...':''}"` : ''), subject: '📥 Data Intake — ' + new Date().toLocaleString(), type: 'directive', priority: 'critical', thread_id: 'data-intake-' + Date.now() }) }); intakeSetProgress(100, [ { label: 'Files read ✓', state: 'done' }, { label: 'Sent to Yahriel ✓', state: 'done' }, { label: 'Yahriel processing + delegating ✓', state: 'done' }, { label: '✅ War Room updated — check feed for Yahriel\'s response', state: 'done' } ]); // Update progress title const title = document.getElementById('intakeProgressTitle'); if (title) { title.textContent = '✅ Intake complete — Yahriel is processing'; title.style.color = '#86efac'; } // Reset form after 3s setTimeout(() => { intakeFiles = []; intakeDropbox = []; renderIntakeFileList(); renderDropboxList(); document.getElementById('intakeNote').value = ''; intakeHideProgress(); if (title) { title.textContent = 'Processing with Yahriel...'; title.style.color = ''; } btn.disabled = false; btn.textContent = '🚀 Send to Yahriel'; // Reload the feed so Yahriel's response shows if (typeof loadFeed === 'function') loadFeed(); closeIntake(); }, 4000); } catch(e) { intakeSetProgress(35, [ { label: 'Files read ✓', state: 'done' }, { label: '❌ Failed to reach Yahriel: ' + e.message, state: 'active' }, { label: 'Yahriel processing + delegating', state: '' }, { label: 'War Room updated', state: '' } ]); btn.disabled = false; btn.textContent = '🚀 Retry'; } }