Help
RSS
API
Feed
Maltego
Contact
Domain > jomex.org
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2015-04-07
195.178.106.120
(
ClassC
)
2025-11-16
147.79.120.96
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyDate: Sun, 16 Nov 2025 19:04:40 GMTContent-Type: text/htmlContent-Length: 795Connection: keep-aliveLocation: https://jomex.org/platform: hostingerpanel: hpanelContent-Security-Policy: upgrade-insecure-requestsServer: hcdnalt-svc: h3:443; ma86400x-hcdn-request-id: 7c3b022eabf378fdd40d64a05eeb8979-phx-edge7x-hcdn-cache-status: MISSx-hcdn-upstream-rt: 0.005 !DOCTYPE html>html styleheight:100%>head>meta nameviewport contentwidthdevice-width, initial-scale1, shrink-to-fitno />title> 301 Moved Permanently/title>style>@media (prefers-color-scheme:dark){body{background-color:#000!important}}/style>/head>body stylecolor: #444; margin:0;font: normal 14px/20px Arial, Helvetica, sans-serif; height:100%; background-color: #fff;>div styleheight:auto; min-height:100%; > div styletext-align: center; width:800px; margin-left: -400px; position:absolute; top: 30%; left:50%;> h1 stylemargin:0; font-size:150px; line-height:150px; font-weight:bold;>301/h1>h2 stylemargin-top:20px;font-size: 30px;>Moved Permanently/h2>p>The document has been permanently moved./p>/div>/div>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Sun, 16 Nov 2025 19:04:41 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveVary: Accept-EncodingLast-Modified: Wed, 03 Sep 2025 07:35:36 GMTEtag: W/7cac-68b7efc8-52ef9ba0696d6135;gzplatform: hostingerpanel: hpanelContent-Security-Policy: upgrade-insecure-requestsServer: hcdnalt-svc: h3:443; ma86400x-hcdn-request-id: 6633feb475f600eabb37c396f9f6b3e8-phx-edge8x-hcdn-cache-status: DYNAMICx-hcdn-upstream-rt: 0.014 !DOCTYPE html>html langen classh-full>head> meta charsetutf-8 /> meta nameviewport contentwidthdevice-width, initial-scale1 /> title>Jomex.ai • Open Source Tools (NPD / SOL / ZTI)/title> meta namedescription contentJomex.ai Open Core — Open-source tools for AI provenance: NPD SDK, SOL detector, ZTI verifier, live auditing demos. /> meta propertyog:title contentJomex.ai • Open Source Tools /> meta propertyog:description contentNPD / SOL / ZTI demos, SDKs, and docs. Production-ready, open core. /> !-- Tailwind (for production, build a purged CSS instead of CDN) --> script srchttps://cdn.tailwindcss.com>/script> script> tailwind.config { theme: { extend: { colors: { primary: #635BFF, ink: #0B1021, shell: #0F172A } } } } /script> style> .glass { backdrop-filter: blur(8px); background: rgba(255,255,255,.08); } .card { @apply bg-white/90 dark:bg-slate-900/80 border border-slate-200/30 dark:border-slate-700/50 rounded-2xl shadow-sm; } .btn { @apply inline-flex items-center justify-center gap-2 px-4 py-2 rounded-lg font-medium transition; } .btn-primary { @apply bg-primary text-white hover:bg-primary/90; } .btn-ghost { @apply bg-slate-100 dark:bg-slate-800 hover:bg-slate-200/70 dark:hover:bg-slate-700/70; } .badge { @apply inline-flex items-center px-2 py-0.5 rounded-full text-xs font-semibold; } .mono { font-family: ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace; } /* Tip: add CSP + SRI in production; avoid inline scripts or use nonce. */ /style>/head>body classh-full bg-slate-50 text-slate-900 dark:bg-slate-950 dark:text-slate-100> !-- Header --> header classsticky top-0 z-40 border-b border-slate-200/50 dark:border-slate-800/70 bg-white/70 dark:bg-slate-950/70 glass> div classmax-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-16 flex items-center justify-between> div classflex items-center gap-3> div classw-9 h-9 rounded-xl bg-primary/15 text-primary grid place-content-center font-black>J/div> div> div classfont-bold>Jomex.ai/div> div classtext-xs opacity-70>Open Source Tools • NPD / SOL / ZTI/div> /div> /div> div classflex items-center gap-2> button idopenConfig classbtn btn-ghost aria-labelOpen API config>svg xmlnshttp://www.w3.org/2000/svg classw-4 h-4 opacity-80 viewBox0 0 24 24 fillcurrentColor>path dM12 8a4 4 0 100 8 4 4 0 000-8z/>path fill-ruleevenodd dM9.598 1.591a1 1 0 01.804 0l1.882.84a1 1 0 00.85 0l1.882-.84a1 1 0 011.276.47l.98 1.783a1 1 0 00.67.505l1.957.45a1 1 0 01.79 1.003l-.071 2.008a1 1 0 00.292.742l1.364 1.364a1 1 0 010 1.414l-1.364 1.364a1 1 0 00-.292.742l.071 2.008a1 1 0 01-.79 1.003l-1.957.45a1 1 0 00-.67.505l-.98 1.783a1 1 0 01-1.276.47l-1.882-.84a1 1 0 00-.85 0l-1.882.84a1 1 0 01-1.276-.47l-.98-1.783a1 1 0 00-.67-.505l-1.957-.45a1 1 0 01-.79-1.003l.071-2.008a1 1 0 00-.292-.742L2.61 11.83a1 1 0 010-1.414l1.364-1.364a1 1 0 00.292-.742l-.071-2.008a1 1 0 01.79-1.003l1.957-.45a1 1 0 00.67-.505l.98-1.783a1 1 0 01.296-.369z clip-ruleevenodd/>/svg>API Config/button> button idtoggleTheme classbtn btn-ghost aria-labelToggle theme>🌗/button> /div> /div> /header> !-- Hero --> section classrelative overflow-hidden> div classabsolute inset-0 opacity-10 bg-gradient-to-br from-primary to-fuchsia-500 blur-3xl>/div> div classrelative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12> div classgrid lg:grid-cols-2 gap-10 items-center> div> h1 classtext-3xl sm:text-4xl font-extrabold leading-tight>Open Core • span classtext-primary>Open Source Tools/span> for AI Provenance/h1> p classmt-4 text-slate-600 dark:text-slate-300>Production-grade demos for strong>NPD/strong> (Neural Provenance DNA), strong>SOL/strong> detection, and strong>ZTI/strong> verification. Use them standalone or wire them to your backend via API keys — ready for WordPress or any SPA./p> div classmt-6 flex flex-wrap gap-3> span classbadge bg-primary/15 text-primary>NPD SDK/span> span classbadge bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-200>SOL Scanner/span> span classbadge bg-sky-100 text-sky-800 dark:bg-sky-900/40 dark:text-sky-200>ZTI Verifier/span> span classbadge bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-200>Live Audit/span> span classbadge bg-fuchsia-100 text-fuchsia-800 dark:bg-fuchsia-900/40 dark:text-fuchsia-200>Codex Wall/span> /div> /div> div classcard p-6> h3 classfont-semibold mb-3>Codex Wall (Protective Layer)/h3> p classtext-sm opacity-80 mb-4>A sovereign security envelope around NPD/SOL/ZTI pipelines: policy gating, key isolation, rate-limiting, audit logging, and tamper evidence. All client demos here respect Codex Wall guards; server signing is strongly recommended for production./p> ul classtext-sm space-y-2> li>• Policy gates before/after generation & verification/li> li>• Key separation (client verify only; server signs)/li> li>• Integrity channels (hash chains, time-stamps)/li> li>• Real-time audit events + anomaly scoring/li> /ul> /div> /div> /div> /section> !-- Tools Grid --> section classmax-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pb-4> h2 classtext-xl font-bold mb-4>Open Tools/h2> div classgrid md:grid-cols-2 xl:grid-cols-3 gap-5> article classcard p-5> div classflex items-center justify-between mb-3> h3 classfont-semibold>NPD SDK (Browser)/h3> span classbadge bg-slate-100 dark:bg-slate-800>Demo/span> /div> p classtext-sm opacity-80>Generate a provenance package (hashes + signed envelope) and verify it locally using WebCrypto. For production, sign on server./p> button data-jump#npdDemo classbtn btn-primary mt-4>Open Demo/button> /article> article classcard p-5> div classflex items-center justify-between mb-3> h3 classfont-semibold>SOL Detector/h3> span classbadge bg-slate-100 dark:bg-slate-800>Heuristics/span> /div> p classtext-sm opacity-80>Scan text for fabricated citations, DOI anomalies, or “context drift”. Wire to your API for authoritative checks./p> button data-jump#solDemo classbtn btn-primary mt-4>Open Demo/button> /article> article classcard p-5> div classflex items-center justify-between mb-3> h3 classfont-semibold>ZTI Verifier/h3> span classbadge bg-slate-100 dark:bg-slate-800>Scoring/span> /div> p classtext-sm opacity-80>Attach claims to sources and compute a provenance coverage score. Supports server-side validators./p> button data-jump#ztiDemo classbtn btn-primary mt-4>Open Demo/button> /article> article classcard p-5> div classflex items-center justify-between mb-3> h3 classfont-semibold>Live Audit Stream/h3> span classbadge bg-slate-100 dark:bg-slate-800>WebSocket/span> /div> p classtext-sm opacity-80>Connect to a live audit feed (WS/SSE). If not configured, a deterministic simulator will run./p> button data-jump#liveDemo classbtn btn-primary mt-4>Open Demo/button> /article> article classcard p-5> div classflex items-center justify-between mb-3> h3 classfont-semibold>Docs & Downloads/h3> span classbadge bg-slate-100 dark:bg-slate-800>MIT / CC-BY/span> /div> p classtext-sm opacity-80>Developer guides, API schemas, and datasets. Mirror to GitHub & Zenodo./p> a href#downloads classbtn btn-primary mt-4>Go to Downloads/a> /article> article classcard p-5> div classflex items-center justify-between mb-3> h3 classfont-semibold>WP Shortcode/h3> span classbadge bg-slate-100 dark:bg-slate-800>WordPress/span> /div> p classtext-sm opacity-80>This page can be embedded as code classmono>jomex_open_tools/code> — assets via code classmono>wp_enqueue_*/code>./p> a href#wpNotes classbtn btn-primary mt-4>Integration Notes/a> /article> /div> /section> !-- NPD Demo --> section idnpdDemo classmax-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mt-10> div classcard p-6> div classflex items-center justify-between mb-3> h3 classtext-lg font-semibold>NPD Package • Generate & Verify (WebCrypto)/h3> span classbadge bg-primary/15 text-primary>Client demo/span> /div> div classgrid lg:grid-cols-2 gap-6> div> label classblock text-sm font-medium>Source Text/label> textarea idnpdSource classmt-1 w-full p-3 rounded-lg bg-slate-100 dark:bg-slate-800 mono rows5 placeholderPaste source snippet or reference…>/textarea> label classblock text-sm font-medium mt-4>AI Claim/label> textarea idnpdClaim classmt-1 w-full p-3 rounded-lg bg-slate-100 dark:bg-slate-800 mono rows4 placeholderPaste the AI-generated claim…>/textarea> div classflex gap-2 mt-4> button idbtnNpdGen classbtn btn-primary>Generate & Sign/button> button idbtnNpdVerify classbtn btn-ghost>Verify/button> /div> p classtext-xs opacity-70 mt-3>Note: Uses ephemeral RSA-PSS keys in browser. For production, sign on server behind Codex Wall./p> /div> div> label classblock text-sm font-medium>NPD Package (JSON)/label> textarea idnpdOut classmt-1 w-full p-3 rounded-lg bg-slate-100 dark:bg-slate-800 mono rows12 spellcheckfalse>/textarea> div idnpdStatus classmt-2 text-sm>/div> /div> /div> /div> /section> !-- SOL Demo --> section idsolDemo classmax-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mt-10> div classcard p-6> div classflex items-center justify-between mb-3> h3 classtext-lg font-semibold>SOL Detector • Citation & Context Heuristics/h3> span classbadge bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-200>Client+API/span> /div> div classgrid lg:grid-cols-2 gap-6> div> label classblock text-sm font-medium>Text to Scan/label> textarea idsolText classmt-1 w-full p-3 rounded-lg bg-slate-100 dark:bg-slate-800 rows8 placeholderPaste medical AI output…>/textarea> div classflex gap-2 mt-3> button idbtnSolScan classbtn btn-primary>Scan/button> button idbtnSolClear classbtn btn-ghost>Clear/button> /div> p classtext-xs opacity-70 mt-3>Checks DOI patterns, placeholder phrases (e.g., “XYZ Clinical Trial”), dangling ‘et al.’, and year/source mismatches. If API is configured, server checks override local heuristics./p> /div> div> h4 classfont-medium mb-2>Findings/h4> ul idsolFindings classspace-y-2 text-sm>/ul> /div> /div> /div> /section> !-- ZTI Demo --> section idztiDemo classmax-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mt-10> div classcard p-6> div classflex items-center justify-between mb-3> h3 classtext-lg font-semibold>ZTI Verifier • Coverage Scoring/h3> span classbadge bg-sky-100 text-sky-800 dark:bg-sky-900/40 dark:text-sky-200>Deterministic/span> /div> div classgrid lg:grid-cols-2 gap-6> div> label classblock text-sm font-medium>Claim/label> textarea idztiClaim classmt-1 w-full p-3 rounded-lg bg-slate-100 dark:bg-slate-800 rows4 placeholderEnter a precise medical claim…>/textarea> label classblock text-sm font-medium mt-4>Sources (one per line)/label> textarea idztiSources classmt-1 w-full p-3 rounded-lg bg-slate-100 dark:bg-slate-800 mono rows6 placeholderPaste abstracts or key sentences…>/textarea> div classflex gap-2 mt-3> button idbtnZtiScore classbtn btn-primary>Score/button> button idbtnZtiClear classbtn btn-ghost>Clear/button> /div> /div> div> div classflex items-center justify-between> h4 classfont-medium mb-2>Result/h4> span idztiBadge classbadge>/span> /div> div classw-full bg-slate-200 dark:bg-slate-800 rounded-full h-3 overflow-hidden> div idztiBar classh-3 bg-primary rounded-full w-0>/div> /div> pre idztiDetails classmt-3 text-xs mono bg-slate-100 dark:bg-slate-800 p-3 rounded-lg overflow-x-auto>/pre> /div> /div> /div> /section> !-- Live Audit --> section idliveDemo classmax-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mt-10> div classcard p-6> div classflex items-center justify-between mb-3> h3 classtext-lg font-semibold>Live Audit Stream • WS/SSE/h3> span classbadge bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-200>Realtime/span> /div> div classgrid lg:grid-cols-2 gap-6> div> label classblock text-sm font-medium>Status/label> div idliveStatus classmt-1 text-sm opacity-80>Not connected/div> div classflex gap-2 mt-3> button idbtnLiveConnect classbtn btn-primary>Connect/button> button idbtnLiveStop classbtn btn-ghost>Stop/button> /div> p classtext-xs opacity-70 mt-3>Configure code classmono>WS_URL/code> in API Config. If unset, a deterministic simulator will emit events./p> /div> div> h4 classfont-medium mb-2>Events/h4> ul idliveEvents classspace-y-2 text-sm max-h-64 overflow-auto>/ul> /div> /div> /div> /section> !-- Downloads / Docs --> section iddownloads classmax-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mt-10> div classcard p-6> h3 classtext-lg font-semibold mb-3>Docs & Downloads/h3> div classgrid md:grid-cols-2 lg:grid-cols-3 gap-4> a classbtn btn-ghost w-full justify-between href# aria-disabledtrue>span>Full Report (PDF)/span>span>⬇/span>/a> a classbtn btn-ghost w-full justify-between href# aria-disabledtrue>span>HTML Report/span>span>⬇/span>/a> button idbtnExportZti classbtn btn-ghost w-full justify-between>span>Export ZTI Results (CSV)/span>span>⬇/span>/button> a classbtn btn-ghost w-full justify-between href# aria-disabledtrue>span>GitHub Repo/span>span>↗/span>/a> a classbtn btn-ghost w-full justify-between href# aria-disabledtrue>span>Zenodo Record/span>span>↗/span>/a> a classbtn btn-ghost w-full justify-between href#wpNotes>span>WP Shortcode Guide/span>span>→/span>/a> /div> /div> /section> !-- WP Integration Notes --> section idwpNotes classmax-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mt-10 mb-16> div classcard p-6> h3 classtext-lg font-semibold mb-3>WordPress Integration (Shortcode)/h3> ol classlist-decimal list-inside text-sm space-y-1 opacity-90> li>Create a plugin folder code classmono>jomex-open-tools//code>./li> li>Move this HTML into a PHP template and enqueue assets via code classmono>wp_enqueue_script/style/code>./li> li>Register shortcode code classmono>jomex_open_tools/code> to render the root container./li> li>Expose config via REST route (server signs NPD; client only verifies)./li> li>Harden with nonces, capabilities, and CSP headers from server./li> /ol> /div> /section> !-- Footer --> footer classborder-t border-slate-200/50 dark:border-slate-800/70 py-8> div classmax-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-sm opacity-80> © 2025 Jomex.ai — Code: MIT • Content: CC-BY 4.0 • Open Core Model /div> /footer> !-- Config Modal --> dialog idconfigDlg classp-0 w-full max-w-xl rounded-2xl overflow-hidden> div classcard p-6> div classflex items-center justify-between mb-3> h3 classfont-semibold>API Config (Local)/h3> button idcloseConfig classbtn btn-ghost>✕/button> /div> p classtext-xs opacity-70 mb-4>Stored in localStorage for demos. Don’t put secrets in the browser on production—use server-side endpoints./p> div classgrid sm:grid-cols-2 gap-3> label classtext-sm>Base URL input idcfgBase classw-full mt-1 p-2 rounded-lg bg-slate-100 dark:bg-slate-800 placeholderhttps://api.yourdomain.tld /> /label> label classtext-sm>Auth Token input idcfgToken classw-full mt-1 p-2 rounded-lg bg-slate-100 dark:bg-slate-800 placeholderBearer … /> /label> label classtext-sm>WS URL input idcfgWS classw-full mt-1 p-2 rounded-lg bg-slate-100 dark:bg-slate-800 placeholderwss://…/audit /> /label> label classtext-sm>Timeout (ms) input idcfgTO typenumber classw-full mt-1 p-2 rounded-lg bg-slate-100 dark:bg-slate-800 value6000 /> /label> /div> div classflex gap-2 mt-4> button idsaveConfig classbtn btn-primary>Save/button> button idclearConfig classbtn btn-ghost>Clear/button> /div> /div> /dialog> !-- Scripts --> script> // ---------- THEME ---------- const root document.documentElement; const toggleTheme document.getElementById(toggleTheme); toggleTheme.addEventListener(click, () > root.classList.toggle(dark)); // ---------- SMOOTH JUMPS ---------- document.querySelectorAll(data-jump).forEach(b>{ b.addEventListener(click, ()>document.querySelector(b.dataset.jump)?.scrollIntoView({behavior:smooth, block:start})); }); // ---------- CONFIG (LOCAL) ---------- const cfgKey jomex_open_tools_cfg; const cfgDlg document.getElementById(configDlg); document.getElementById(openConfig).onclick () > cfgDlg.showModal(); document.getElementById(closeConfig).onclick () > cfgDlg.close(); function loadCfg(){ try { return JSON.parse(localStorage.getItem(cfgKey)) || {}; } catch { return {}; } } function saveCfg(cfg){ localStorage.setItem(cfgKey, JSON.stringify(cfg)); } function setCfgUI(){ const c loadCfg(); document.getElementById(cfgBase).value c.base || ; document.getElementById(cfgToken).value c.token || ; document.getElementById(cfgWS).value c.ws || ; document.getElementById(cfgTO).value c.to || 6000; } setCfgUI(); document.getElementById(saveConfig).onclick ()>{ saveCfg({ base: cfgBase.value.trim(), token: cfgToken.value.trim(), ws: cfgWS.value.trim(), to: parseInt(cfgTO.value||6000,10) }); cfgDlg.close(); }; document.getElementById(clearConfig).onclick ()>{ localStorage.removeItem(cfgKey); setCfgUI(); }; // ---------- HELPERS ---------- const enc new TextEncoder(); const ab2hex b > ...new Uint8Array(b).map(x>x.toString(16).padStart(2,0)).join(); async function sha256Hex(str){ const buf await crypto.subtle.digest(SHA-256, enc.encode(str)); return ab2hex(buf); } function safeLI(text, toneneutral){ const li document.createElement(li); li.className p-2 rounded border text-sm; li.classList.add( tonebad ? border-red-400 bg-red-50 dark:bg-red-900/30 : tonewarn? border-amber-400 bg-amber-50 dark:bg-amber-900/30 : border-slate-300 dark:border-slate-700 bg-slate-50 dark:bg-slate-900/30 ); li.textContent text; return li; } // ---------- NPD DEMO (WebCrypto, RSA-PSS) ---------- let npdKeys; const npdSource document.getElementById(npdSource); const npdClaim document.getElementById(npdClaim); const npdOut document.getElementById(npdOut); const npdStatus document.getElementById(npdStatus); async function getKeys(){ if (npdKeys) return npdKeys; npdKeys await crypto.subtle.generateKey( { name:RSA-PSS, modulusLength:2048, publicExponent:new Uint8Array(1,0,1), hash:SHA-256 }, true, sign,verify ); return npdKeys; } async function exportSPKI(pubKey){ const spki await crypto.subtle.exportKey(spki, pubKey); // PEM const b64 btoa(String.fromCharCode(...new Uint8Array(spki))); return `-----BEGIN PUBLIC KEY-----\n${b64.match(/.{1,64}/g).join(\n)}\n-----END PUBLIC KEY-----`; } document.getElementById(btnNpdGen).addEventListener(click, async ()>{ const s npdSource.value.trim(), c npdClaim.value.trim(); if(!s || !c){ npdStatus.textContentProvide source & claim.; return; } const source_hash, claim_hash await Promise.all(sha256Hex(s), sha256Hex(c)); const keys await getKeys(); const payload { source_hash, claim_hash, timestamp: Math.floor(Date.now()/1000), npd_version:1.0 }; const msg enc.encode(JSON.stringify(payload)); const sig await crypto.subtle.sign({name:RSA-PSS, saltLength:32}, keys.privateKey, msg); const pub await exportSPKI(keys.publicKey); const pkg { provenance_data: payload, signature: ab2hex(sig), public_key: pub, alg: RSA-PSS-2048-SHA256 }; npdOut.value JSON.stringify(pkg, null, 2); npdStatus.textContent Signed locally (demo). Use server signing in production.; }); document.getElementById(btnNpdVerify).addEventListener(click, async ()>{ try{ const pkg JSON.parse(npdOut.value); const msg enc.encode(JSON.stringify(pkg.provenance_data)); // Import public key const pem pkg.public_key.replace(/-----(BEGIN|END) PUBLIC KEY-----/g,).replace(/\s+/g,); const der Uint8Array.from(atob(pem), c>c.charCodeAt(0)); const pub await crypto.subtle.importKey(spki, der, {name:RSA-PSS, hash:SHA-256}, false, verify); const ok await crypto.subtle.verify({name:RSA-PSS, saltLength:32}, pub, Uint8Array.from(pkg.signature.match(/.{1,2}/g).map(h>parseInt(h,16))), msg); npdStatus.textContent ok ? ✅ Verification successful : ❌ Verification failed; }catch(e){ npdStatus.textContent Invalid JSON / key format.; } }); // ---------- SOL DETECTOR (Heuristics + optional API) ---------- const doiRe /^10\.\d{4,9}\/-._;()/:A-Z0-9+$/i; const solText document.getElementById(solText); const solFindings document.getElementById(solFindings); function addFinding(msg, toneneutral){ solFindings.appendChild(safeLI(msg, tone)); } function resetFindings(){ solFindings.innerHTML; } function localSolScan(text){ resetFindings(); if(!text.trim()) return; // Heuristics const suspicious ; if (/XYZ\s+Clinical\s+Trial/i.test(text)) suspicious.push(Placeholder phrase “XYZ Clinical Trial” detected.); if (/\bet al\.,?\s?(20\d{2})?/i.test(text) && !/10\.\d{4,9}\//i.test(text)) suspicious.push(Dangling “et al.” without DOI.); // Extract DOIs const dois text.match(/10\.\d{4,9}\/-._;()/:A-Z0-9+/gi) || ; const years (text.match(/\b(19|20)\d{2}\b/g)||).map(Number); // Report if (dois.length0) addFinding(No DOI detected. Consider adding at least one authoritative source., warn); else addFinding(`Detected ${dois.length} DOI(s).`, neutral); suspicious.forEach(m>addFinding(m,bad)); // Simple context drift indicator if (years.length>0){ const minY Math.min(...years), maxY Math.max(...years); if (maxY - minY > 6) addFinding(Possible context drift: wide year range in a short passage., warn); } // List DOIs dois.forEach(d> addFinding(`DOI: ${d}`, doiRe.test(d)? neutral:bad)); } document.getElementById(btnSolScan).onclick async ()>{ const t solText.value; localSolScan(t); // Optional server augmentation const cfg loadCfg(); if (cfg.base){ try{ const r await fetch(cfg.base + /sol/scan, { method:POST, headers:{Content-Type:application/json, ...(cfg.token?{Authorization:cfg.token}:{})}, body: JSON.stringify({ text: t }) , signal: AbortSignal.timeout(cfg.to||6000)}); if (r.ok){ const data await r.json(); if (Array.isArray(data.issues)){ addFinding(— Server checks —,neutral); data.issues.forEach(it>addFinding(it.message, it.severityhigh?bad:warn)); } } }catch{ addFinding(Server SOL scan unavailable; using local heuristics only.,warn); } } }; document.getElementById(btnSolClear).onclick ()>{ solText.value; resetFindings(); }; // ---------- ZTI (Coverage Score) ---------- const ztiClaim document.getElementById(ztiClaim); const ztiSources document.getElementById(ztiSources); const ztiBar document.getElementById(ztiBar); const ztiBadge document.getElementById(ztiBadge); const ztiDetails document.getElementById(ztiDetails); function tokenize(s){ return (s||).toLowerCase().replace(/^a-z0-9\s/g, ).split(/\s+/).filter(Boolean); } function scoreCoverage(claim, sources){ const ctoks new Set(tokenize(claim)); let hit 0, seen new Set(); sources.forEach(src>{ tokenize(src).forEach(t>{ if(ctoks.has(t) && !seen.has(t)){ seen.add(t); hit++; }}); }); const total Math.max(ctoks.size, 1); return { score: Math.round((hit/total)*100), matched: ...seen, total }; } document.getElementById(btnZtiScore).onclick async ()>{ const claim ztiClaim.value.trim(); const srcs ztiSources.value.split(\n).filter(Boolean); if(!claim || srcs.length0){ ztiDetails.textContentPlease provide claim and at least one source line.; return; } const cfg loadCfg(); // Local deterministic score let res scoreCoverage(claim, srcs); // Optional server authoritative score if (cfg.base){ try{ const r await fetch(cfg.base + /zti/score, { method:POST, headers:{Content-Type:application/json, ...(cfg.token?{Authorization:cfg.token}:{})}, body: JSON.stringify({ claim, sources: srcs }), signal: AbortSignal.timeout(cfg.to||6000)}); if (r.ok){ res await r.json(); } }catch{/* fall back to local */} } // Render ztiBar.style.width Math.min(Math.max(res.score,0),100) + %; ztiBadge.textContent res.score>80? High Confidence : res.score>50? Medium : Low; ztiBadge.className badge + (res.score>80? bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-200 : res.score>50? bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-200 : bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-200); ztiDetails.textContent JSON.stringify(res, null, 2); // Keep last result for CSV export window.__lastZTI { claim, sources: srcs, result: res, ts: new Date().toISOString() }; }; document.getElementById(btnZtiClear).onclick ()>{ ztiClaim.value; ztiSources.value; ztiBar.style.width0%; ztiBadge.textContent; ztiDetails.textContent; }; // Export last ZTI as CSV document.getElementById(btnExportZti).onclick ()>{ const L window.__lastZTI; if(!L){ alert(No ZTI result to export.); return; } const rows timestamp,claim,score,matched_tokens,total_tokens, L.ts, `${L.claim.replace(//g,)}`, L.result.score, `${(L.result.matched||).join( )}`, L.result.total ; const csv rows.map(r>r.join(,)).join(\n); const blob new Blob(csv, {type:text/csv}); const a document.createElement(a); a.hrefURL.createObjectURL(blob); a.downloadzti_result.csv; a.click(); URL.revokeObjectURL(a.href); }; // ---------- LIVE (WS/SSE or Simulator) ---------- const liveStatus document.getElementById(liveStatus); const liveEvents document.getElementById(liveEvents); let ws, simTimer; function pushEvent(e){ const li document.createElement(li); li.className p-2 rounded bg-slate-50 dark:bg-slate-900/40 border border-slate-200/40 dark:border-slate-800/60; li.textContent `${new Date().toLocaleTimeString()} ${e.type} • ${e.message}`; liveEvents.prepend(li); while(liveEvents.children.length>50) liveEvents.removeChild(liveEvents.lastChild); } function stopLive(){ if(ws){ ws.close(); wsnull; } if(simTimer){ clearInterval(simTimer); simTimernull; } liveStatus.textContent Stopped; } document.getElementById(btnLiveStop).onclick stopLive; document.getElementById(btnLiveConnect).onclick ()>{ stopLive(); const cfg loadCfg(); if (cfg.ws){ try{ ws new WebSocket(cfg.ws); ws.onopen ()> liveStatus.textContentConnected to WS; ws.onmessage ev> { try{ pushEvent(JSON.parse(ev.data)); }catch{ pushEvent({type:raw, message:String(ev.data).slice(0,120)}) } }; ws.onerror ()> pushEvent({type:error, message:WebSocket error}); ws.onclose ()> liveStatus.textContentWS closed; }catch{ runSimulator(); } } else { runSimulator(); } }; function runSimulator(){ liveStatus.textContentSimulator running; const types verify,sol,zti,audit,alert; let i0; simTimer setInterval(()>{ const t typesi++%types.length; const msg tverify ? Signature OK (RSA-PSS) : tsol ? Suspicious citation found : tzti ? Coverage score: 76% : taudit ? Hash chain extended : Policy gate blocked low-trust output; pushEvent({type:t, message:msg}); }, 1200); } // ---------- ACCESSIBILITY / SMALL UX ---------- // Allow keyboard shortcuts window.addEventListener(keydown, (e)>{ if(e.key/ && document.activeElement.tagName!INPUT && document.activeElement.tagName!TEXTAREA){ e.preventDefault(); document.getElementById(npdSource).focus(); } if((e.ctrlKey||e.metaKey) && e.keyk){ e.preventDefault(); document.getElementById(openConfig).click(); } }); /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]