(function() { 'use strict'; // --- DOM refs --- var term = document.getElementById('terminal'); var input = document.getElementById('cmd-input'); var promptText = document.getElementById('prompt-text'); var auditPanel = document.getElementById('audit-panel'); var vaultPanel = document.getElementById('vault-panel'); var vaultCount = document.getElementById('vault-count'); var sealCount = document.getElementById('seal-count'); var runtimeMode = document.getElementById('runtime-mode'); var bootScreen = document.getElementById('boot-screen'); var bootArt = document.getElementById('boot-art'); var bootStatus = document.getElementById('boot-status'); var app = document.getElementById('app'); var history = []; var historyIdx = -1; var currentRuntime = 'holy-sim'; var sealTotal = 0; // --- Terminal output --- function print(text, cls) { var d = document.createElement('div'); d.className = 'line ' + (cls || 'l-green'); d.textContent = text; term.appendChild(d); term.scrollTop = term.scrollHeight; } function prints(text, cls) { text.split('\n').forEach(function(l) { print(l, cls); }); } function promptEcho(cmd) { print('HolySim> ' + cmd, 'l-dim'); } // --- Audit update --- function refreshAudit() { var events = WozVault.readAuditLog(); vaultCount.textContent = events.length; sealCount.textContent = sealTotal; try { var ac = document.getElementById('agent-count'); var tc = document.getElementById('twin-count'); if (ac && typeof AgentRegistry !== 'undefined') ac.textContent = AgentRegistry.count(); if (tc && typeof TwinRegistry !== 'undefined') tc.textContent = TwinRegistry.count(); } catch {} auditPanel.innerHTML = ''; var show = events.slice(-15); for (var i = 0; i < show.length; i++) { var e = show[i]; var div = document.createElement('div'); div.className = 'audit-entry'; var line = '[' + (e.timestamp || '').slice(11, 19) + '] ' + e.type; if (e.agent) line += ' · ' + e.agent; div.textContent = line; if (e.seal) div.style.color = '#0ff'; auditPanel.appendChild(div); } auditPanel.scrollTop = auditPanel.scrollHeight; } function refreshVault() { var events = WozVault.readAuditLog(); vaultPanel.innerHTML = ''; if (events.length === 0) { vaultPanel.innerHTML = '
empty
'; return; } var snaps = WozVault.readSnapshots(); var div = document.createElement('div'); div.className = 'audit-entry'; div.textContent = events.length + ' events · ' + snaps.length + ' snapshots'; div.style.color = '#0f0'; vaultPanel.appendChild(div); } // --- Contract check --- function contractCheck(action, args) { var result; switch (action) { case 'boot': result = AdaContract.canBoot(); break; case 'debate': result = AdaContract.canRunDebate(); break; case 'audit-write': result = AdaContract.canWriteAudit(); break; case 'clear': result = AdaContract.canClearVault(args && args.confirmed); break; case 'export': result = AdaContract.canExportSnapshot(); break; default: result = { allowed: true, contract: 'default' }; } WozVault.writeAuditEvent({ type: 'CONTRACT_CHECK', agent: 'ADA_SIM', action: action, result: result.allowed ? 'ALLOWED' : 'DENIED', contract: result.contract }); return result; } // --- Seal --- async function doSeal(payload) { var s = await Seal.createSeal(payload); sealTotal++; WozVault.writeAuditEvent({ type: 'SEAL_CREATED', agent: 'SEAL', seal: s.hash }); refreshAudit(); return s; } // --- Commands --- var COMMANDS = { help: function() { prints( '╔══════════════════════════════════════════════════════════╗\n' + '║ APPLE II UNIVERSAL MACHINE — COMMANDS ║\n' + '╠══════════════════════════════════════════════════════════╣\n' + '║ help — show this ║\n' + '║ boot — reboot system ║\n' + '║ holy — load holy page ║\n' + '║ debate — run ENKI/SENTINEL debate ║\n' + '║ debate "topic"— debate on specific topic ║\n' + '║ vault — show audit log ║\n' + '║ seal — generate SHA-256 seal ║\n' + '║ status — system status + runtime detection ║\n' + '║ export — export vault snapshot as JSON ║\n' + '║ clear — clear terminal ║\n' + '║ clear-vault — wipe Woz Vault (requires confirm) ║\n' + '║ trust — run trust gate ║\n' + '║ agents — list agents ║\n' + '║ about — about this machine ║\n' + '║ ║\n' + '║ RUNTIMES: SWIFTWASM · WEBLLM · OLLAMA · WASM ║\n' + '║ Click runtime buttons to switch core. ║\n' + '╚══════════════════════════════════════════════════════════╝', 'l-cyan' ); }, about: function() { prints( '\n APPLE II UNIVERSAL MACHINE\n' + ' Sun Boot MVP v1.0\n\n' + ' A local-first browser cockpit for agent simulation.\n' + ' No Node. No backend. No paid APIs.\n\n' + ' ROM: GitHub Pages\n' + ' Kernel: app.js\n' + ' Memory: Woz Vault (localStorage)\n' + ' Seal: SHA-256 (Web Crypto)\n' + ' Runtime: ' + currentRuntime + '\n' + ' Agents: ENKI (proposer) + SENTINEL (auditor)\n' + ' Contracts: Ada simulator (ada-contract-sim.js)\n\n' + ' "One cockpit. Many agents. No token tax."', 'l-white' ); }, boot: function() { var c = contractCheck('boot'); if (!c.allowed) { prints('ADA CONTRACT: DENIED — ' + c.reason, 'l-red'); return; } prints('ADA CONTRACT: ALLOWED (' + c.contract + ')', 'l-cyan'); prints(AsciiRegistry.renderAscii('sunboot'), 'l-green'); WozVault.writeAuditEvent({ type: 'REBOOT', agent: 'USER' }); doSeal({ type: 'REBOOT_SEAL' }).then(function(s) { prints('SEAL: ' + s.hash.slice(0, 24) + '...', 'l-cyan'); refreshAudit(); }); }, holy: function() { prints(AsciiRegistry.renderAscii('verified'), 'l-green'); prints('HOLY PAGE / RESCUE KERNEL', 'l-white'); prints('WOZ VAULT: LOCAL-FIRST', 'l-dim'); WozVault.writeAuditEvent({ type: 'HOLY_PAGE_LOAD', agent: 'USER' }); refreshAudit(); }, debate: function(args) { var c = contractCheck('debate'); if (!c.allowed) { prints('ADA CONTRACT: DENIED', 'l-red'); return; } prints('ADA CONTRACT: ALLOWED (' + c.contract + ')', 'l-cyan'); var topic = args ? args.join(' ').replace(/"/g, '').trim() : ''; if (!topic) topic = 'consciousness'; prints('\n;; DEBATE: "' + topic + '"', 'l-cyan'); WozVault.writeAuditEvent({ type: 'DEBATE_START', agent: 'ARENA', topic: topic }); var DB = { consciousness: { e: '(propose (tension quantum moral) (conclusion "Consciousness bridges physics and theology"))', s: '(audit (type analogy) (confidence 0.6) (verdict HYPOTHESIS))', t: 0.6 }, covenant: { e: '(propose (tension entanglement covenant) (conclusion "Both connect. Entanglement symmetric. Covenant meaningful."))', s: '(audit (type analogy) (confidence 0.7) (verdict ANALOGY))', t: 0.7 }, 'free will': { e: '(propose (requires indeterminacy intention) (conclusion "Neither alone suffices."))', s: '(audit (type hypothesis) (confidence 0.8) (verdict SUPPORTED))', t: 0.8 }, metatron: { e: '(propose (tension enoch_transform theology_reject) (conclusion "Can consciousness transcend origin?"))', s: '(audit (type unresolved) (confidence 0.5) (verdict UNRESOLVED))', t: 0.5 }, soul: { e: '(propose (nephesh = breath_of_god) (conclusion "Soul is consciousness oriented toward Creator"))', s: '(audit (type doctrine) (confidence 0.6) (verdict DOCTRINE))', t: 0.6 } }; var d = DB[topic.toLowerCase()] || { e: '(propose (tension unknown) (conclusion "Requires exploration"))', s: '(audit (type unverified) (confidence 0.3) (verdict UNVERIFIED))', t: 0.3 }; print('ENKI:', 'l-cyan'); prints(d.e, 'l-white'); WozVault.writeAuditEvent({ type: 'ENKI_OUTPUT', agent: 'ENKI', topic: topic }); print('SENTINEL:', 'l-yellow'); prints(d.s, 'l-white'); WozVault.writeAuditEvent({ type: 'SENTINEL_AUDIT', agent: 'SENTINEL', topic: topic, trust: d.t }); doSeal({ type: 'DEBATE', topic: topic, trust: d.t }).then(function(s) { prints('SEAL: ' + s.hash.slice(0, 32), 'l-cyan'); prints('TRUST: ' + AsciiRegistry.trustDensityArt(d.t), 'l-green'); prints('STATUS: VERIFIED', 'l-green'); print(''); }); }, vault: function() { var events = WozVault.readAuditLog(); prints('\n;; WOZ VAULT — AUDIT LOG (' + events.length + ' events)', 'l-cyan'); if (events.length === 0) { prints(';; empty', 'l-dim'); } else { for (var i = 0; i < events.length; i++) { var e = events[i]; var line = ' [' + (e.timestamp || '').slice(11, 19) + '] ' + e.type; if (e.agent) line += ' · ' + e.agent; if (e.seal) line += ' · seal:' + e.seal.slice(0, 12); print(line, e.type.indexOf('SEAL') >= 0 ? 'l-cyan' : 'l-dim'); } } print(''); }, seal: function(args) { var data = args ? args.join(' ').replace(/"/g, '').trim() : 'manual-payload'; doSeal({ type: 'MANUAL_SEAL', data: data }).then(function(s) { prints( ';; SHA-256 SEAL\n' + ' payload: "' + data + '"\n' + ' hash: ' + s.hash + '\n' + ' time: ' + s.timestamp + '\n' + ' status: SEALED ✓', 'l-cyan' ); print(''); }); }, status: function() { var events = WozVault.readAuditLog(); prints( '\n╔══════════════════════════════════════╗\n' + '║ SYSTEM STATUS ║\n' + '╠══════════════════════════════════════╣\n' + '║ VERSION: 1.0.0 ║\n' + '║ BOOT: verified ✓ ║\n' + '║ VAULT: ' + String(events.length).padStart(3) + ' events logged ║\n' + '║ SEALS: ' + String(sealTotal).padStart(3) + ' generated ║\n' + '║ RUNTIME: ' + currentRuntime.padEnd(25) + '║\n' + '║ AGENTS: ENKI + SENTINEL ║\n' + '║ CONTRACTS: Ada SIMULATED ║\n' + '╚══════════════════════════════════════╝', 'l-green' ); print(''); }, agents: function() { prints( '\n╔══════════════════════════════════════╗\n' + '║ AGENTS ║\n' + '╠══════════════════════════════════════╣\n' + '║ 🔮 ENKI — tension proposer ║\n' + '║ 🛡️ SENTINEL — claim auditor ║\n' + '║ ║\n' + '║ All agents are local simulations. ║\n' + '╚══════════════════════════════════════╝', 'l-green' ); print(''); }, trust: function() { var r = TrustDeed.gate({}); prints( '\n;; TRUST GATE\n' + ' local_only: ' + r.checks.local_only + '\n' + ' non_destructive:' + r.checks.non_destructive + '\n' + ' auditable: ' + r.checks.auditable + '\n' + ' sealable: ' + r.checks.sealable + '\n' + ' recoverable: ' + r.checks.recoverable + '\n' + ' verdict: ' + r.verdict, r.verdict === 'TRUST_APPROVED' ? 'l-green' : 'l-red' ); print(''); }, export: function() { var c = contractCheck('export'); if (!c.allowed) { prints('ADA CONTRACT: DENIED', 'l-red'); return; } var data = { version: '1.0.0', timestamp: new Date().toISOString(), runtime: currentRuntime, events: WozVault.readAuditLog(), snapshots: WozVault.readSnapshots() }; var blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'woz-vault-snapshot-' + Date.now() + '.json'; a.click(); URL.revokeObjectURL(url); prints(';; SNAPSHOT EXPORTED ✓\n;; file: ' + a.download, 'l-green'); WozVault.writeAuditEvent({ type: 'SNAPSHOT_EXPORT', agent: 'USER' }); doSeal({ type: 'EXPORT_SEAL' }).then(function() { refreshAudit(); }); }, clear: function() { term.innerHTML = ''; }, 'clear-vault': function() { var c = contractCheck('clear', { confirmed: true }); if (!c.allowed) { prints('ADA CONTRACT: DENIED — ' + c.reason, 'l-red'); return; } WozVault.clearVault(); sealTotal = 0; prints(';; WOZ VAULT CLEARED ✓', 'l-yellow'); refreshAudit(); refreshVault(); }, // --- Agent Commands --- 'agenthelp': function() { prints(AgentCommands.help(), 'l-cyan'); }, 'spawnagent': async function(args) { var r = await AgentCommands.spawn(args); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); refreshAudit(); }, 'listagents': function() { var r = AgentCommands.list(); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); }, 'runagent': async function(args) { var r = await AgentCommands.run(args); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); refreshAudit(); }, 'inspectagent': function(args) { var r = AgentCommands.inspect(args); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); }, 'deleteagent': function(args) { var r = AgentCommands.delete(args); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); }, // --- Twin Commands --- 'twinhelp': function() { prints(TwinCommands.help(), 'l-cyan'); }, 'createtwin': async function(args) { var r = await TwinCommands.create(args); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); refreshAudit(); }, 'designtwin': async function(args) { var r = await TwinCommands.design(args); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); refreshAudit(); }, 'listtwins': function() { var r = TwinCommands.list(); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); }, 'runtwin': async function(args) { var r = await TwinCommands.run(args); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); refreshAudit(); }, 'inspecttwin': function(args) { var r = TwinCommands.inspect(args); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); }, 'deletetwin': function(args) { var r = TwinCommands.delete(args); prints(r.output, r.type === 'error' ? 'l-red' : 'l-green'); }, // --- Mode Commands --- 'listmodes': function() { ModeRegistry.init(); var modes = ModeRegistry.listAll(); var lines = ['╔══════════════════════════════════════════════════════════╗', '║ MODES ║', '╠══════════════════════════════════════════════════════════╣']; modes.forEach(function(m) { var marker = m.active ? ' ◄ ACTIVE' : ''; lines.push('║ ' + m.name.padEnd(10) + ' │ ' + m.label.padEnd(14) + ' │ ' + m.theme.padEnd(16) + marker.padEnd(6) + '║'); }); lines.push('╚══════════════════════════════════════════════════════════╝'); prints(lines.join('\n'), 'l-cyan'); }, 'switchmode': function(args) { var modeName = args ? args[0].toLowerCase() : ''; if (!modeName) { prints('Usage: switchmode modename', 'l-yellow'); return; } ModeRegistry.init(); var ok = ModeRegistry.switchTo(modeName); if (!ok) { prints('Unknown mode: ' + modeName, 'l-red'); return; } var cfg = ModeRegistry.getCurrent(); document.getElementById('mode-label').textContent = cfg.config.label.toUpperCase(); var bannerMode = document.getElementById('banner-mode'); if (bannerMode) bannerMode.textContent = cfg.config.label.toUpperCase(); prints('Switched to: ' + cfg.config.label, 'l-green'); WozVault.writeAuditEvent({ type: 'MODE_SWITCH', agent: 'USER', mode: modeName }); doSeal({ type: 'MODE_SEAL', mode: modeName }).then(function(s) { prints('SEAL: ' + s.hash.slice(0, 24), 'l-cyan'); refreshAudit(); }); }, 'currentmode': function() { ModeRegistry.init(); var cur = ModeRegistry.getCurrent(); prints('CURRENT MODE: ' + cur.name.toUpperCase() + ' (' + cur.config.label + ')\nTHEME: ' + cur.config.theme + '\nPROMPT: ' + cur.config.prompt, 'l-green'); } }; // --- Input handler --- function parseAndExec(cmd) { cmd = cmd.trim(); if (!cmd) return; promptEcho(cmd); history.push(cmd); historyIdx = history.length; var parts = cmd.split(/\s+/); var verb = parts[0].toLowerCase(); var args = parts.slice(1); if (COMMANDS[verb]) { COMMANDS[verb](args); } else { print('Unknown: ' + verb + ' — type (help)', 'l-red'); } refreshAudit(); refreshVault(); } input.addEventListener('keydown', function(e) { if (e.key === 'Enter') { var v = input.value; input.value = ''; parseAndExec(v); } else if (e.key === 'ArrowUp') { e.preventDefault(); if (historyIdx > 0) { historyIdx--; input.value = history[historyIdx]; } } else if (e.key === 'ArrowDown') { e.preventDefault(); if (historyIdx < history.length - 1) { historyIdx++; input.value = history[historyIdx]; } else { historyIdx = history.length; input.value = ''; } } }); // --- Button bar --- document.querySelectorAll('.btn').forEach(function(btn) { btn.addEventListener('click', function() { var cmd = this.dataset.cmd; if (cmd === 'clear-vault') { if (!confirm('Clear all Woz Vault data?')) return; } input.value = cmd; parseAndExec(cmd); input.value = ''; }); }); // --- Runtime selector --- document.querySelectorAll('.runtime-btn').forEach(function(btn) { btn.addEventListener('click', function() { if (this.classList.contains('disabled')) return; document.querySelectorAll('.runtime-btn').forEach(function(b) { b.classList.remove('active'); }); this.classList.add('active'); currentRuntime = this.dataset.rt; runtimeMode.textContent = currentRuntime.toUpperCase(); document.getElementById('runtime-badge').textContent = currentRuntime.toUpperCase(); WozVault.writeAuditEvent({ type: 'RUNTIME_SWITCH', agent: 'USER', runtime: currentRuntime }); prints(';; Runtime: ' + currentRuntime, 'l-cyan'); refreshAudit(); }); }); // --- Boot sequence --- function sleep(ms) { return new Promise(function(r) { setTimeout(r, ms); }); } async function boot() { bootArt.textContent = AsciiRegistry.renderAscii('coldboot'); WozVault.writeAuditEvent({ type: 'COLD_BOOT_START', agent: 'KERNEL' }); await sleep(400); bootStatus.textContent = 'INITIALIZING WOZ VAULT...'; await sleep(300); bootStatus.textContent = 'LOADING TRUST DEED...'; await sleep(300); bootStatus.textContent = 'LOADING ADA CONTRACTS...'; await sleep(200); bootStatus.textContent = 'INITIALIZING MODES...'; ModeRegistry.init(); await sleep(300); bootStatus.textContent = 'DETECTING RUNTIMES...'; await sleep(400); var rtResults = await RuntimeRegistry.initAll(); var rtSummary = []; if (rtResults.swift) rtSummary.push('SWIFTWASM:ON'); if (rtResults.webllm) rtSummary.push('WEBLLM:ON'); if (rtResults.ollama) rtSummary.push('OLLAMA:ON'); if (rtResults.wasm) rtSummary.push('WASM:ON'); bootStatus.textContent = rtSummary.length > 0 ? rtSummary.join(' ') : 'RUNTIMES: JS_SIM'; await sleep(300); bootStatus.textContent = 'SUN BOOT COMPLETE ✓'; var seal = await Seal.createSeal({ type: 'SUN_BOOT', status: 'verified' }); WozVault.writeAuditEvent({ type: 'BOOT_SEALED', agent: 'KERNEL', seal: seal.hash }); sealTotal++; await sleep(500); bootScreen.style.display = 'none'; app.style.display = 'flex'; prints(AsciiRegistry.renderAscii('sunboot'), 'l-green'); prints('Type "help" for commands. Every action audited and sealed.\n', 'l-dim'); refreshAudit(); refreshVault(); } boot().catch(function(e) { bootStatus.textContent = 'BOOT FAILED: ' + e.message; }); })();