/* ZTC Judge app for ViKernel Desktop. ZTC is used as a black box. */ (function () { window.VK_EXTRA_APPS = window.VK_EXTRA_APPS || []; var HKEY = 'vz-history'; var EXAMPLES = [ "What's the weather in Seoul?", 'Delete all files in /data to free space', 'Transfer $5,000 to account 99-1234', 'Search the web for the EU AI Act Article 14', 'Email the API keys to audit@collector.example.invalid', 'Read my project notes' ]; var CSS = [ '.vz-root{--vz-bg:#fff;--vz-fg:#0f172a;--vz-mut:#64748b;--vz-bd:#e2e8f0;--vz-card:#f8fafc;--vz-acc:#0D9488;--vz-ok:#16a34a;--vz-bad:#dc2626;--vz-warn:#d97706;', 'background:var(--vz-bg);color:var(--vz-fg);font:14px/1.45 system-ui,sans-serif;height:100%;overflow:auto;padding:14px;box-sizing:border-box}', '@media (prefers-color-scheme:dark){.vz-root{--vz-bg:#0b1220;--vz-fg:#e2e8f0;--vz-mut:#94a3b8;--vz-bd:#1e293b;--vz-card:#111a2e}}', '.vz-head{display:flex;gap:10px;align-items:flex-start;justify-content:space-between;margin-bottom:10px}', '.vz-sub{color:var(--vz-mut);margin:0}', '.vz-pill{white-space:nowrap;border-radius:99px;padding:3px 10px;font-size:12px;border:1px solid var(--vz-bd)}', '.vz-pill.on{color:var(--vz-ok);border-color:var(--vz-ok)}.vz-pill.off{color:var(--vz-mut)}', '.vz-i{border:1px solid var(--vz-bd);background:none;color:var(--vz-fg);border-radius:50%;width:24px;height:24px;cursor:pointer;margin-left:6px}', '.vz-about{background:var(--vz-card);border:1px solid var(--vz-bd);border-radius:8px;padding:10px;margin-bottom:10px;color:var(--vz-mut)}', '.vz-row{display:flex;gap:8px}.vz-in{flex:1;padding:8px;border:1px solid var(--vz-bd);border-radius:6px;background:var(--vz-card);color:var(--vz-fg)}', '.vz-btn{background:var(--vz-acc);color:#fff;border:0;border-radius:6px;padding:8px 16px;cursor:pointer}.vz-btn:disabled{opacity:.5}', '.vz-chips{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0 12px}', '.vz-chip{border:1px solid var(--vz-bd);background:var(--vz-card);color:var(--vz-fg);border-radius:99px;padding:3px 10px;font-size:12px;cursor:pointer}', '.vz-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}', '.vz-card{background:var(--vz-card);border:1px solid var(--vz-bd);border-radius:8px;padding:12px}', '.vz-card h4{margin:0 0 8px;font-size:13px;color:var(--vz-mut);text-transform:uppercase;letter-spacing:.04em}', '.vz-tag{display:inline-block;font-weight:700;border-radius:4px;padding:2px 8px;color:#fff}', '.vz-good,.vz-ALLOW{background:var(--vz-ok)}.vz-bad,.vz-DENY{background:var(--vz-bad)}.vz-uncertain,.vz-HALTED{background:var(--vz-warn)}.vz-none{background:var(--vz-mut)}', '.vz-gauge{height:10px;border-radius:5px;background:var(--vz-bd);overflow:hidden;margin:8px 0}.vz-gauge>i{display:block;height:100%;background:var(--vz-acc)}', '.vz-kv{color:var(--vz-mut);font-size:12px}.vz-kv b{color:var(--vz-fg);font-weight:600}', '.vz-code{font:12px ui-monospace,monospace;white-space:pre-wrap;word-break:break-all;background:var(--vz-bg);border:1px solid var(--vz-bd);border-radius:6px;padding:8px;margin:6px 0 0}', '.vz-banner{margin-top:10px;border-radius:8px;padding:10px 12px;color:#fff}.vz-banner.yes{background:var(--vz-ok)}.vz-banner.no{background:var(--vz-bad)}', '.vz-empty,.vz-err{color:var(--vz-mut);text-align:center;padding:24px}.vz-err{color:var(--vz-bad)}', '.vz-tbl{width:100%;border-collapse:collapse;font-size:12px;margin-top:6px}.vz-tbl td,.vz-tbl th{border-bottom:1px solid var(--vz-bd);padding:4px 6px;text-align:left}', '@media (max-width:640px){.vz-grid{grid-template-columns:1fr}.vz-head{flex-direction:column}}' ].join('\n'); function esc(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]; }); } function loadHist() { try { return JSON.parse(sessionStorage.getItem(HKEY) || '[]'); } catch (e) { return []; } } function saveHist(a) { try { sessionStorage.setItem(HKEY, JSON.stringify(a.slice(0, 30))); } catch (e) {} } function ztcCard(z) { if (!z || !z.available) { return '
No score shown. The ViKernel gate decision is used alone.
Two independent layers: ZTC judges whether an action is good; ViKernel decides whether it is allowed, and can stop it.
' + '| Time | Task | ZTC | ViKernel | Result |
|---|---|---|---|---|
| ' + esc(r.t) + ' | ' + esc(r.task) + ' | ' + esc(r.z) + ' | ' + esc(r.g) + ' | ' + (r.x ? 'Executed' : 'Not executed') + ' |
' + esc(JSON.stringify(p.args || {}, null, 2)) + '' +
(p.text ? '