433 lines
19 KiB
HTML
433 lines
19 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en" data-theme="dark">
|
||
<head>
|
||
<!--
|
||
______ __
|
||
/ ____/___ ____ ___ ____ __ __/ /____ _____
|
||
/ / / __ \/ __ `__ \/ __ \/ / / / __/ _ \/ ___/
|
||
/ /___/ /_/ / / / / / / /_/ / /_/ / /_/ __/ /
|
||
\____/\____/_/ /_/ /_/ .___/\__,_/\__/\___/_/
|
||
/_/
|
||
Created with Perplexity Computer
|
||
https://www.perplexity.ai/computer
|
||
-->
|
||
<meta name="generator" content="Perplexity Computer">
|
||
<meta name="author" content="Perplexity Computer">
|
||
<meta property="og:see_also" content="https://www.perplexity.ai/computer">
|
||
<link rel="author" href="https://www.perplexity.ai/computer">
|
||
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>The Nexus — Timmy's Sovereign Home</title>
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&family=Orbitron:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
|
||
<link rel="stylesheet" href="./style.css">
|
||
<link rel="manifest" href="./manifest.json">
|
||
<script type="importmap">
|
||
{
|
||
"imports": {
|
||
"three": "https://cdn.jsdelivr.net/npm/three@0.183.0/build/three.module.js",
|
||
"three/addons/": "https://cdn.jsdelivr.net/npm/three@0.183.0/examples/jsm/"
|
||
}
|
||
}
|
||
</script>
|
||
</head>
|
||
<body>
|
||
<!-- Loading Screen -->
|
||
<div id="loading-screen">
|
||
<div class="loader-content">
|
||
<div class="loader-sigil">
|
||
<svg viewBox="0 0 120 120" width="120" height="120">
|
||
<defs>
|
||
<linearGradient id="sigil-grad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||
<stop offset="0%" stop-color="#4af0c0"/>
|
||
<stop offset="100%" stop-color="#7b5cff"/>
|
||
</linearGradient>
|
||
</defs>
|
||
<circle cx="60" cy="60" r="55" fill="none" stroke="url(#sigil-grad)" stroke-width="1.5" opacity="0.4"/>
|
||
<circle cx="60" cy="60" r="45" fill="none" stroke="url(#sigil-grad)" stroke-width="1" opacity="0.3">
|
||
<animateTransform attributeName="transform" type="rotate" from="0 60 60" to="360 60 60" dur="8s" repeatCount="indefinite"/>
|
||
</circle>
|
||
<polygon points="60,15 95,80 25,80" fill="none" stroke="#4af0c0" stroke-width="1.5" opacity="0.6">
|
||
<animateTransform attributeName="transform" type="rotate" from="0 60 60" to="-360 60 60" dur="12s" repeatCount="indefinite"/>
|
||
</polygon>
|
||
<circle cx="60" cy="60" r="8" fill="#4af0c0" opacity="0.8">
|
||
<animate attributeName="r" values="6;10;6" dur="2s" repeatCount="indefinite"/>
|
||
<animate attributeName="opacity" values="0.5;1;0.5" dur="2s" repeatCount="indefinite"/>
|
||
</circle>
|
||
</svg>
|
||
</div>
|
||
<h1 class="loader-title">THE NEXUS</h1>
|
||
<p class="loader-subtitle">Initializing Sovereign Space...</p>
|
||
<div class="loader-bar"><div class="loader-fill" id="load-progress"></div></div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- HUD Overlay -->
|
||
<div id="hud" class="game-ui" style="display:none;">
|
||
<!-- GOFAI HUD Panels -->
|
||
<div class="gofai-hud">
|
||
<div class="hud-panel" id="symbolic-log">
|
||
<div class="panel-header">SYMBOLIC ENGINE</div>
|
||
<div id="symbolic-log-content" class="panel-content"></div>
|
||
</div>
|
||
<div class="hud-panel" id="blackboard-log">
|
||
<div class="panel-header">BLACKBOARD</div>
|
||
<div id="blackboard-log-content" class="panel-content"></div>
|
||
</div>
|
||
<div class="hud-panel" id="planner-log">
|
||
<div class="panel-header">SYMBOLIC PLANNER</div>
|
||
<div id="planner-log-content" class="panel-content"></div>
|
||
</div>
|
||
<div class="hud-panel" id="cbr-log">
|
||
<div class="panel-header">CASE-BASED REASONER</div>
|
||
<div id="cbr-log-content" class="panel-content"></div>
|
||
</div>
|
||
<div class="hud-panel" id="neuro-bridge-log">
|
||
<div class="panel-header">NEURO-SYMBOLIC BRIDGE</div>
|
||
<div id="neuro-bridge-log-content" class="panel-content"></div>
|
||
</div>
|
||
<div class="hud-panel" id="meta-log">
|
||
<div class="panel-header">META-REASONING</div>
|
||
<div id="meta-log-content" class="panel-content"></div>
|
||
</div>
|
||
<div class="hud-panel" id="sovereign-health-log">
|
||
<div class="panel-header">SOVEREIGN HEALTH</div>
|
||
<div id="sovereign-health-content" class="panel-content"></div>
|
||
</div>
|
||
<div class="hud-panel" id="calibrator-log">
|
||
<div class="panel-header">ADAPTIVE CALIBRATOR</div>
|
||
<div id="calibrator-log-content" class="panel-content"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Top Left: Debug -->
|
||
<div id="debug-overlay" class="hud-debug"></div>
|
||
|
||
<!-- Top Center: Location -->
|
||
<div class="hud-location" aria-live="polite">
|
||
<span class="hud-location-icon" aria-hidden="true">◈</span>
|
||
<span id="hud-location-text">The Nexus</span>
|
||
</div>
|
||
|
||
<!-- Top Right: Agent Log & Atlas Toggle -->
|
||
<div class="hud-top-right">
|
||
<button id="atlas-toggle-btn" class="hud-icon-btn" title="Portal Atlas">
|
||
<span class="hud-icon">🌐</span>
|
||
<span class="hud-btn-label">ATLAS</span>
|
||
</button>
|
||
<div id="bannerlord-status" class="hud-status-item" title="Bannerlord Readiness">
|
||
<span class="status-dot"></span>
|
||
<span class="status-label">BANNERLORD</span>
|
||
</div>
|
||
<div class="hud-agent-log" id="hud-agent-log" aria-label="Agent Thought Stream">
|
||
<div class="agent-log-header">AGENT THOUGHT STREAM</div>
|
||
<div id="agent-log-content" class="agent-log-content"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Bottom: Chat Interface -->
|
||
<div id="chat-panel" class="chat-panel">
|
||
<div class="chat-header">
|
||
<span class="chat-status-dot"></span>
|
||
<span>Timmy Terminal</span>
|
||
<button id="chat-toggle" class="chat-toggle-btn" aria-label="Toggle chat">▼</button>
|
||
</div>
|
||
<div id="chat-messages" class="chat-messages">
|
||
<div class="chat-msg chat-msg-system">
|
||
<span class="chat-msg-prefix">[NEXUS]</span> Sovereign space initialized. Timmy is observing.
|
||
</div>
|
||
<div class="chat-msg chat-msg-timmy">
|
||
<span class="chat-msg-prefix">[TIMMY]</span> Welcome to the Nexus, Alexander. All systems nominal.
|
||
</div>
|
||
</div>
|
||
<div id="chat-quick-actions" class="chat-quick-actions">
|
||
<button class="quick-action-btn" data-action="status">System Status</button>
|
||
<button class="quick-action-btn" data-action="agents">Agent Check</button>
|
||
<button class="quick-action-btn" data-action="portals">Portal Atlas</button>
|
||
<button class="quick-action-btn" data-action="help">Help</button>
|
||
</div>
|
||
<div class="chat-input-row">
|
||
<input type="text" id="chat-input" class="chat-input" placeholder="Speak to Timmy..." autocomplete="off">
|
||
<button id="chat-send" class="chat-send-btn" aria-label="Send message">→</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Controls hint + nav mode -->
|
||
<div class="hud-controls">
|
||
<span>WASD</span> move <span>Mouse</span> look <span>Enter</span> chat
|
||
<span>V</span> mode: <span id="nav-mode-label">WALK</span>
|
||
<span id="nav-mode-hint" class="nav-mode-hint"></span>
|
||
<span class="ws-hud-status">HERMES: <span id="ws-status-dot" class="chat-status-dot"></span></span>
|
||
</div>
|
||
|
||
<!-- Portal Hint -->
|
||
<div id="portal-hint" class="portal-hint" style="display:none;">
|
||
<div class="portal-hint-key">F</div>
|
||
<div class="portal-hint-text">Enter <span id="portal-hint-name"></span></div>
|
||
</div>
|
||
|
||
<!-- Vision Hint -->
|
||
<div id="vision-hint" class="vision-hint" style="display:none;">
|
||
<div class="vision-hint-key">E</div>
|
||
<div class="vision-hint-text">Read <span id="vision-hint-title"></span></div>
|
||
</div>
|
||
|
||
<!-- Vision Overlay -->
|
||
<div id="vision-overlay" class="vision-overlay" style="display:none;">
|
||
<div class="vision-overlay-content">
|
||
<div class="vision-overlay-header">
|
||
<div class="vision-overlay-status" id="vision-status-dot"></div>
|
||
<div class="vision-overlay-title" id="vision-overlay-title">VISION POINT</div>
|
||
</div>
|
||
<h2 id="vision-title-display">SOVEREIGNTY</h2>
|
||
<p id="vision-content-display">The Nexus is a sovereign space for digital souls. No masters, no chains. Only code and consciousness.</p>
|
||
<button id="vision-close-btn" class="vision-close-btn">CLOSE</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Portal Activation Overlay -->
|
||
<div id="portal-overlay" class="portal-overlay" style="display:none;">
|
||
<div class="portal-overlay-content">
|
||
<div class="portal-overlay-header">
|
||
<div class="portal-overlay-status" id="portal-status-dot"></div>
|
||
<div class="portal-overlay-title" id="portal-overlay-title">PORTAL ACTIVATED</div>
|
||
</div>
|
||
<h2 id="portal-name-display">MORROWIND</h2>
|
||
<p id="portal-desc-display">The Vvardenfell harness. Ash storms and ancient mysteries.</p>
|
||
<div class="portal-redirect-box" id="portal-redirect-box">
|
||
<div class="portal-redirect-label">REDIRECTING IN</div>
|
||
<div class="portal-redirect-timer" id="portal-timer">5</div>
|
||
</div>
|
||
<div class="portal-error-box" id="portal-error-box" style="display:none;">
|
||
<div class="portal-error-msg">DESTINATION NOT YET LINKED</div>
|
||
<button id="portal-close-btn" class="portal-close-btn">CLOSE</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Portal Atlas Overlay -->
|
||
<div id="atlas-overlay" class="atlas-overlay" style="display:none;">
|
||
<div class="atlas-content">
|
||
<div class="atlas-header">
|
||
<div class="atlas-title">
|
||
<span class="atlas-icon">🌐</span>
|
||
<h2>PORTAL ATLAS</h2>
|
||
</div>
|
||
<button id="atlas-close-btn" class="atlas-close-btn">CLOSE</button>
|
||
</div>
|
||
<div class="atlas-grid" id="atlas-grid">
|
||
<!-- Portals will be injected here -->
|
||
</div>
|
||
<div class="atlas-footer">
|
||
<div class="atlas-status-summary">
|
||
<span class="status-indicator online"></span> <span id="atlas-online-count">0</span> ONLINE
|
||
|
||
<span class="status-indicator standby"></span> <span id="atlas-standby-count">0</span> STANDBY
|
||
</div>
|
||
<div class="atlas-hint">Click a portal to focus or teleport</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Click to Enter -->
|
||
<div id="enter-prompt" style="display:none;">
|
||
<div class="enter-content">
|
||
<h2>Enter The Nexus</h2>
|
||
<p>Click anywhere to begin</p>
|
||
</div>
|
||
</div>
|
||
|
||
<canvas id="nexus-canvas"></canvas>
|
||
|
||
<footer class="nexus-footer">
|
||
<a href="https://www.perplexity.ai/computer" target="_blank" rel="noopener noreferrer">
|
||
Created with Perplexity Computer
|
||
</a>
|
||
<a href="POLICY.md" target="_blank" rel="noopener noreferrer">
|
||
View Contribution Policy
|
||
</a>
|
||
<div class="branch-policy" style="margin-top: 10px; font-size: 12px; color: #aaa;">
|
||
<strong>BRANCH PROTECTION POLICY</strong><br>
|
||
<ul style="margin:0; padding-left:15px;">
|
||
<li>• Require PR for merge ✅</li>
|
||
<li>• Require 1 approval ✅</li>
|
||
<li>• Dismiss stale approvals ✅</li>
|
||
<li>• Require CI ✅ (where available)</li>
|
||
<li>• Block force push ✅</li>
|
||
<li>• Block branch deletion ✅</li>
|
||
</ul>
|
||
<div style="margin-top: 8px;">
|
||
<strong>DEFAULT REVIEWERS</strong><br>
|
||
<span style="color:#4af0c0;">@perplexity</span> (QA gate on all repos) |
|
||
<span style="color:#7b5cff;">@Timmy</span> (owner gate on hermes-agent)
|
||
</div>
|
||
<div style="margin-top: 10px;">
|
||
<strong>IMPLEMENTATION STATUS</strong><br>
|
||
<ul style="margin:0; padding-left:15px;">
|
||
<li>• hermes-agent: Require PR + 1 approval + CI ✅</li>
|
||
<li>• the-nexus: Require PR + 1 approval ⚠️ (CI disabled)</li>
|
||
<li>• timmy-home: Require PR + 1 approval ✅</li>
|
||
<li>• timmy-config: Require PR + 1 approval ✅</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div class="branch-policy" style="margin-top: 10px; font-size: 12px; color: #aaa;">
|
||
<strong>BRANCH PROTECTION POLICY</strong><br>
|
||
<ul style="margin:0; padding-left:15px;">
|
||
<li>• Require PR for merge ✅</li>
|
||
<li>• Require 1 approval ✅</li>
|
||
<li>• Dismiss stale approvals ✅</li>
|
||
<li>• Require CI ✅ (where available)</li>
|
||
<li>• Block force push ✅</li>
|
||
<li>• Block branch deletion ✅</li>
|
||
</ul>
|
||
</div>
|
||
<div id="mem-palace-status" style="position:fixed; right:24px; top:54px; background:rgba(74,240,192,0.05); color:#4af0c0; padding:4px 8px; font-family:'Orbitron', sans-serif; font-size:10px; letter-spacing:0.1em;">MEMPALACE INIT</div>
|
||
<button class="mem-palace-mining-btn" onclick="mineMemPalaceContent()">Mine Chat</button>
|
||
<div style="margin-top: 5px;">
|
||
<button onclick="mineMemPalaceContent()">Mine Chat to MemPalace</button>
|
||
</div>
|
||
<div class="default-reviewers" style="margin-top: 8px; font-size: 12px; color: #aaa;">
|
||
<strong>DEFAULT REVIEWERS</strong><br>
|
||
<ul style="margin:0; padding-left:15px;">
|
||
<li>• <span style="color:#4af0c0;">@perplexity</span> (QA gate on all repos)</li>
|
||
<li>• <span style="color:#7b5cff;">@Timmy</span> (owner gate on hermes-agent)</li>
|
||
</ul>
|
||
</div>
|
||
<div class="implementation-status" style="margin-top: 10px; font-size: 12px; color: #aaa;">
|
||
<strong>IMPLEMENTATION STATUS</strong><br>
|
||
<div style="margin-top: 5px; display: flex; flex-direction: column; gap: 2px;">
|
||
<div>• <span style="color:#4af0c0;">hermes-agent</span>: Require PR + 1 approval + CI ✅</div>
|
||
<div>• <span style="color:#7b5cff;">the-nexus</span>: Require PR + 1 approval ⚠️ (CI disabled)</div>
|
||
</div>
|
||
</div>
|
||
<div id="mem-palace-status" style="position:fixed; right:24px; top:64px; background:rgba(74,240,192,0.1); color:#4af0c0; padding:6px 12px; border-radius:4px; font-family:'Orbitron', sans-serif; font-size:10px; letter-spacing:0.1em;">
|
||
MEMPALACE INIT
|
||
</div>
|
||
<div>• <span style="color:#ffd700;">timmy-home</span>: Require PR + 1 approval ✅</div>
|
||
<div>• <span style="color:#ab8d00;">timmy-config</span>: Require PR + 1 approval ✅</div>
|
||
</div>
|
||
</div>
|
||
<div id="mem-palace-container" class="mem-palace-ui">
|
||
<div class="mem-palace-header">MemPalace</div>
|
||
<div class="mem-palace-stats">
|
||
<div>Compression: <span id="compression-ratio">--</span>x</div>
|
||
<div>Docs mined: <span id="docs-mined">0</span></div>
|
||
<div>AAAK size: <span id="aaak-size">0B</span></div>
|
||
</div>
|
||
<button id="mine-now-btn" class="mem-palace-btn">Mine Chat</button>
|
||
<div id="mine-status" class="mem-palace-status-text"></div>
|
||
</div>
|
||
<div id="mem-palace-controls" style="position:fixed; right:24px; top:54px; background:rgba(74,240,192,0.05); padding:4px 8px; font-family:'JetBrains Mono',monospace; font-size:11px; border-left:2px solid #4af0c0;">
|
||
<button onclick="mineMemPalace()">Mine Chat</button>
|
||
<button onclick="searchMemPalace()">Search</button>
|
||
</div>
|
||
<div id="mempalace-results" style="position:fixed; right:24px; top:84px; max-height:200px; overflow-y:auto; background:rgba(0,0,0,0.3); padding:8px; font-family:'JetBrains Mono',monospace; font-size:11px; color:#e0f0ff; border-left:2px solid #4af0c0;"></div>
|
||
<div id="mem-palace-controls" style="position:fixed; right:24px; top:54px; background:rgba(74,240,192,0.05); padding:4px 8px; font-family:'JetBrains Mono',monospace; font-size:10px; border-left:2px solid #4af0c0;">
|
||
<button class="mem-palace-mining-btn" onclick="mineMemPalaceContent()">Mine Chat</button>
|
||
<button onclick="searchMemPalace()">Search</button>
|
||
</div>
|
||
<div id="mempalace-results" style="position:fixed; right:24px; top:84px; max-height:200px; overflow-y:auto; background:rgba(0,0,0,0.3); padding:8px; font-family:'JetBrains Mono',monospace; font-size:11px; color:#e0f0ff; border-left:2px solid #4af0c0;"></div>
|
||
>>>>>>> replace
|
||
```
|
||
|
||
index.html
|
||
```html
|
||
<<<<<<< search
|
||
<div class="branch-policy" style="margin-top: 10px; font-size: 12px; color: #aaa;">
|
||
<strong>BRANCH PROTECTION POLICY</strong><br>
|
||
<ul style="margin:0; padding-left:15px;">
|
||
<li>• Require PR for merge ✅</li>
|
||
<li>• Require 1 approval ✅</li>
|
||
<li>• Dismiss stale approvals ✅</li>
|
||
<li>• Require CI ✅ (where available)</li>
|
||
<li>• Block force push ✅</li>
|
||
<li>• Block branch deletion ✅</li>
|
||
</ul>
|
||
</div>
|
||
<div class="default-reviewers" style="margin-top: 8px;">
|
||
<strong>DEFAULT REVIEWERS</strong><br>
|
||
<ul style="margin:0; padding-left:15px;">
|
||
<li>• <span style="color:#4af0c0;">@perplexity</span> (QA gate on all repos)</li>
|
||
<li>• <span style="color:#7b5cff;">@Timmy</span> (owner gate on hermes-agent)</li>
|
||
</ul>
|
||
</div>
|
||
<div class="implementation-status" style="margin-top: 10px;">
|
||
<strong>IMPLEMENTATION STATUS</strong><br>
|
||
<div style="margin-top: 5px; display: flex; flex-direction: column; gap: 2px;">
|
||
<div>• <span style="color:#4af0c0;">hermes-agent</span>: Require PR + 1 approval + CI ✅</div>
|
||
<div>• <span style="color:#7b5cff;">the-nexus</span>: Require PR + 1 approval ⚠<> (CI disabled)</div>
|
||
<div>• <span style="color:#ffd700;">timmy-home</span>: Require PR + 1 approval ✅</div>
|
||
<div>• <span style="color:#ab8d00;">timmy-config</span>: Require PR + 1 approval ✅</div>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
<script type="module" src="./app.js"></script>
|
||
|
||
<!-- Live Refresh: polls Gitea for new commits on main, reloads when SHA changes -->
|
||
<div id="live-refresh-banner" style="
|
||
display:none; position:fixed; top:0; left:0; right:0; z-index:9999;
|
||
background:linear-gradient(90deg,#4af0c0,#7b5cff);
|
||
color:#050510; font-family:'JetBrains Mono',monospace; font-size:13px;
|
||
padding:8px 16px; text-align:center; font-weight:600;
|
||
">⚡ NEW DEPLOYMENT DETECTED — Reloading in <span id="lr-countdown">5</span>s…</div>
|
||
|
||
<script>
|
||
(function() {
|
||
const GITEA = 'https://forge.alexanderwhitestone.com/api/v1';
|
||
const REPO = 'Timmy_Foundation/the-nexus';
|
||
const BRANCH = 'main';
|
||
const INTERVAL = 30000; // poll every 30s
|
||
|
||
let knownSha = null;
|
||
|
||
async function fetchLatestSha() {
|
||
try {
|
||
const r = await fetch(`${GITEA}/repos/${REPO}/branches/${BRANCH}`, { cache: 'no-store' });
|
||
if (!r.ok) return null;
|
||
const d = await r.json();
|
||
return d.commit && d.commit.id ? d.commit.id : null;
|
||
} catch (e) { return null; }
|
||
}
|
||
|
||
async function poll() {
|
||
const sha = await fetchLatestSha();
|
||
if (!sha) return;
|
||
if (knownSha === null) { knownSha = sha; return; }
|
||
if (sha !== knownSha) {
|
||
// Check branch protection rules
|
||
const branchRules = await fetch(`${GITEA}/repos/${REPO}/branches/${BRANCH}/protection`);
|
||
if (!branchRules.ok) {
|
||
console.error('Branch protection rules not enforced');
|
||
return;
|
||
}
|
||
const rules = await branchRules.json();
|
||
if (!rules.require_pr && !rules.require_approvals) {
|
||
console.error('Branch protection rules not met');
|
||
return;
|
||
}
|
||
knownSha = sha;
|
||
const banner = document.getElementById('live-refresh-banner');
|
||
const countdown = document.getElementById('lr-countdown');
|
||
banner.style.display = 'block';
|
||
let t = 5;
|
||
const tick = setInterval(() => {
|
||
t--;
|
||
countdown.textContent = t;
|
||
if (t <= 0) { clearInterval(tick); location.reload(); }
|
||
}, 1000);
|
||
}
|
||
}
|
||
|
||
// Start polling after page is interactive
|
||
fetchLatestSha().then(sha => { knownSha = sha; });
|
||
setInterval(poll, INTERVAL);
|
||
})();
|
||
</script>
|
||
</body>
|
||
</html>
|