<!DOCTYPE html>

<html lang="vi">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>SUPREME TITAN TRINITY v10.4 - LÊ THANH HẢI</title>

    <script src="https://cdn.tailwindcss.com"></script>

    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

    <style>

        @import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;500;700&family=JetBrains+Mono:wght@400;700&display=swap');

        :root {

            --bg-deep: #0A0F14;

            --accent-cyan: #00F2FF;

            --accent-pink: #FF0055;

            --accent-amber: #F59E0B;

            --text-primary: #E2E8F0;

            --panel-bg: rgba(15, 23, 42, 0.8);

        }

        body {

            background-color: var(--bg-deep);

            color: var(--text-primary);

            font-family: 'Space Grotesk', sans-serif;

            overflow-x: hidden;

            background-image: radial-gradient(circle at 2px 2px, rgba(0, 242, 255, 0.05) 1px, transparent 0);

            background-size: 40px 40px;

        }

        .mono { font-family: 'JetBrains Mono', monospace; }

        .chart-container { position: relative; width: 100%; max-width: 600px; margin: auto; height: 300px; }

        .titan-card {

            background: var(--panel-bg);

            border: 1px solid rgba(0, 242, 255, 0.1);

            backdrop-filter: blur(12px);

            transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);

        }

        .titan-card:hover { border-color: var(--accent-cyan); box-shadow: 0 0 20px rgba(0, 242, 255, 0.1); transform: translateY(-2px); }

        .glow-text { text-shadow: 0 0 10px rgba(0, 242, 255, 0.5); }

        .status-pulse { animation: pulse 2s infinite; }

        @keyframes pulse { 0% { opacity: 1; } 50% { opacity: 0.4; } 100% { opacity: 1; } }

        .scanline {

            width: 100%; height: 2px; background: rgba(0, 242, 255, 0.1);

            position: fixed; top: 0; z-index: 9999; pointer-events: none; animation: scan 4s linear infinite;

        }

        @keyframes scan { from { top: 0; } to { top: 100%; } }

        ::-webkit-scrollbar { width: 5px; }

        ::-webkit-scrollbar-track { background: var(--bg-deep); }

        ::-webkit-scrollbar-thumb { background: var(--accent-cyan); border-radius: 10px; }

    </style>

</head>

<body class="antialiased">

<div class="scanline"></div>


<nav class="border-b border-cyan-900/30 bg-black/80 backdrop-blur-md sticky top-0 z-50">

    <div class="max-w-7xl mx-auto px-6 h-14 flex items-center justify-between">

        <div class="flex items-center space-x-4">

            <span class="status-pulse w-3 h-3 bg-cyan-400 rounded-full shadow-[0_0_10px_#00F2FF]"></span>

            <span class="mono text-xs tracking-tighter text-cyan-400 font-bold">CORE_v10.4_ULTIMATE</span>

        </div>

        <div class="hidden md:flex space-x-6 text-[9px] uppercase tracking-[0.2em] font-bold">

            <button onclick="scrollToSection('identity')" class="hover:text-cyan-400 transition-colors">Identity</button>

            <button onclick="scrollToSection('simulation')" class="hover:text-pink-500 transition-colors text-pink-500/70">Scavenger</button>

            <button onclick="scrollToSection('oracle')" class="hover:text-cyan-400 transition-colors">Oracle AI</button>

            <button onclick="scrollToSection('forge')" class="hover:text-amber-500 transition-colors text-amber-500/70">Forge</button>

            <button onclick="scrollToSection('vision')" class="hover:text-teal-400 transition-colors text-teal-400/70">Vision</button>

            <button onclick="scrollToSection('matrix')" class="hover:text-purple-400 transition-colors text-purple-400/70">Matrix</button>

            <button onclick="scrollToSection('radar')" class="hover:text-emerald-400 transition-colors text-emerald-400/70">Radar</button>

        </div>

    </div>

</nav>


<main class="max-w-7xl mx-auto px-4 sm:px-6 py-12 space-y-24">


    <!-- SECTION: IDENTITY -->

    <section id="identity" class="grid grid-cols-1 lg:grid-cols-3 gap-8">

        <div class="lg:col-span-2 space-y-6">

            <h1 class="text-4xl md:text-6xl font-bold tracking-tighter glow-text uppercase">

                TITAN <span class="text-cyan-400">TRINITY</span>

            </h1>

            <div class="p-6 titan-card rounded-xl border-l-4 border-cyan-400">

                <div class="grid grid-cols-2 gap-4 mono text-sm">

                    <div>

                        <p class="text-slate-500 uppercase text-[10px]">Subject</p>

                        <p class="font-bold text-lg text-white">LÊ THANH HẢI</p>

                    </div>

                    <div>

                        <p class="text-slate-500 uppercase text-[10px]">Authority</p>

                        <p class="font-bold text-lg text-pink-500">[ABSOLUTE_CONTROL]</p>

                    </div>

                    <div class="col-span-2 mt-4">

                        <p class="text-slate-500 uppercase text-[10px]">Identity Hash</p>

                        <p class="text-cyan-400 break-all">L_H_1_8_0_3_1_9_8_1_H_P_H</p>

                    </div>

                </div>

            </div>

        </div>

        <div class="titan-card p-6 rounded-xl flex flex-col justify-center items-center text-center space-y-4">

            <div class="text-xs uppercase tracking-widest text-slate-500">Root Access</div>

            <div class="text-sm font-bold mono bg-slate-800/50 px-4 py-2 rounded border border-slate-700 text-white">lehaiuzb2@gmail.com</div>

            <p class="text-[10px] text-slate-400 italic">Quyền sinh sát hệ thống 24/7</p>

        </div>

    </section>


    <!-- SECTION: DIGITAL SCAVENGER 24/7 ENGINE -->

    <section id="simulation" class="space-y-8">

        <div class="flex items-center space-x-4">

            <h2 class="text-2xl font-bold uppercase tracking-widest text-pink-500">Digital Scavenger <span class="text-slate-400">24/7 Engine</span></h2>

            <div class="h-px flex-1 bg-gradient-to-r from-pink-900/50 to-transparent"></div>

        </div>

        <div class="titan-card p-0 overflow-hidden rounded-3xl border-pink-500/30">

            <div class="grid grid-cols-1 lg:grid-cols-3">

                <div class="col-span-2 bg-black/80 p-6 flex flex-col">

                    <div class="flex justify-between items-center mb-4">

                        <span class="mono text-xs text-pink-500 font-bold">>> LIVE DATA STREAM</span>

                        <span id="simStatus" class="mono text-[10px] bg-slate-800 text-slate-400 px-2 py-1 rounded">SYSTEM HALTED</span>

                    </div>

                    <div id="simConsole" class="flex-1 h-64 overflow-y-auto mono text-[10px] space-y-1 p-4 bg-black border border-slate-800 rounded">

                        <div class="text-slate-500">> Khởi tạo lò đốt phân mảnh. Chờ lệnh KÍCH HOẠT...</div>

                    </div>

                </div>

                <div class="p-6 bg-slate-900/50 border-l border-slate-800 space-y-6 flex flex-col justify-between">

                    <div>

                        <h4 class="text-xs uppercase font-bold text-slate-400 mb-4">Chỉ Số Mô Phỏng</h4>

                        <div class="space-y-3 mono text-xs">

                            <div class="flex justify-between"><span class="text-slate-500">Links Scanned:</span><span id="statScanned" class="text-white">0</span></div>

                            <div class="flex justify-between"><span class="text-pink-500">Trash Discarded:</span><span id="statDiscarded" class="text-pink-400">0</span></div>

                            <div class="flex justify-between"><span class="text-cyan-400">Nodes Extracted:</span><span id="statNodes" class="text-cyan-300 font-bold">0</span></div>

                        </div>

                    </div>

                    <div class="space-y-3">

                        <button id="btnSimToggle" onclick="toggleSimulation()" class="w-full py-3 bg-pink-500/10 border border-pink-500 text-pink-500 font-bold text-xs rounded-xl hover:bg-pink-500 hover:text-white transition-all shadow-[0_0_15px_rgba(255,0,85,0.2)]">

                            ▶ KÍCH HOẠT QUÉT 24/7

                        </button>

                        <div class="grid grid-cols-2 gap-2">

                            <button id="btnAudit" onclick="forcePmpAudit()" class="w-full py-2 bg-amber-500/10 border border-amber-500/50 text-amber-500 text-[10px] font-bold rounded-lg opacity-50 cursor-not-allowed hover:bg-amber-500 hover:text-black transition-all" disabled>

                                PMP AUDIT AI

                            </button>

                            <button id="btnDeploy" onclick="deployNodes()" class="w-full py-2 bg-cyan-500/10 border border-cyan-500/50 text-cyan-400 text-[10px] font-bold rounded-lg opacity-50 cursor-not-allowed hover:bg-cyan-500 hover:text-black transition-all" disabled>

                                DEPLOY TO DRIVE

                            </button>

                        </div>

                    </div>

                </div>

            </div>

        </div>

    </section>


    <!-- SECTION: TITAN ORACLE AI & TTS -->

    <section id="oracle" class="space-y-8">

        <div class="flex items-center space-x-4">

            <h2 class="text-2xl font-bold uppercase tracking-widest text-cyan-400">Titan <span class="text-slate-400">Oracle AI</span></h2>

            <div class="h-px flex-1 bg-gradient-to-r from-cyan-900/50 to-transparent"></div>

        </div>

        <div class="titan-card p-6 md:p-8 rounded-3xl">

            <div class="grid grid-cols-1 lg:grid-cols-3 gap-8">

                <div class="space-y-4">

                    <p class="text-xs text-slate-400 leading-relaxed">Cố vấn chiến lược lõi. Được nạp ngữ cảnh PMP, dự án LH-EW và chỉ số AQ. Hỗ trợ tổng hợp giọng nói thực tế.</p>

                    <textarea id="oracleInput" rows="4" class="w-full bg-black border border-cyan-500/30 rounded-xl p-3 text-xs text-cyan-400 focus:border-cyan-500 outline-none resize-none mono" placeholder="Nhập truy vấn chiến lược PMP hoặc Urban Mining..."></textarea>

                    <div class="flex space-x-2">

                        <button id="btnOracle" onclick="askOracle()" class="flex-1 py-3 bg-cyan-500/20 border border-cyan-500 text-cyan-400 font-bold text-xs rounded-xl hover:bg-cyan-400 hover:text-black transition-all">TRUY VẤN</button>

                        <button id="btnVoice" onclick="playVoice()" class="hidden flex-1 py-3 bg-indigo-500/20 border border-indigo-500 text-indigo-400 font-bold text-xs rounded-xl hover:bg-indigo-400 hover:text-black transition-all">🔊 ĐỌC ÂM THANH</button>

                    </div>

                </div>

                <div class="lg:col-span-2 bg-black/80 rounded-xl border border-slate-800 p-6 overflow-y-auto max-h-64 mono text-sm text-slate-300" id="oracleOutput">

                    <span class="text-slate-600">>> Chờ lệnh từ tư lệnh...</span>

                </div>

            </div>

        </div>

    </section>


    <!-- SECTION: TITAN FORGE (MULTI-TURN IMAGE) -->

    <section id="forge" class="space-y-8">

        <div class="flex items-center space-x-4">

            <h2 class="text-2xl font-bold uppercase tracking-widest text-amber-500">Titan <span class="text-slate-400">Forge</span></h2>

            <div class="h-px flex-1 bg-gradient-to-r from-amber-900/50 to-transparent"></div>

        </div>

        <div class="titan-card p-6 md:p-8 rounded-3xl border-amber-500/30">

            <div class="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center">

                <div class="space-y-4">

                    <p class="text-xs text-slate-400 leading-relaxed">Kết xuất bản vẽ kỹ thuật bằng Gemini 3.1 Flash Image. Hỗ trợ chỉnh sửa đa lượt (Multi-turn).</p>

                    <textarea id="forgeInput" rows="3" class="w-full bg-black border border-amber-500/30 rounded-xl p-3 text-xs text-amber-500 focus:border-amber-500 outline-none resize-none mono" placeholder="Mô tả bản vẽ hoặc lệnh chỉnh sửa (VD: Xóa đường màu đỏ)..."></textarea>

                    <div class="flex space-x-2">

                        <button id="btnForge" onclick="generateBlueprint()" class="flex-1 py-3 bg-amber-500/20 border border-amber-500 text-amber-500 font-bold text-xs rounded-xl hover:bg-amber-400 hover:text-black transition-all">🛠 RÈN BẢN VẼ</button>

                        <button onclick="resetForge()" class="py-3 px-4 bg-slate-800 text-slate-400 font-bold text-xs rounded-xl hover:bg-slate-700 transition-all">XÓA BỘ NHỚ</button>

                    </div>

                </div>

                <div class="w-full aspect-video bg-black/80 rounded-xl border border-slate-800 flex items-center justify-center overflow-hidden relative">

                    <span id="forgePlaceholder" class="text-slate-600 mono text-xs">>> Canvas trống...</span>

                    <img id="blueprintImage" class="hidden w-full h-full object-cover" alt="Blueprint">

                    <div id="forgeLoader" class="hidden absolute inset-0 bg-black/70 flex items-center justify-center">

                        <span class="text-amber-500 mono text-xs animate-pulse">>> Rendering...</span>

                    </div>

                </div>

            </div>

        </div>

    </section>


    <!-- SECTION: TITAN VISION (IMAGE ANALYSIS) -->

    <section id="vision" class="space-y-8">

        <div class="flex items-center space-x-4">

            <h2 class="text-2xl font-bold uppercase tracking-widest text-teal-400">Titan <span class="text-slate-400">Vision</span></h2>

            <div class="h-px flex-1 bg-gradient-to-r from-teal-900/50 to-transparent"></div>

        </div>

        <div class="titan-card p-6 md:p-8 rounded-3xl border-teal-400/30">

            <div class="grid grid-cols-1 lg:grid-cols-2 gap-8 items-start">

                <div class="space-y-4">

                    <p class="text-xs text-slate-400 leading-relaxed">Con mắt quang học bóc tách vật liệu E-Waste và phân tích rủi ro tái chế (Gemini Vision).</p>

                    <div class="border-2 border-dashed border-teal-500/30 rounded-xl p-6 text-center hover:bg-teal-500/10 cursor-pointer transition-colors" onclick="document.getElementById('visionUpload').click()">

                        <input type="file" id="visionUpload" class="hidden" accept="image/*" onchange="previewVision(event)">

                        <div id="visionPrompt" class="text-teal-500/70 mono text-xs">CLICK ĐỂ TẢI ẢNH (BO MẠCH / E-WASTE)</div>

                        <img id="visionImg" class="hidden max-h-32 mx-auto rounded border border-teal-500/50 mt-2" alt="Preview">

                    </div>

                    <button id="btnVision" onclick="analyzeVision()" class="w-full py-3 bg-teal-500/20 border border-teal-500 text-teal-400 font-bold text-xs rounded-xl hover:bg-teal-400 hover:text-black transition-all opacity-50 cursor-not-allowed" disabled>

                        👁️ PHÂN TÍCH QUANG HỌC

                    </button>

                </div>

                <div class="bg-black/80 rounded-xl border border-slate-800 p-6 min-h-[200px] mono text-sm text-slate-300 relative overflow-y-auto">

                    <div id="visionScanner" class="hidden absolute top-0 left-0 w-full h-1 bg-teal-400 shadow-[0_0_10px_#2dd4bf] animate-[scan_2s_linear_infinite]"></div>

                    <div id="visionOutput"><span class="text-slate-600">>> Chờ nạp dữ liệu quang học...</span></div>

                </div>

            </div>

        </div>

    </section>


    <!-- SECTION: TITAN MATRIX (JSON STRUCTURED) -->

    <section id="matrix" class="space-y-8">

        <div class="flex items-center space-x-4">

            <h2 class="text-2xl font-bold uppercase tracking-widest text-purple-400">Titan <span class="text-slate-400">Matrix</span></h2>

            <div class="h-px flex-1 bg-gradient-to-r from-purple-900/50 to-transparent"></div>

        </div>

        <div class="titan-card p-6 md:p-8 rounded-3xl border-purple-500/30">

            <div class="space-y-6">

                <p class="text-xs text-slate-400 leading-relaxed">Động cơ ép cấu trúc JSON. Nhập ý tưởng, AI phân rã thành bảng WBS chuẩn kỹ thuật không có văn bản thừa.</p>

                <div class="flex gap-4">

                    <input type="text" id="matrixInput" class="flex-1 bg-black border border-purple-500/30 rounded-xl p-3 text-sm text-purple-400 outline-none mono" placeholder="VD: Quy trình thu mua vi mạch mạ vàng từ nhà máy...">

                    <button id="btnMatrix" onclick="generateMatrix()" class="px-6 bg-purple-500/20 border border-purple-500 text-purple-400 font-bold text-xs rounded-xl hover:bg-purple-400 hover:text-black transition-all">MÃ HÓA CẤU TRÚC</button>

                </div>

                <div class="bg-black/80 rounded-xl border border-slate-800 overflow-x-auto">

                    <table class="w-full text-left text-xs text-slate-400 mono">

                        <thead class="bg-purple-900/20 text-purple-400 uppercase border-b border-slate-800">

                            <tr><th class="p-4">ID</th><th class="p-4">WBS Node (Công việc)</th><th class="p-4 text-right">Chi Phí (AC)</th><th class="p-4 text-center">Rủi Ro</th></tr>

                        </thead>

                        <tbody id="matrixBody" class="divide-y divide-slate-800/50">

                            <tr><td colspan="4" class="p-8 text-center text-slate-600">>> Dữ liệu cấu trúc trống...</td></tr>

                        </tbody>

                    </table>

                </div>

            </div>

        </div>

    </section>


    <!-- SECTION: TITAN WEB RADAR (SEARCH GROUNDING) -->

    <section id="radar" class="space-y-8 pb-20">

        <div class="flex items-center space-x-4">

            <h2 class="text-2xl font-bold uppercase tracking-widest text-emerald-400">Titan <span class="text-slate-400">Web Radar</span></h2>

            <div class="h-px flex-1 bg-gradient-to-r from-emerald-900/50 to-transparent"></div>

        </div>

        <div class="titan-card p-6 md:p-8 rounded-3xl border-emerald-500/30">

            <div class="grid grid-cols-1 lg:grid-cols-3 gap-8">

                <div class="space-y-4">

                    <p class="text-xs text-slate-400 leading-relaxed">Google Search Grounding. Quét dữ liệu thời gian thực (giá vàng, chính sách môi trường mới nhất) kèm trích dẫn thực chứng.</p>

                    <textarea id="radarInput" rows="3" class="w-full bg-black border border-emerald-500/30 rounded-xl p-3 text-xs text-emerald-400 outline-none resize-none mono" placeholder="VD: Giá phế liệu điện tử Palladium hôm nay là bao nhiêu?"></textarea>

                    <button id="btnRadar" onclick="runRadar()" class="w-full py-3 bg-emerald-500/20 border border-emerald-500 text-emerald-400 font-bold text-xs rounded-xl hover:bg-emerald-400 hover:text-black transition-all">📡 QUÉT MẠNG LƯỚI</button>

                </div>

                <div class="lg:col-span-2 flex flex-col border border-slate-800 rounded-xl overflow-hidden">

                    <div id="radarOutput" class="flex-1 bg-black/80 p-6 text-sm text-slate-300 mono overflow-y-auto max-h-48">

                        <span class="text-slate-600">>> Radar đang chờ tín hiệu...</span>

                    </div>

                    <div id="radarSources" class="bg-slate-900 p-4 border-t border-slate-800 min-h-[80px]">

                        <span class="text-xs text-slate-600 italic">Nguồn chứng thực sẽ xuất hiện ở đây.</span>

                    </div>

                </div>

            </div>

        </div>

    </section>


</main>


<script>

    function scrollToSection(id) { document.getElementById(id).scrollIntoView({ behavior: 'smooth' }); }


    // --- SCAVENGER 24/7 LOGIC ---

    let simInterval = null;

    let isSimRunning = false;

    let stats = { scanned: 0, discarded: 0, nodes: 0 };

    

    function logSim(msg, color = 'text-slate-500') {

        const consoleEl = document.getElementById('simConsole');

        const div = document.createElement('div');

        div.className = color;

        div.innerText = `> ${msg}`;

        consoleEl.appendChild(div);

        if(consoleEl.children.length > 50) consoleEl.removeChild(consoleEl.firstChild);

        consoleEl.scrollTop = consoleEl.scrollHeight;

    }


    function toggleSimulation() {

        const btn = document.getElementById('btnSimToggle');

        const status = document.getElementById('simStatus');

        

        if (isSimRunning) {

            // STOP

            clearInterval(simInterval);

            isSimRunning = false;

            btn.innerHTML = "▶ KÍCH HOẠT QUÉT 24/7";

            btn.classList.replace('bg-pink-500', 'bg-pink-500/10');

            btn.classList.replace('text-white', 'text-pink-500');

            status.innerText = "SYSTEM PAUSED";

            status.className = "mono text-[10px] bg-amber-500/20 text-amber-500 px-2 py-1 rounded";

            logSim("--- BỘ MÔ PHỎNG TẠM DỪNG. SẴN SÀNG KIỂM CHỨNG. ---", "text-amber-500 font-bold");

            

            // Enable Audit Button

            document.getElementById('btnAudit').disabled = false;

            document.getElementById('btnAudit').classList.remove('opacity-50', 'cursor-not-allowed');

            document.getElementById('btnAudit').classList.add('animate-pulse');

        } else {

            // START

            isSimRunning = true;

            btn.innerHTML = "⏸ TẠM DỪNG MÁY QUÉT";

            btn.classList.replace('bg-pink-500/10', 'bg-pink-500');

            btn.classList.replace('text-pink-500', 'text-white');

            status.innerText = "LIVE SCANNING";

            status.className = "mono text-[10px] bg-pink-500 text-white px-2 py-1 rounded animate-pulse";

            logSim("--- BẮT ĐẦU VÒNG LẶP CENTRIFUGAL ---", "text-pink-400 font-bold");

            

            // Disable Audit/Deploy while running

            document.getElementById('btnAudit').disabled = true;

            document.getElementById('btnAudit').classList.add('opacity-50', 'cursor-not-allowed');

            document.getElementById('btnDeploy').disabled = true;

            document.getElementById('btnDeploy').classList.add('opacity-50', 'cursor-not-allowed');


            simInterval = setInterval(() => {

                const stepScanned = Math.floor(Math.random() * 50000) + 10000;

                stats.scanned += stepScanned;

                stats.discarded += Math.floor(stepScanned * 0.999);

                

                if (Math.random() > 0.8) {

                    const newNodes = Math.floor(Math.random() * 5) + 1;

                    stats.nodes += newNodes;

                    logSim(`[EXTRACTED]: Kéo thành công ${newNodes} Nodes tri thức từ rác.`, "text-cyan-400");

                } else {

                    logSim(`[DISCARD]: Tiêu hủy ${Math.floor(stepScanned * 0.999)} links nhiễu.`, "text-pink-500/50");

                }

                

                document.getElementById('statScanned').innerText = stats.scanned.toLocaleString();

                document.getElementById('statDiscarded').innerText = stats.discarded.toLocaleString();

                document.getElementById('statNodes').innerText = stats.nodes.toLocaleString();

            }, 800);

        }

    }


    const API_KEY = ""; // Môi trường Canvas tự động cấp quyền

    const API_TEXT = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent?key=${API_KEY}`;


    async function forcePmpAudit() {

        const btn = document.getElementById('btnAudit');

        btn.disabled = true;

        btn.innerText = "ĐANG AUDIT...";

        btn.classList.remove('animate-pulse');

        logSim("=========================================", "text-amber-500");

        logSim("Khởi động Lõi Gemini để rà soát PMP Audit...", "text-amber-500 font-bold");


        const payload = {

            contents: [{ parts: [{ text: `Số liệu: Quét ${stats.scanned}, Hủy ${stats.discarded}, Thu ${stats.nodes} Nodes.` }] }],

            systemInstruction: { parts: [{ text: "Bạn là AI Giám sát PMP. Đánh giá số liệu quét rác. Viết 3 dòng log ngắn gọn phân tích CPI và Rủi ro. Văn phong terminal lạnh lùng." }] }

        };


        try {

            const res = await fetch(API_TEXT, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) });

            const data = await res.json();

            if(data.candidates?.[0]?.content?.parts?.[0]?.text) {

                const lines = data.candidates[0].content.parts[0].text.split('\n');

                lines.forEach(l => { if(l.trim()) logSim(`[AI_AUDIT]: ${l}`, "text-amber-300"); });

                logSim("[AUDIT_COMPLETE] Dữ liệu sạch. Cấp quyền Deploy.", "text-cyan-400 font-bold");

                const deployBtn = document.getElementById('btnDeploy');

                deployBtn.disabled = false;

                deployBtn.classList.remove('opacity-50', 'cursor-not-allowed');

                deployBtn.classList.add('bg-cyan-500', 'text-black', 'animate-pulse');

            }

        } catch(e) {

            logSim("[ERROR] Kết nối AI thất bại. Audit Bypass kích hoạt.", "text-red-500");

        } finally {

            btn.innerText = "AUDIT HOÀN TẤT";

        }

    }


    function deployNodes() {

        const btn = document.getElementById('btnDeploy');

        btn.disabled = true;

        btn.innerText = "ĐÃ ĐỒNG BỘ";

        btn.classList.remove('animate-pulse', 'bg-cyan-500', 'text-black');

        logSim(`[ROUTING]: Đang chuyển ${stats.nodes} Nodes vào kho tài sản...`, "text-cyan-400");

        setTimeout(() => {

            logSim("[SYNC]: Đã đồng bộ với Drive lõi. Tín hiệu gửi về lehaiuzb@gmail.com.", "text-white font-bold");

        }, 1000);

    }


    // --- ORACLE AI & TTS ---

    let lastOracleText = "";

    async function askOracle() {

        const input = document.getElementById('oracleInput').value;

        if(!input.trim()) return;

        const btn = document.getElementById('btnOracle');

        const out = document.getElementById('oracleOutput');

        

        btn.disabled = true; btn.innerText = "ĐANG TÍNH TOÁN...";

        out.innerHTML = '<span class="text-cyan-400 animate-pulse">Đang phân tích cấu trúc...</span>';


        const payload = {

            contents: [{ parts: [{ text: input }] }],

            systemInstruction: { parts: [{ text: "Bạn là Oracle AI của Titan Trinity. Tư vấn PMP và Urban Mining. Ngắn gọn, chuyên nghiệp, dùng định dạng HTML cơ bản (<b>, <br>)." }] }

        };


        try {

            const res = await fetch(API_TEXT, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) });

            const data = await res.json();

            if(data.candidates?.[0]?.content?.parts?.[0]?.text) {

                lastOracleText = data.candidates[0].content.parts[0].text;

                out.innerHTML = lastOracleText.replace(/\*\*(.*?)\*\*/g, '<strong class="text-cyan-400">$1</strong>').replace(/\n/g, '<br>');

                document.getElementById('btnVoice').classList.remove('hidden');

            }

        } catch(e) { out.innerHTML = '<span class="text-red-500">Lỗi kết nối Oracle.</span>'; }

        finally { btn.disabled = false; btn.innerText = "TRUY VẤN"; }

    }


    // TTS Audio Converter Functions

    function base64ToArrayBuffer(base64) {

        const binary_string = window.atob(base64);

        const len = binary_string.length;

        const bytes = new Uint8Array(len);

        for (let i = 0; i < len; i++) bytes[i] = binary_string.charCodeAt(i);

        return bytes.buffer;

    }

    function pcmToWav(pcmData, sampleRate) {

        const numChannels = 1, byteRate = sampleRate * 2;

        const buffer = new ArrayBuffer(44 + pcmData.byteLength);

        const view = new DataView(buffer);

        const writeStr = (offset, str) => { for (let i=0; i<str.length; i++) view.setUint8(offset+i, str.charCodeAt(i)); };

        writeStr(0, 'RIFF'); view.setUint32(4, 36 + pcmData.byteLength, true);

        writeStr(8, 'WAVE'); writeStr(12, 'fmt '); view.setUint32(16, 16, true);

        view.setUint16(20, 1, true); view.setUint16(22, numChannels, true);

        view.setUint32(24, sampleRate, true); view.setUint32(28, byteRate, true);

        view.setUint16(32, 2, true); view.setUint16(34, 16, true);

        writeStr(36, 'data'); view.setUint32(40, pcmData.byteLength, true);

        new Uint8Array(buffer, 44).set(new Uint8Array(pcmData.buffer));

        return new Blob([buffer], { type: 'audio/wav' });

    }


    async function playVoice() {

        if(!lastOracleText) return;

        const btn = document.getElementById('btnVoice');

        btn.disabled = true; btn.innerText = "ĐANG TỔNG HỢP...";

        const API_TTS = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-tts:generateContent?key=${API_KEY}`;

        const cleanText = lastOracleText.replace(/\*\*/g, '').replace(/#/g, '');


        try {

            const res = await fetch(API_TTS, {

                method: 'POST', headers: { 'Content-Type': 'application/json' },

                body: JSON.stringify({

                    contents: [{ parts: [{ text: cleanText }] }],

                    generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Charon" } } } },

                    model: "gemini-2.5-flash-preview-tts"

                })

            });

            const data = await res.json();

            const part = data.candidates?.[0]?.content?.parts?.[0];

            if(part?.inlineData?.data) {

                const sampleRate = parseInt(part.inlineData.mimeType.match(/rate=(\d+)/)[1] || "24000", 10);

                const pcm16 = new Int16Array(base64ToArrayBuffer(part.inlineData.data));

                const audio = new Audio(URL.createObjectURL(pcmToWav(pcm16, sampleRate)));

                audio.play();

                btn.innerText = "🔊 ĐANG PHÁT...";

                audio.onended = () => { btn.innerText = "🔊 ĐỌC LẠI"; btn.disabled = false; };

            } else { btn.disabled = false; btn.innerText = "LỖI ÂM THANH"; }

        } catch(e) { btn.disabled = false; btn.innerText = "LỖI MẠNG"; }

    }


    // --- TITAN FORGE (MULTI-TURN IMAGE) ---

    let forgeHistory = [];

    function resetForge() {

        forgeHistory = [];

        document.getElementById('forgeInput').value = '';

        document.getElementById('blueprintImage').classList.add('hidden');

        document.getElementById('forgePlaceholder').classList.remove('hidden');

        document.getElementById('btnForge').innerText = "🛠 RÈN BẢN VẼ";

    }


    async function generateBlueprint() {

        const input = document.getElementById('forgeInput').value;

        if(!input.trim()) return;

        const btn = document.getElementById('btnForge');

        const loader = document.getElementById('forgeLoader');

        const isEdit = forgeHistory.length > 0;

        

        btn.disabled = true; btn.innerText = "RENDERING..."; loader.classList.remove('hidden');

        const API_IMG = `https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash-image-preview:generateContent?key=${API_KEY}`;

        

        let prompt = isEdit ? `Modify image: ${input}` : `Detailed technical cyberpunk blueprint schematic of: ${input}. Glowing amber/cyan lines on dark obsidian background.`;

        forgeHistory.push({ role: 'user', parts: [{ text: prompt }] });


        try {

            const res = await fetch(API_IMG, {

                method: 'POST', headers: { 'Content-Type': 'application/json' },

                body: JSON.stringify({ contents: forgeHistory, generationConfig: { responseModalities: ['IMAGE'], imageConfig: { aspectRatio: "16:9" } } })

            });

            const data = await res.json();

            const part = data.candidates?.[0]?.content?.parts?.find(p => p.inlineData);

            if(part?.inlineData) {

                document.getElementById('blueprintImage').src = `data:${part.inlineData.mimeType};base64,${part.inlineData.data}`;

                document.getElementById('blueprintImage').classList.remove('hidden');

                document.getElementById('forgePlaceholder').classList.add('hidden');

                forgeHistory.push(data.candidates[0].content);

                btn.innerText = "🛠 CHỈNH SỬA TIẾP";

            } else { throw new Error("No image data"); }

        } catch(e) {

            forgeHistory.pop();

            btn.innerText = "LỖI ENGINE RENDER";

        } finally {

            btn.disabled = false; loader.classList.add('hidden');

            document.getElementById('forgeInput').value = '';

        }

    }


    // --- TITAN VISION ---

    let visionB64 = null;

    function previewVision(e) {

        const file = e.target.files[0];

        if(!file) return;

        const reader = new FileReader();

        reader.onload = (event) => {

            document.getElementById('visionImg').src = event.target.result;

            document.getElementById('visionImg').classList.remove('hidden');

            document.getElementById('visionPrompt').classList.add('hidden');

            visionB64 = event.target.result.split(',')[1];

            document.getElementById('btnVision').disabled = false;

            document.getElementById('btnVision').classList.remove('opacity-50', 'cursor-not-allowed');

        };

        reader.readAsDataURL(file);

    }


    async function analyzeVision() {

        if(!visionB64) return;

        const btn = document.getElementById('btnVision');

        const out = document.getElementById('visionOutput');

        const scanner = document.getElementById('visionScanner');

        

        btn.disabled = true; btn.innerText = "ĐANG PHÂN TÍCH..."; scanner.classList.remove('hidden');

        out.innerHTML = '<span class="text-teal-400">Đang nhận diện quang học...</span>';


        const payload = {

            contents: [{ role: "user", parts: [

                { text: "Bạn là AI phân tích E-waste. Xác định vật liệu này, ước tính kim loại quý, và nêu 1 rủi ro theo chuẩn PMP nếu tháo dỡ bằng ly tâm. Trả lời ngắn gạch đầu dòng." },

                { inlineData: { mimeType: "image/jpeg", data: visionB64 } }

            ]}]

        };


        try {

            const res = await fetch(API_TEXT, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) });

            const data = await res.json();

            if(data.candidates?.[0]?.content?.parts?.[0]?.text) {

                let text = data.candidates[0].content.parts[0].text.replace(/\*\*(.*?)\*\*/g, '<strong class="text-teal-400">$1</strong>');

                out.innerHTML = text.replace(/\n/g, '<br>');

            }

        } catch(e) { out.innerHTML = '<span class="text-red-500">Lỗi phân tích hình ảnh.</span>'; }

        finally { btn.disabled = false; btn.innerText = "👁️ PHÂN TÍCH QUANG HỌC"; scanner.classList.add('hidden'); }

    }


    // --- TITAN MATRIX (JSON SCHEMA) ---

    async function generateMatrix() {

        const input = document.getElementById('matrixInput').value;

        if(!input.trim()) return;

        const btn = document.getElementById('btnMatrix');

        const tbody = document.getElementById('matrixBody');

        

        btn.disabled = true; btn.innerText = "ĐANG MÃ HÓA...";

        tbody.innerHTML = '<tr><td colspan="4" class="p-8 text-center text-purple-400 animate-pulse">Đang ép cấu trúc JSON...</td></tr>';


        const payload = {

            contents: [{ parts: [{ text: `Phân rã dự án này thành 3-4 công việc: ${input}` }] }],

            generationConfig: {

                responseMimeType: "application/json",

                responseSchema: {

                    type: "ARRAY", items: { type: "OBJECT", properties: {

                        nodeId: { type: "STRING" }, taskName: { type: "STRING" },

                        estimatedCostUSD: { type: "NUMBER" }, riskLevel: { type: "STRING" }

                    }, required: ["nodeId", "taskName", "estimatedCostUSD", "riskLevel"] }

                }

            }

        };


        try {

            const res = await fetch(API_TEXT, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) });

            const data = await res.json();

            if(data.candidates?.[0]?.content?.parts?.[0]?.text) {

                const matrix = JSON.parse(data.candidates[0].content.parts[0].text);

                tbody.innerHTML = '';

                matrix.forEach(item => {

                    const row = document.createElement('tr'); row.className = "hover:bg-purple-900/20";

                    let rColor = item.riskLevel.includes('HIGH') ? 'text-pink-500' : 'text-teal-400';

                    row.innerHTML = `<td class="p-4 text-slate-500 font-bold">${item.nodeId}</td><td class="p-4 text-slate-300">${item.taskName}</td><td class="p-4 text-right text-cyan-400">$${item.estimatedCostUSD.toLocaleString()}</td><td class="p-4 text-center font-bold ${rColor}">${item.riskLevel}</td>`;

                    tbody.appendChild(row);

                });

            }

        } catch(e) { tbody.innerHTML = '<tr><td colspan="4" class="p-8 text-center text-red-500">Lỗi parse cấu trúc.</td></tr>'; }

        finally { btn.disabled = false; btn.innerText = "MÃ HÓA CẤU TRÚC"; }

    }


    // --- TITAN WEB RADAR (SEARCH GROUNDING) ---

    async function runRadar() {

        const input = document.getElementById('radarInput').value;

        if(!input.trim()) return;

        const btn = document.getElementById('btnRadar');

        const out = document.getElementById('radarOutput');

        const srcDiv = document.getElementById('radarSources');

        

        btn.disabled = true; btn.innerText = "QUÉT MẠNG LƯỚI...";

        out.innerHTML = '<span class="text-emerald-400 animate-pulse">Kích hoạt Search Grounding...</span>'; srcDiv.innerHTML = '';


        const payload = {

            contents: [{ parts: [{ text: input }] }],

            tools: [{ "google_search": {} }],

            systemInstruction: { parts: [{ text: "Trích xuất thông tin mới nhất trên Google. Ngắn gọn." }] }

        };


        try {

            const res = await fetch(API_TEXT, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) });

            const data = await res.json();

            const cand = data.candidates?.[0];

            if(cand?.content?.parts?.[0]?.text) {

                out.innerHTML = cand.content.parts[0].text.replace(/\*\*(.*?)\*\*/g, '<strong class="text-emerald-400">$1</strong>').replace(/\n/g, '<br>');

                

                if(cand.groundingMetadata?.groundingAttributions) {

                    let html = '<h4 class="text-emerald-500 font-bold text-[10px] uppercase mb-2">Sources:</h4><ul class="space-y-1">';

                    cand.groundingMetadata.groundingAttributions.forEach(a => {

                        if(a.web?.uri && a.web?.title) html += `<li><a href="${a.web.uri}" target="_blank" class="text-xs text-slate-400 hover:text-emerald-400 break-all">> ${a.web.title}</a></li>`;

                    });

                    srcDiv.innerHTML = html + '</ul>';

                } else { srcDiv.innerHTML = '<span class="text-xs text-slate-600">Không có trích dẫn trực tiếp.</span>'; }

            }

        } catch(e) { out.innerHTML = '<span class="text-red-500">Lỗi kết nối Radar.</span>'; }

        finally { btn.disabled = false; btn.innerText = "📡 QUÉT MẠNG LƯỚI"; }

    }

</script>

</body>

</html>

Nhận xét

Bài đăng phổ biến từ blog này

THE DARK SIDE OF GLORY: WHEN THE ELITE BORROW SWEAT TO SELL DREAMS

Unanchored Emotional Intelligence and the Systemic Risk of Manipulation

KHI TƯ DUY CẤU TRÚC LÀM RƠI RỤNG NGÔN TÌNH