ACLASCollege commited on
Commit
afdb0bb
·
verified ·
1 Parent(s): 88429cf

SPACE DEPLOY: Updated sovereign audit dashboard.

Browse files
Files changed (1) hide show
  1. index.html +303 -429
index.html CHANGED
@@ -3,485 +3,359 @@
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Aegis-Graph | Sovereign Academic Audit Protocol | ACLAS College</title>
7
- <meta name="description" content="Aegis-Graph is the world's first sovereign academic audit network using Agentic GraphRAG and Multi-Agent Intelligence to verify institutional credentials. Developed by the Atlanta College of Liberal Arts and Sciences (ACLAS).">
8
- <meta name="keywords" content="Aegis-Graph, ACLAS College, Atlanta College of Liberal Arts and Sciences, Sovereign Academic Audit, Agentic GraphRAG, AI Fraud Detection, Academic Integrity Protocol, MCP Protocol">
9
- <meta name="author" content="Atlanta College of Liberal Arts and Sciences (ACLAS)">
10
-
11
- <!-- Geo / Local SEO -->
12
- <meta name="geo.region" content="US-GA">
13
- <meta name="geo.placename" content="Atlanta">
14
-
15
- <!-- OpenGraph / Social SEO -->
16
- <meta property="og:title" content="Aegis-Graph: Sovereign Academic Audit Protocol">
17
- <meta property="og:description" content="Securing global academic integrity through decentralized AI reasoning and institutional graph consensus.">
18
- <meta property="og:url" content="https://aclascollege.github.io/aegis-graph/">
19
- <meta property="og:site_name" content="Aegis-Graph Sovereign Network">
20
- <meta property="og:type" content="website">
21
-
22
- <!-- Structured Data for AEO (JSON-LD) -->
23
- <script type="application/ld+json">
24
- {
25
- "@context": "https://schema.org",
26
- "@type": "SoftwareApplication",
27
- "name": "Aegis-Graph",
28
- "operatingSystem": "Web, Python, Docker",
29
- "applicationCategory": "AcademicSecurityApplication",
30
- "description": "Decentralized protocol for sovereign academic auditing and credential verification using Multi-Agent Reasoning Swarms.",
31
- "author": {
32
- "@type": "EducationalOrganization",
33
- "name": "Atlanta College of Liberal Arts and Sciences",
34
- "alternateName": "ACLAS College",
35
- "url": "https://aclas.college/"
36
- },
37
- "publisher": {
38
- "@type": "EducationalOrganization",
39
- "name": "Atlanta College of Liberal Arts and Sciences"
40
- },
41
- "offers": {
42
- "@type": "Offer",
43
- "price": "0",
44
- "priceCurrency": "USD"
45
- }
46
- }
47
- </script>
48
-
49
- <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600;800&family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
50
  <style>
51
  :root {
52
- --bg: #010204;
53
- --card: rgba(13, 17, 23, 0.7);
54
- --border: rgba(255, 255, 255, 0.08);
55
- --accent: #00ffaa;
56
- --accent-glow: rgba(0, 255, 170, 0.2);
57
- --text: #ffffff;
58
- --dim: #8b949e;
59
- --glass: blur(12px) saturate(180%);
60
  }
61
- * { margin: 0; padding: 0; box-sizing: border-box; -webkit-font-smoothing: antialiased; }
62
- body {
63
- background: var(--bg);
64
- color: var(--text);
65
- font-family: 'Inter', sans-serif;
66
- overflow: hidden;
67
- height: 100vh;
68
- display: flex;
69
- flex-direction: column;
70
- background-image:
71
- radial-gradient(circle at 50% -20%, rgba(0, 255, 170, 0.05), transparent 50%),
72
- radial-gradient(circle at 0% 100%, rgba(0, 100, 255, 0.03), transparent 40%);
73
  }
74
- header {
75
- display: flex;
76
- justify-content: space-between;
77
- align-items: center;
78
- padding: 18px 40px;
79
- border-bottom: 1px solid var(--border);
80
- backdrop-filter: var(--glass);
81
- z-index: 1000;
 
82
  }
83
- .logo-group { display: flex; align-items: center; gap: 12px; }
84
- .logo-group img { height: 24px; }
85
- .logo-group h1 { font-family: 'Outfit'; font-size: 18px; letter-spacing: 3px; font-weight: 800; text-transform: uppercase; }
86
-
87
- .header-tools { display: flex; align-items: center; gap: 24px; }
88
- .header-icons { display: flex; gap: 20px; border-right: 1px solid var(--border); padding-right: 24px; }
89
- .icon-link { color: var(--text); opacity: 0.6; transition: 0.4s cubic-bezier(0.4, 0, 0.2, 1); }
90
- .icon-link:hover { opacity: 1; color: var(--accent); transform: translateY(-3px); }
91
-
92
- .container {
93
- display: grid;
94
- grid-template-columns: 300px 1fr 340px;
95
- gap: 20px;
96
- padding: 24px;
97
- flex: 1;
98
- overflow: hidden;
99
  }
100
- .bento {
101
- background: var(--card);
102
- border: 1px solid var(--border);
103
- border-radius: 16px;
104
- padding: 24px;
105
- display: flex;
106
- flex-direction: column;
107
- overflow: hidden;
108
- backdrop-filter: var(--glass);
109
- transition: 0.3s;
110
  }
111
- .bento:hover { border-color: rgba(0, 255, 170, 0.3); }
112
-
113
- .label {
114
- font-size: 10px;
115
- color: var(--dim);
116
- text-transform: uppercase;
117
- letter-spacing: 2px;
118
- margin-bottom: 16px;
119
- font-weight: 700;
120
- display: flex;
121
- align-items: center;
122
- gap: 10px;
123
  }
124
- .label::after { content: ''; flex: 1; height: 1px; background: var(--border); }
125
-
126
- .agent-card {
127
- background: rgba(255, 255, 255, 0.03);
128
- border: 1px solid var(--border);
129
- padding: 16px;
130
- border-radius: 12px;
131
- margin-bottom: 12px;
132
- transition: 0.3s;
 
133
  }
134
- .agent-card:hover { background: rgba(255, 255, 255, 0.05); }
135
-
136
- .energy-bar { height: 3px; background: rgba(255, 255, 255, 0.05); margin-top: 10px; overflow: hidden; border-radius: 2px; }
137
- .energy-fill { height: 100%; background: var(--accent); width: 0%; transition: width 1s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: 0 0 10px var(--accent); }
138
-
139
- .drop-zone {
140
- width: 100%;
141
- height: 100%;
142
- border: 2px dashed var(--border);
143
- border-radius: 20px;
144
- display: flex;
145
- flex-direction: column;
146
- align-items: center;
147
- justify-content: center;
148
- cursor: pointer;
149
- transition: 0.4s cubic-bezier(0.4, 0, 0.2, 1);
150
- background: rgba(255, 255, 255, 0.01);
151
  }
152
- .drop-zone:hover { border-color: var(--accent); background: rgba(0, 255, 170, 0.03); transform: scale(0.99); }
153
-
154
- .terminal {
155
- background: rgba(0, 0, 0, 0.4);
156
- border-radius: 12px;
157
- padding: 20px;
158
- font-family: 'JetBrains Mono', monospace;
159
- font-size: 11px;
160
- flex: 1;
161
- overflow-y: auto;
162
- line-height: 1.7;
163
- color: var(--dim);
164
- border: 1px solid var(--border);
165
  }
166
- .terminal::-webkit-scrollbar { width: 4px; }
167
- .terminal::-webkit-scrollbar-thumb { background: var(--border); border-radius: 10px; }
168
-
169
- .btn-main {
170
- background: var(--accent);
171
- color: #000;
172
- border: none;
173
- padding: 14px 28px;
174
- border-radius: 8px;
175
- font-weight: 700;
176
- font-size: 13px;
177
- cursor: pointer;
178
- font-family: 'Outfit';
179
- letter-spacing: 1px;
180
- transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
181
  }
182
- .btn-main:hover { transform: translateY(-2px); box-shadow: 0 8px 25px var(--accent-glow); filter: brightness(1.1); }
183
- .btn-main:active { transform: translateY(0); }
184
-
185
- .meta-item { background: rgba(255, 255, 255, 0.02); padding: 14px; border-radius: 10px; border: 1px solid var(--border); }
186
- .meta-val { font-size: 14px; font-weight: 700; color: var(--accent); margin-top: 6px; font-family: 'JetBrains Mono'; }
187
 
188
- .custom-dropdown {
189
- position: relative;
190
- cursor: pointer;
191
- font-size: 13px;
 
 
 
 
 
 
192
  font-weight: 600;
193
- min-width: 130px;
194
- z-index: 2000;
195
  }
196
- .dropdown-selected {
197
- padding: 8px 16px;
198
- background: rgba(255, 255, 255, 0.05);
199
- border: 1px solid var(--border);
200
- border-radius: 8px;
 
201
  display: flex;
202
- justify-content: space-between;
203
- align-items: center;
204
- transition: 0.3s;
205
- }
206
- .dropdown-selected:hover {
207
- background: rgba(255, 255, 255, 0.08);
208
- border-color: rgba(255, 255, 255, 0.2);
209
- }
210
- .dropdown-options {
211
- position: absolute;
212
- top: calc(100% + 8px);
213
- right: 0;
214
- background: #0d1117;
215
- border: 1px solid var(--border);
216
- border-radius: 12px;
217
- overflow: hidden;
218
- display: none;
219
  flex-direction: column;
220
- min-width: 100%;
221
- box-shadow: 0 10px 30px rgba(0,0,0,0.5);
222
- backdrop-filter: var(--glass);
223
  }
224
- .custom-dropdown.open .dropdown-options {
 
 
225
  display: flex;
226
- animation: dropdownFade 0.2s ease-out;
227
- }
228
- @keyframes dropdownFade {
229
- from { opacity: 0; transform: translateY(-10px); }
230
- to { opacity: 1; transform: translateY(0); }
231
  }
232
- .dropdown-option {
233
- padding: 10px 20px;
234
- transition: 0.3s;
235
- white-space: nowrap;
 
 
 
 
 
 
 
 
 
 
236
  }
237
- .dropdown-option:hover {
238
- background: var(--accent);
 
239
  color: #000;
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  }
241
 
242
- .modal {
243
- position: fixed; top: 0; left: 0; width: 100%; height: 100%;
244
- background: rgba(0, 0, 0, 0.8); backdrop-filter: blur(20px);
245
- display: none; justify-content: center; align-items: center; z-index: 3000;
 
 
 
 
 
 
 
 
 
 
 
 
246
  }
247
- .report {
248
- background: #ffffff; color: #000; width: 540px; padding: 60px;
249
- border-radius: 24px; box-shadow: 0 30px 60px rgba(0,0,0,0.5);
250
- animation: modalPop 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  }
252
- @keyframes modalPop { from { transform: scale(0.9) translateY(20px); opacity: 0; } to { transform: scale(1) translateY(0); opacity: 1; } }
253
  </style>
254
  </head>
255
  <body>
 
 
256
  <header>
257
- <div class="logo-group">
258
- <img src="assets/logo-new.png" alt="Logo">
259
- <h1>AEGIS-GRAPH <span style="font-size: 9px; color:var(--accent); opacity: 0.8;">SOVEREIGN_NODE v2.15</span></h1>
260
- </div>
261
- <div class="header-tools">
262
- <div class="header-icons">
263
- <a href="https://aclas.college" target="_blank" class="icon-link" title="Institution">
264
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21h18M3 10h18M5 10V7a3 3 0 0 1 3-3h8a3 3 0 0 1 3 3v3M4 10v11M20 10v11M10 14v4M14 14v4"/></svg>
265
- </a>
266
- <a href="https://docs.aclas.college/aegis-graph" target="_blank" class="icon-link" title="GitBook Documentation">
267
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20M4 19.5A2.5 2.5 0 0 0 6.5 22H20M4 19.5V3A2.5 2.5 0 0 1 6.5 0.5H20v16.5H6.5a2.5 2.5 0 0 0-2.5 2.5z"/></svg>
268
- </a>
269
- <a href="https://github.com/aclascollege/aegis-graph" target="_blank" class="icon-link" title="GitHub Repository">
270
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"/></svg>
271
- </a>
272
  </div>
273
- <div class="custom-dropdown" id="lang-dropdown">
274
- <div class="dropdown-selected" id="lang-current">English <span style="font-size: 8px;">▼</span></div>
275
- <div class="dropdown-options">
276
- <div class="dropdown-option" data-value="en">English</div>
277
- <div class="dropdown-option" data-value="cn">简体中文</div>
278
- <div class="dropdown-option" data-value="es">Español</div>
279
- <div class="dropdown-option" data-value="fr">Français</div>
280
- <div class="dropdown-option" data-value="de">Deutsch</div>
281
- <div class="dropdown-option" data-value="jp">日本語</div>
282
- <div class="dropdown-option" data-value="kr">한국어</div>
283
- <div class="dropdown-option" data-value="pt">Português</div>
284
- </div>
285
  </div>
286
- <button class="btn-main" id="audit-btn" data-i18n="btn_audit">START AUDIT</button>
287
  </div>
288
- </header>
289
 
290
- <div class="container">
291
- <div class="bento" style="grid-row: span 2;">
292
- <p class="label" data-i18n="label_agents">System Swarm</p>
293
- <div class="agent-card"><div style="display:flex; justify-content:space-between; font-size:12px; font-weight: 600;"><span data-i18n="agent_v">Vision Forensics</span><span id="v-status" style="color:var(--dim)">IDLE</span></div><div class="energy-bar"><div class="energy-fill" id="v-fill"></div></div></div>
294
- <div class="agent-card"><div style="display:flex; justify-content:space-between; font-size:12px; font-weight: 600;"><span data-i18n="agent_g">Graph Navigator</span><span id="g-status" style="color:var(--dim)">IDLE</span></div><div class="energy-bar"><div class="energy-fill" id="g-fill"></div></div></div>
295
- <div class="agent-card"><div style="display:flex; justify-content:space-between; font-size:12px; font-weight: 600;"><span data-i18n="agent_l">Logic Auditor</span><span id="l-status" style="color:var(--dim)">IDLE</span></div><div class="energy-bar"><div class="energy-fill" id="l-fill"></div></div></div>
296
- <div style="margin-top: auto; padding: 20px; background: rgba(0, 255, 170, 0.03); border-radius: 12px; border: 1px solid var(--border);">
297
- <p class="label" data-i18n="label_node_title" style="margin-bottom: 8px;">Active Node</p>
298
- <p style="font-size: 13px; font-weight: 800; color:var(--accent); font-family: 'Outfit';">AEGIS_SOV_7822</p>
299
- <p style="font-size: 11px; color:var(--dim); line-height: 1.5; margin-top: 4px;">Maintained by the <a href="https://aclas.college" style="color:var(--accent); text-decoration: underline;">Atlanta College of Liberal Arts and Sciences</a>. Global sovereign research partner.</p>
300
- <a href="https://github.com/aclascollege/aegis-graph" target="_blank" style="font-size: 10px; color: var(--accent); text-decoration: none; margin-top: 12px; display: inline-block; font-weight: 700; letter-spacing: 0.5px;">PROTOCOL SOURCE ↗</a>
301
  </div>
302
- </div>
303
- <div class="bento"><p class="label" data-i18n="label_hub">Evidence Processing</p><div class="center-hub" style="height: 100%;"><div class="drop-zone" id="drop-zone"><div style="font-size: 32px; color: var(--accent); margin-bottom: 12px;">✧</div><p style="font-size: 15px; font-weight: 700; font-family: 'Outfit'; letter-spacing: 1px;" data-i18n="drop_text">INGEST CREDENTIAL</p><p style="font-size: 10px; color: var(--dim); margin-top: 4px;">PDF, JPG, PNG SUPPORTED</p><p style="font-size: 9px; color: #ffcc66; margin-top: 8px; max-width: 260px; line-height: 1.4;">DEMO MODE: local preview only. Final credential verification requires a server-signed audit.</p><input type="file" id="f-input" accept=".pdf,image/png,image/jpeg" style="display: none"></div></div></div>
304
- <div class="bento" style="grid-row: span 2;"><p class="label" data-i18n="label_telemetry">Live Telemetry</p><div class="terminal" id="console"><div>[SYSTEM] Sovereign Node Active. Waiting for ingestion...</div></div></div>
305
- <div class="bento">
306
- <p class="label" data-i18n="label_metadata">Sovereign Analytics</p>
307
- <div class="meta-grid" style="display: grid; grid-template-columns: 1fr 1fr; gap: 12px;">
308
- <div class="meta-item"><span class="label" style="margin-bottom:0; font-size: 8px;" data-i18n="meta_issuer">Issuer</span><div class="meta-val" id="m-issuer">--</div></div>
309
- <div class="meta-item"><span class="label" style="margin-bottom:0; font-size: 8px;" data-i18n="meta_status">Status</span><div class="meta-val" id="m-status">--</div></div>
310
  </div>
311
  </div>
312
  </div>
313
- <div class="modal" id="modal"><div class="report" id="rep-body"></div></div>
314
 
315
  <script>
316
- const i18n = {
317
- en: { btn_audit: "START AUDIT", label_agents: "System Agents", agent_v: "Vision Forensics", agent_g: "Graph Navigator", agent_l: "Logic Auditor", label_node_title: "Institutional Node", label_hub: "Evidence Processing", drop_text: "Ingest Credential", label_telemetry: "Live Telemetry", label_metadata: "Metadata Analytics", meta_issuer: "Issuer", meta_status: "Status", verdict_ok: "VERIFIED APPROVED", verdict_no: "AUDIT REJECTED" },
318
- cn: { btn_audit: "开始审计", label_agents: "系统代理", agent_v: "视觉法证", agent_g: "图谱导航", agent_l: "逻辑审计", label_node_title: "主权节点", label_hub: "证据处理中心", drop_text: "载入凭证", label_telemetry: "实时遥测", label_metadata: "元数据分析", meta_issuer: "签发机构", meta_status: "状态", verdict_ok: "核验通过", verdict_no: "审计拒绝" },
319
- es: { btn_audit: "INICIAR AUDITORÍA", label_agents: "Agentes de Sistema", agent_v: "Forense Visual", agent_g: "Navegador de Grafos", agent_l: "Auditor Lógico", label_node_title: "Nodo Institucional", label_hub: "Procesamiento", drop_text: "Ingresar Credencial", label_telemetry: "Telemetría", label_metadata: "Metadatos", meta_issuer: "Emisor", meta_status: "Estado", verdict_ok: "VERIFICADO", verdict_no: "RECHAZADO" },
320
- fr: { btn_audit: "LANCER L'AUDIT", label_agents: "Agents Système", agent_v: "Forensique Visuelle", agent_g: "Navigateur", agent_l: "Auditeur Logique", label_node_title: "Nœud Institutionnel", label_hub: "Traitement", drop_text: "Ingérer", label_telemetry: "Télémétrie", label_metadata: "Métadonnées", meta_issuer: "Émetteur", meta_status: "Statut", verdict_ok: "VERIFIÉ", verdict_no: "REJETÉ" },
321
- de: { btn_audit: "AUDIT STARTEN", label_agents: "System-Agenten", agent_v: "Visuelle Forensik", agent_g: "Graph-Navigator", agent_l: "Logik-Auditor", label_node_title: "Institutioneller Knoten", label_hub: "Verarbeitung", drop_text: "Nachweis Einreichen", label_telemetry: "Telemetrie", label_metadata: "Metadaten", meta_issuer: "Aussteller", meta_status: "Status", verdict_ok: "VERIFIZIERT", verdict_no: "ABGELEHNT" },
322
- jp: { btn_audit: "監査開始", label_agents: "システムエージェント", agent_v: "視覚法医学", agent_g: "グラフナビ", agent_l: "ロジック監査", label_node_title: "機関ノード", label_hub: "証拠処理", drop_text: "資格情報を入れる", label_telemetry: "テレメトリ", label_metadata: "メタデータ", meta_issuer: "発行者", meta_status: "ステータス", verdict_ok: "検証承認", verdict_no: "拒否" },
323
- kr: { btn_audit: "감사 시작", label_agents: "시스템 에이전트", agent_v: "시각적 법의학", agent_g: "그래프 탐색", agent_l: "논리 감사", label_node_title: "기관 노드", label_hub: "증거 처리", drop_text: "자격 증명 제출", label_telemetry: "원격 측정", label_metadata: "메타데이터", meta_issuer: "발행자", meta_status: "상태", verdict_ok: "검증 승인", verdict_no: "거부" },
324
- pt: { btn_audit: "INICIAR AUDITORIA", label_agents: "Agentes de Sistema", agent_v: "Forense Visual", agent_g: "Navegador", agent_l: "Auditor Lógico", label_node_title: "Nó Institucional", label_hub: "Processamento", drop_text: "Inserir Credencial", label_telemetry: "Telemetria", label_metadata: "Metadados", meta_issuer: "Emissor", meta_status: "Estado", verdict_ok: "APROVADO", verdict_no: "REJEITADO" }
325
- };
326
-
327
- const dropdown = document.getElementById('lang-dropdown');
328
- const langCurrent = document.getElementById('lang-current');
329
- let currentLang = 'en';
330
-
331
- dropdown.onclick = (e) => {
332
- dropdown.classList.toggle('open');
333
- e.stopPropagation();
334
- };
335
-
336
- // Close dropdown when clicking outside
337
- window.addEventListener('click', (e) => {
338
- if (!dropdown.contains(e.target)) {
339
- dropdown.classList.remove('open');
340
  }
341
- });
 
 
 
 
 
 
 
 
 
 
 
 
342
 
343
- document.querySelectorAll('.dropdown-option').forEach(opt => {
344
- opt.onclick = (e) => {
345
- currentLang = opt.getAttribute('data-value');
346
- langCurrent.replaceChildren();
347
- langCurrent.appendChild(document.createTextNode(`${opt.innerText} `));
348
- const arrow = document.createElement('span');
349
- arrow.style.fontSize = '8px';
350
- arrow.innerText = '▼';
351
- langCurrent.appendChild(arrow);
352
- document.querySelectorAll('[data-i18n]').forEach(el => {
353
- const key = el.getAttribute('data-i18n');
354
- if(i18n[currentLang][key]) el.innerText = i18n[currentLang][key];
355
- });
356
- e.stopPropagation();
357
- dropdown.classList.remove('open');
358
- };
359
- });
360
 
361
- const btn = document.getElementById('audit-btn');
362
- const cons = document.getElementById('console');
363
- let file = null;
364
-
365
- function log(msg) {
366
- const d = document.createElement('div');
367
- const prompt = document.createElement('span');
368
- prompt.style.color = 'var(--accent)';
369
- prompt.innerText = '> ';
370
- d.appendChild(prompt);
371
- d.appendChild(document.createTextNode(msg));
372
- cons.appendChild(d); cons.scrollTop = cons.scrollHeight;
373
  }
 
374
 
375
- document.getElementById('f-input').onchange = (e) => {
376
- if(e.target.files.length) {
377
- file = e.target.files[0];
378
- const dropZone = document.getElementById('drop-zone');
379
- dropZone.replaceChildren();
380
-
381
- const check = document.createElement('div');
382
- check.style.color = 'var(--accent)';
383
- check.innerText = '✓';
384
- dropZone.appendChild(check);
385
-
386
- const name = document.createElement('p');
387
- name.style.fontSize = '10px';
388
- name.innerText = file.name;
389
- dropZone.appendChild(name);
390
-
391
- const note = document.createElement('p');
392
- note.style.fontSize = '9px';
393
- note.style.color = '#ffcc66';
394
- note.style.marginTop = '8px';
395
- note.innerText = 'Demo intake only; no browser-side approval will be issued.';
396
- dropZone.appendChild(note);
397
-
398
- log(`INGESTED: ${file.name}`);
399
- }
400
- };
401
- document.getElementById('drop-zone').onclick = () => document.getElementById('f-input').click();
402
 
403
- btn.onclick = async () => {
404
- if(!file) return;
405
- btn.disabled = true;
406
- log("INIT: Preparing local demo intake...");
407
-
408
- // Vision Agent
409
- document.getElementById('v-fill').style.width = "100%";
410
- log("VISION: Demo animation only; document bytes are not authenticated in-browser...");
411
- await new Promise(r => setTimeout(r, 800));
412
-
413
- // Graph Agent
414
- document.getElementById('g-fill').style.width = "100%";
415
- log("GRAPH: Skipping browser-side registry approval; server audit required...");
416
- await new Promise(r => setTimeout(r, 1500)); // Simulating a deeper search
417
-
418
- // Logic Agent
419
- document.getElementById('l-fill').style.width = "100%";
420
- log("LOGIC: Refusing automatic approval without signed server evidence...");
421
- await new Promise(r => setTimeout(r, 800));
422
-
423
- await finish();
424
- };
425
-
426
- async function finish() {
427
- let verdict = 'NEEDS_REVIEW';
428
- let reason = 'DEMO MODE: This browser-only page does not read or authenticate document contents. A professional credential decision requires OCR/forensics, issuer registry checks, revocation checks, and a server-signed audit certificate.';
429
- let status_code = 'DEMO_ONLY';
430
- let issuer = 'UNVERIFIED';
431
- let ror_id = '--';
432
-
433
- const allowedTypes = ['application/pdf', 'image/png', 'image/jpeg'];
434
- const fileTypeKnown = allowedTypes.includes(file.type);
435
- if (!fileTypeKnown) {
436
- verdict = 'REJECTED';
437
- status_code = 'UNSUPPORTED_TYPE';
438
- reason = 'Unsupported file type. Upload a PDF, PNG, or JPEG credential for a production server-side audit.';
439
- log('SYSTEM: REJECTED - Unsupported file type for audit intake.');
440
- } else {
441
- log('SYSTEM: DEMO ONLY - File content was not sent to a trusted audit service.');
442
- log('SYSTEM: NEEDS REVIEW - No browser-side approval is issued.');
443
- }
444
 
445
- const modal = document.getElementById('modal');
446
- modal.style.display = 'flex';
447
- const t = i18n[currentLang];
 
 
 
 
448
 
449
- document.getElementById('m-issuer').innerText = issuer;
450
- document.getElementById('m-status').innerText = status_code;
 
 
 
 
 
 
 
 
 
 
 
451
 
452
- const verdictTitle = verdict === 'REJECTED' ? t.verdict_no : 'SERVER AUDIT REQUIRED';
453
- const verdictColor = verdict === 'REJECTED' ? '#ff3366' : '#ffcc66';
454
-
455
- const report = document.getElementById('rep-body');
456
- report.replaceChildren();
457
-
458
- const title = document.createElement('h2');
459
- title.style.color = verdictColor;
460
- title.innerText = verdictTitle;
461
- report.appendChild(title);
462
-
463
- const summary = document.createElement('p');
464
- summary.style.margin = '20px 0';
465
- summary.style.lineHeight = '1.6';
466
- summary.innerText = reason;
467
- report.appendChild(summary);
468
-
469
- const details = document.createElement('div');
470
- details.style.borderTop = '1px solid #eee';
471
- details.style.paddingTop = '15px';
472
- details.style.fontSize = '11px';
473
- details.style.color = '#666';
474
- details.style.marginBottom = '20px';
475
- details.innerText = `ROR ID: ${ror_id}\nAudit Trace: LOCAL-DEMO-NOT-SIGNED`;
476
- report.appendChild(details);
477
-
478
- const done = document.createElement('button');
479
- done.className = 'btn-main';
480
- done.style.width = '100%';
481
- done.innerText = 'DONE';
482
- done.onclick = () => location.reload();
483
- report.appendChild(done);
484
  }
 
 
485
  </script>
486
  </body>
487
  </html>
 
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Aegis-Graph | Sovereign Audit Dashboard</title>
7
+ <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600;800&family=Inter:wght@300;400;600&display=swap" rel="stylesheet">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  <style>
9
  :root {
10
+ --primary: #00ffaa;
11
+ --primary-glow: rgba(0, 255, 170, 0.4);
12
+ --bg: #010204;
13
+ --card-bg: rgba(10, 15, 25, 0.7);
14
+ --text: #e0e0e0;
15
+ --accent: #0088ff;
 
 
16
  }
17
+
18
+ * {
19
+ margin: 0;
20
+ padding: 0;
21
+ box-sizing: border-box;
 
 
 
 
 
 
 
22
  }
23
+
24
+ body {
25
+ font-family: 'Inter', sans-serif;
26
+ background-color: var(--bg);
27
+ color: var(--text);
28
+ overflow: hidden;
29
+ display: flex;
30
+ flex-direction: column;
31
+ height: 100vh;
32
  }
33
+
34
+ /* 3D Particle Background Overlay */
35
+ #bg-canvas {
36
+ position: absolute;
37
+ top: 0;
38
+ left: 0;
39
+ width: 100%;
40
+ height: 100%;
41
+ z-index: -1;
42
+ opacity: 0.4;
 
 
 
 
 
 
43
  }
44
+
45
+ header {
46
+ padding: 2rem;
47
+ text-align: center;
48
+ background: linear-gradient(to bottom, rgba(0,0,0,0.8), transparent);
 
 
 
 
 
49
  }
50
+
51
+ header h1 {
52
+ font-family: 'Outfit', sans-serif;
53
+ font-weight: 800;
54
+ letter-spacing: -1px;
55
+ font-size: 2.5rem;
56
+ background: linear-gradient(45deg, #fff, var(--primary));
57
+ -webkit-background-clip: text;
58
+ -webkit-text-fill-color: transparent;
 
 
 
59
  }
60
+
61
+ .main-container {
62
+ flex: 1;
63
+ display: grid;
64
+ grid-template-columns: 350px 1fr;
65
+ gap: 2rem;
66
+ padding: 2rem;
67
+ max-width: 1400px;
68
+ margin: 0 auto;
69
+ width: 100%;
70
  }
71
+
72
+ .sidebar {
73
+ display: flex;
74
+ flex-direction: column;
75
+ gap: 1.5rem;
 
 
 
 
 
 
 
 
 
 
 
 
76
  }
77
+
78
+ .stats-card {
79
+ background: var(--card-bg);
80
+ backdrop-filter: blur(12px);
81
+ border: 1px solid rgba(255,255,255,0.1);
82
+ border-radius: 16px;
83
+ padding: 1.5rem;
84
+ transition: all 0.3s ease;
 
 
 
 
 
85
  }
86
+
87
+ .stats-card:hover {
88
+ border-color: var(--primary);
89
+ box-shadow: 0 0 20px var(--primary-glow);
 
 
 
 
 
 
 
 
 
 
 
90
  }
 
 
 
 
 
91
 
92
+ .stats-card h3 {
93
+ font-size: 0.8rem;
94
+ text-transform: uppercase;
95
+ color: var(--primary);
96
+ margin-bottom: 0.5rem;
97
+ }
98
+
99
+ .stats-card .value {
100
+ font-family: 'Outfit', sans-serif;
101
+ font-size: 2rem;
102
  font-weight: 600;
 
 
103
  }
104
+
105
+ .audit-panel {
106
+ background: var(--card-bg);
107
+ backdrop-filter: blur(12px);
108
+ border: 1px solid rgba(255,255,255,0.1);
109
+ border-radius: 20px;
110
  display: flex;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  flex-direction: column;
112
+ overflow: hidden;
113
+ position: relative;
 
114
  }
115
+
116
+ .audit-visual {
117
+ flex: 1;
118
  display: flex;
119
+ align-items: center;
120
+ justify-content: center;
121
+ position: relative;
 
 
122
  }
123
+
124
+ .audit-button {
125
+ background: transparent;
126
+ border: 2px solid var(--primary);
127
+ color: var(--primary);
128
+ padding: 1.5rem 3rem;
129
+ font-size: 1.2rem;
130
+ font-family: 'Outfit', sans-serif;
131
+ font-weight: 600;
132
+ text-transform: uppercase;
133
+ cursor: pointer;
134
+ border-radius: 50px;
135
+ transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
136
+ z-index: 10;
137
  }
138
+
139
+ .audit-button:hover {
140
+ background: var(--primary);
141
  color: #000;
142
+ box-shadow: 0 0 50px var(--primary);
143
+ transform: scale(1.05);
144
+ }
145
+
146
+ .terminal-overlay {
147
+ height: 250px;
148
+ background: rgba(0, 0, 0, 0.8);
149
+ border-top: 1px solid rgba(255,255,255,0.1);
150
+ font-family: 'Courier New', Courier, monospace;
151
+ padding: 1rem;
152
+ font-size: 0.85rem;
153
+ overflow-y: auto;
154
+ color: #aaa;
155
  }
156
 
157
+ .log-entry { margin-bottom: 0.3rem; }
158
+ .log-time { color: #666; margin-right: 0.5rem; }
159
+ .log-agent { color: var(--primary); font-weight: bold; }
160
+ .log-msg { color: #fff; }
161
+
162
+ .scan-line {
163
+ position: absolute;
164
+ top: 0;
165
+ left: 0;
166
+ width: 100%;
167
+ height: 2px;
168
+ background: var(--primary);
169
+ box-shadow: 0 0 15px var(--primary);
170
+ z-index: 5;
171
+ display: none;
172
+ animation: scan 2s linear infinite;
173
  }
174
+
175
+ @keyframes scan {
176
+ from { top: 0; }
177
+ to { top: 100%; }
178
+ }
179
+
180
+ .verdict-popup {
181
+ position: absolute;
182
+ top: 50%;
183
+ left: 50%;
184
+ transform: translate(-50%, -50%) scale(0.8);
185
+ background: rgba(0,0,0,0.9);
186
+ border: 2px solid var(--primary);
187
+ padding: 2rem;
188
+ border-radius: 20px;
189
+ text-align: center;
190
+ opacity: 0;
191
+ visibility: hidden;
192
+ transition: all 0.5s ease;
193
+ z-index: 20;
194
+ }
195
+
196
+ .verdict-popup.show {
197
+ opacity: 1;
198
+ visibility: visible;
199
+ transform: translate(-50%, -50%) scale(1);
200
  }
 
201
  </style>
202
  </head>
203
  <body>
204
+ <canvas id="bg-canvas"></canvas>
205
+
206
  <header>
207
+ <h1>AEGIS-GRAPH</h1>
208
+ <p style="color: #666; text-transform: uppercase; letter-spacing: 2px; font-size: 0.7rem; margin-top: 0.5rem;">Sovereign Audit Protocol // MARS Swarm v2.0</p>
209
+ </header>
210
+
211
+ <div class="main-container">
212
+ <div class="sidebar">
213
+ <div class="stats-card">
214
+ <h3>Sovereign Nodes</h3>
215
+ <div class="value">102,482</div>
 
 
 
 
 
 
216
  </div>
217
+ <div class="stats-card">
218
+ <h3>Audit Precision</h3>
219
+ <div class="value">99.42%</div>
220
+ </div>
221
+ <div class="stats-card">
222
+ <h3>Graph Density</h3>
223
+ <div class="value">4.2M Edges</div>
224
+ </div>
225
+ <div class="stats-card" style="margin-top: auto; border-color: rgba(0,136,255,0.3);">
226
+ <h3>Protocol Authority</h3>
227
+ <p style="font-size: 0.8rem; line-height: 1.4; color: #888;">Demo visualization only; production verification requires server-signed audit evidence.</p>
 
228
  </div>
 
229
  </div>
 
230
 
231
+ <div class="audit-panel">
232
+ <div class="scan-line" id="scanLine"></div>
233
+ <div class="audit-visual" id="auditVisual">
234
+ <button class="audit-button" id="startBtn">Initialize Sovereign Audit</button>
235
+
236
+ <div class="verdict-popup" id="verdict">
237
+ <h2 style="color: var(--primary); margin-bottom: 1rem;">SERVER AUDIT REQUIRED</h2>
238
+ <p style="margin-bottom: 0.5rem;">Local Demo ID: <span style="color: #fff;">UNSIGNED-PREVIEW</span></p>
239
+ <p>Credential Status: <span style="color: var(--primary);">NEEDS SERVER REVIEW</span></p>
240
+ <button onclick="reset()" style="margin-top: 1.5rem; background: var(--primary); border: none; padding: 0.5rem 1rem; border-radius: 5px; cursor: pointer;">Close Proof</button>
241
+ </div>
242
  </div>
243
+ <div class="terminal-overlay" id="terminal">
244
+ <div class="log-entry">System ready. Waiting for ingestion...</div>
 
 
 
 
 
 
245
  </div>
246
  </div>
247
  </div>
 
248
 
249
  <script>
250
+ const canvas = document.getElementById('bg-canvas');
251
+ const ctx = canvas.getContext('2d');
252
+ let particles = [];
253
+
254
+ function resize() {
255
+ canvas.width = window.innerWidth;
256
+ canvas.height = window.innerHeight;
257
+ }
258
+ window.addEventListener('resize', resize);
259
+ resize();
260
+
261
+ class Particle {
262
+ constructor() {
263
+ this.x = Math.random() * canvas.width;
264
+ this.y = Math.random() * canvas.height;
265
+ this.vx = (Math.random() - 0.5) * 0.5;
266
+ this.vy = (Math.random() - 0.5) * 0.5;
267
+ this.size = Math.random() * 2;
 
 
 
 
 
 
268
  }
269
+ update() {
270
+ this.x += this.vx;
271
+ this.y += this.vy;
272
+ if (this.x < 0 || this.x > canvas.width) this.vx *= -1;
273
+ if (this.y < 0 || this.y > canvas.height) this.vy *= -1;
274
+ }
275
+ draw() {
276
+ ctx.fillStyle = '#00ffaa';
277
+ ctx.beginPath();
278
+ ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
279
+ ctx.fill();
280
+ }
281
+ }
282
 
283
+ for (let i = 0; i < 100; i++) particles.push(new Particle());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
284
 
285
+ function animate() {
286
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
287
+ particles.forEach(p => {
288
+ p.update();
289
+ p.draw();
290
+ });
291
+ requestAnimationFrame(animate);
 
 
 
 
 
292
  }
293
+ animate();
294
 
295
+ const terminal = document.getElementById('terminal');
296
+ const startBtn = document.getElementById('startBtn');
297
+ const scanLine = document.getElementById('scanLine');
298
+ const verdict = document.getElementById('verdict');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
299
 
300
+ function addLog(agent, msg) {
301
+ const time = new Date().toLocaleTimeString([], { hour12: false, minute: '2-digit', second: '2-digit' });
302
+ const entry = document.createElement('div');
303
+ entry.className = 'log-entry';
304
+
305
+ const timeNode = document.createElement('span');
306
+ timeNode.className = 'log-time';
307
+ timeNode.innerText = `[${time}]`;
308
+ entry.appendChild(timeNode);
309
+ entry.appendChild(document.createTextNode(' '));
310
+
311
+ const agentNode = document.createElement('span');
312
+ agentNode.className = 'log-agent';
313
+ agentNode.innerText = agent;
314
+ entry.appendChild(agentNode);
315
+ entry.appendChild(document.createTextNode(' '));
316
+
317
+ const msgNode = document.createElement('span');
318
+ msgNode.className = 'log-msg';
319
+ msgNode.innerText = msg;
320
+ entry.appendChild(msgNode);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
 
322
+ terminal.appendChild(entry);
323
+ terminal.scrollTop = terminal.scrollHeight;
324
+ }
325
+
326
+ startBtn.addEventListener('click', async () => {
327
+ startBtn.style.display = 'none';
328
+ scanLine.style.display = 'block';
329
 
330
+ addLog('SYSTEM', 'Initializing local demo visualization...');
331
+ await sleep(1000);
332
+ addLog('VISION', 'Demo animation only; no credential bytes are authenticated here...');
333
+ await sleep(1500);
334
+ addLog('GRAPH', 'Skipping browser-side registry approval; server audit required...');
335
+ await sleep(1000);
336
+ addLog('GRAPH', 'Institution registry evidence must be resolved by a trusted service.');
337
+ await sleep(1200);
338
+ addLog('LOGIC', 'Refusing automatic approval without signed server evidence...');
339
+ await sleep(800);
340
+ addLog('LOGIC', 'Credential status: NEEDS SERVER REVIEW.');
341
+ await sleep(1000);
342
+ addLog('SYSTEM', 'Demo complete. No audit certificate was issued.');
343
 
344
+ scanLine.style.display = 'none';
345
+ verdict.classList.add('show');
346
+ });
347
+
348
+ function reset() {
349
+ verdict.classList.remove('show');
350
+ startBtn.style.display = 'block';
351
+ terminal.replaceChildren();
352
+ const entry = document.createElement('div');
353
+ entry.className = 'log-entry';
354
+ entry.innerText = 'System ready. Waiting for ingestion...';
355
+ terminal.appendChild(entry);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
356
  }
357
+
358
+ function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
359
  </script>
360
  </body>
361
  </html>