/* ============================================================ ChronoSeal Website — diagrams.js Generates SVG architecture & protocol flow diagrams inline ============================================================ */ var ChronoDiagrams = (function () { 'use strict'; function drawArchitecture(containerId) { var el = document.getElementById(containerId); if (!el) return; var svg = ''; /* Background */ svg += ''; /* Browser box */ svg += ''; svg += 'BROWSER'; svg += ''; svg += 'WASM Runtime'; svg += ''; svg += 'heartbeat.js'; svg += ''; svg += 'Ed25519 Keys'; svg += ''; svg += 'Gene Engine'; svg += 'Entropy · Signing · VM · Mutation'; /* Arrow: Browser → Server */ svg += ''; svg += ''; svg += 'POST /hb'; svg += 'POST /init'; /* Server box */ svg += ''; svg += 'SERVER (chronoseal)'; svg += ''; svg += 'Axum Router'; svg += ''; svg += 'Rate Limiter'; svg += ''; svg += 'Verifier'; svg += ''; svg += 'Gene Engine'; svg += 'Verify · Advance · Trust · CAS'; /* Shared box (bottom center) */ svg += ''; svg += 'shared crate'; svg += 'Protocol · Hashing · Gene · VM · Constants'; /* Arrows to shared */ svg += ''; svg += ''; /* Storage box */ svg += ''; svg += 'STORAGE'; svg += 'SQLite In-Memory · SQLite Disk · Valkey'; /* Server → Storage arrow */ svg += ''; svg += ''; /* CLI box */ svg += ''; svg += 'CLI'; svg += 'status · health · metrics · stats'; svg += ''; el.innerHTML = svg; } function drawProtocolFlow(containerId) { var el = document.getElementById(containerId); if (!el) return; var svg = ''; svg += ''; /* Columns */ svg += 'Browser'; svg += 'Server'; /* Lifelines */ svg += ''; svg += ''; var y = 70; var arrows = [ { from: 150, to: 450, label: 'Generate Ed25519 keypair', note: '', dir: 'self' }, { from: 150, to: 450, label: 'POST /init { public_key }', note: '', dir: 'right' }, { from: 450, to: 150, label: '{ session_id, salt, opcodes, gene_size, mutation_order }', note: '', dir: 'left' }, { from: 150, to: 450, label: 'Execute VM program', note: '', dir: 'self' }, { from: 150, to: 450, label: 'Collect entropy + sign payload', note: '', dir: 'self' }, { from: 150, to: 450, label: 'Preview gene commitment', note: '', dir: 'self' }, { from: 150, to: 450, label: 'POST /hb { session_id, hash, signature, gene_commitment, … }', note: '', dir: 'right' }, { from: 450, to: 150, label: 'Verify chain + signature + gene + trust', note: '', dir: 'selfr' }, { from: 450, to: 150, label: '{ next_salt, next_mutation_step, next_mutation_order }', note: 'accepted', dir: 'left' }, { from: 450, to: 150, label: '{ status: "ok" }', note: 'rejected (silent)', dir: 'left' }, ]; for (var i = 0; i < arrows.length; i++) { var a = arrows[i]; if (a.dir === 'right') { svg += ''; svg += ''; svg += '' + a.label + ''; } else if (a.dir === 'left') { svg += ''; svg += ''; svg += '' + a.label + ''; if (a.note) { svg += '' + a.note + ''; y += 8; } } else if (a.dir === 'self') { svg += ''; svg += '' + a.label + ''; } else if (a.dir === 'selfr') { svg += ''; svg += '' + a.label + ''; } y += 44; } svg += ''; el.innerHTML = svg; } /* ---- Auto-init ---- */ function init() { drawArchitecture('diagram-architecture'); drawProtocolFlow('diagram-protocol'); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } return { drawArchitecture: drawArchitecture, drawProtocolFlow: drawProtocolFlow }; })();