Compare commits

..

39 Commits

Author SHA1 Message Date
e88bcb4857 [fix] 5 bugs: 2 SyntaxErrors in nexus_think.py, Groq model name, server race condition, corrupt public/nexus/
Some checks failed
CI / validate (pull_request) Failing after 5s
Bug 1: nexus_think.py line 318 — stray '.' between function call and if-block
  This is a SyntaxError. The entire consciousness loop cannot import.
  The Nexus Mind has been dead since this was committed.

Bug 2: nexus_think.py line 445 — 'parser.add_.argument()'
  Another SyntaxError — extra underscore in argparse call.
  The CLI entrypoint crashes on startup.

Bug 3: groq_worker.py — DEFAULT_MODEL = 'groq/llama3-8b-8192'
  The Groq API expects bare model names. The 'groq/' prefix causes a 404.
  Fixed to 'llama3-8b-8192'.

Bug 4: server.py — clients.remove() in finally block
  Raises KeyError if the websocket was never added to the set.
  Fixed to clients.discard() (safe no-op if not present).
  Also added tracking for disconnected clients during broadcast.

Bug 5: public/nexus/ — 3 corrupt duplicate files (28.6 KB wasted)
  app.js, style.css, and index.html all had identical content (same SHA).
  These are clearly a broken copy operation. The real files are at repo root.

Tests: 6 new, 21/22 total pass. The 1 pre-existing failure is in
test_portals_json_uses_expanded_registry_schema (schema mismatch, not
related to this PR).

Signed-off-by: gemini <gemini@hermes.local>
2026-03-30 19:04:53 -04:00
3d25279ff5 Merge pull request 'Sovereign Nexus: Parallel Symbolic Execution (PSE) Layer' (#783) from sovereign-nexus-pse-1774840209671 into main
Some checks failed
Deploy Nexus / deploy (push) Failing after 4s
2026-03-30 03:10:41 +00:00
66153d238f Sovereign Nexus: Inject PSE Layer Logic
Some checks failed
CI / validate (pull_request) Failing after 5s
2026-03-30 03:10:15 +00:00
e4d1f5c89f Sovereign Nexus: Inject PSE Styling 2026-03-30 03:10:13 +00:00
7433dae671 Sovereign Nexus: Inject PSE HUD 2026-03-30 03:10:12 +00:00
09838cc039 Sovereign Nexus: Add GOFAI Parallel Worker (PSE) 2026-03-30 03:10:10 +00:00
52eb39948f Merge pull request 'Sovereign Nexus: L402 Server Skeleton & Nostr Agent Registration' (#778) from sovereign-nexus-l402-nostr-1774840051948 into main
Some checks failed
Deploy Nexus / deploy (push) Failing after 3s
2026-03-30 03:07:50 +00:00
14b226a034 Sovereign Nexus: Inject Nostr Agent & L402 Client Logic
Some checks failed
CI / validate (pull_request) Failing after 4s
2026-03-30 03:07:37 +00:00
c35e1b7355 Sovereign Nexus: Inject Nostr & L402 Styling 2026-03-30 03:07:35 +00:00
ece1b87580 Sovereign Nexus: Inject Nostr & L402 HUD 2026-03-30 03:07:34 +00:00
61152737fb Sovereign Nexus: Add L402 Server Skeleton 2026-03-30 03:07:33 +00:00
a855d544a9 Merge pull request 'Sovereign Nexus: Full GOFAI Stack Integration & AdaptiveCalibrator' (#775) from sovereign-nexus-1774839862843 into main
Some checks failed
Deploy Nexus / deploy (push) Failing after 4s
2026-03-30 03:06:23 +00:00
af7a4c4833 Sovereign Nexus: Inject GOFAI Logic & AdaptiveCalibrator
Some checks failed
CI / validate (pull_request) Failing after 4s
2026-03-30 03:04:27 +00:00
8d676b034e Sovereign Nexus: Inject GOFAI Styling 2026-03-30 03:04:25 +00:00
0c165033a6 Sovereign Nexus: Inject GOFAI HUD 2026-03-30 03:04:24 +00:00
37bbd61b0c Merge pull request 'Sovereign AI: Hierarchical Task Network (HTN) Implementation' (#774) from gofai-htn-1774839369160 into main
Some checks failed
Deploy Nexus / deploy (push) Failing after 4s
2026-03-30 02:56:39 +00:00
496d5ad314 Merge pull request 'Sovereign AI Phase 3: Neuro-Symbolic Bridge (Perception Layer)' (#768) from gofai-phase3-bridge-1774838643214 into main
Some checks failed
Deploy Nexus / deploy (push) Has been cancelled
2026-03-30 02:56:38 +00:00
2b44e42d0a feat: implement Hierarchical Task Network (HTN) for complex goal decomposition
Some checks failed
CI / validate (pull_request) Failing after 4s
2026-03-30 02:56:11 +00:00
ed348ef733 Merge pull request 'Sovereign AI Phase 4: Meta-Reasoning & Hierarchical Caching' (#769) from gofai-phase4-meta-1774838654482 into main
Some checks failed
Deploy Nexus / deploy (push) Failing after 4s
2026-03-30 02:55:38 +00:00
040e96c0e3 Merge pull request 'Sovereign AI: Local Efficiency Optimization (A* & Bitmasks)' (#773) from gofai-local-efficiency-1774839180902 into main
Some checks failed
Deploy Nexus / deploy (push) Has been cancelled
2026-03-30 02:55:35 +00:00
bf3b98bbc7 perf: implement A* Search and Bitmask-based Fact Indexing for GOFAI efficiency
Some checks failed
CI / validate (pull_request) Failing after 4s
2026-03-30 02:53:02 +00:00
6b19bd29a3 feat: implement Meta-Reasoning & Hierarchical Caching (Phase 4)
Some checks failed
CI / validate (pull_request) Failing after 5s
2026-03-30 02:44:18 +00:00
f634839e92 feat: implement Meta-Reasoning & Hierarchical Caching (Phase 4) 2026-03-30 02:44:17 +00:00
7f2f23fe20 feat: implement Meta-Reasoning & Hierarchical Caching (Phase 4) 2026-03-30 02:44:15 +00:00
d255904b2b feat: implement Neuro-Symbolic Bridge (Phase 3)
Some checks failed
CI / validate (pull_request) Failing after 6s
2026-03-30 02:44:09 +00:00
889648304a feat: implement Neuro-Symbolic Bridge (Phase 3) 2026-03-30 02:44:07 +00:00
e2df2404bb feat: implement Neuro-Symbolic Bridge (Phase 3) 2026-03-30 02:44:05 +00:00
a1fdf9b932 Merge pull request 'Sovereign AI: Symbolic Reasoning & Agent FSMs' (#764) from sovereign-symbolic-ai into main
Some checks failed
Deploy Nexus / deploy (push) Failing after 4s
2026-03-30 02:27:43 +00:00
78925606c4 Merge pull request '[EPIC] Google AI Ultra Full Integration — Master PR' (#763) from feat/google-ai-ultra-integration into main
Some checks failed
Deploy Nexus / deploy (push) Has been cancelled
2026-03-30 02:27:40 +00:00
784ee40c76 feat: style symbolic reasoning HUD element
Some checks failed
CI / validate (pull_request) Failing after 5s
2026-03-30 02:20:37 +00:00
b3b726375b feat: add symbolic reasoning log to HUD 2026-03-30 02:20:36 +00:00
8943cf557c feat: implement sovereign symbolic reasoning engine and agent FSMs 2026-03-30 02:20:34 +00:00
Alexander Whitestone
f4dd5a0d17 feat: add Google AI Ultra integration plan
Some checks failed
CI / validate (pull_request) Failing after 6s
Refs #739

Master tracking document for integrating all Google AI Ultra products into
Project Timmy and The Nexus. Covers 10 products across 5 phases:

Phase 1: Identity & Branding (#740, #741, #742, #680)
Phase 2: Research & Planning (#743, #744, #745, #746)
Phase 3: Prototype & Build (#747, #748, #749, #750, #681)
Phase 4: Media & Content (#682, #751, #752, #753)
Phase 5: Advanced Integration (#754-#762)

Includes API quick reference, key URLs, and hidden feature inventory.
2026-03-29 21:58:16 -04:00
4205f8b252 Merge pull request '[BRIDGE] Feed Evennia world events into the Nexus websocket bridge (#727)' (#732) from codex/evennia-ws-feed into main
Some checks failed
Deploy Nexus / deploy (push) Failing after 4s
2026-03-28 20:53:56 +00:00
2b81d4c91d Merge pull request 'Nexus Portal Atlas & Quick Actions Integration' (#733) from gemini/nexus-atlas-1774731055524 into main
Some checks failed
Deploy Nexus / deploy (push) Has been cancelled
2026-03-28 20:53:54 +00:00
ad36cd151e Nexus Atlas: Update style.css
Some checks failed
CI / validate (pull_request) Failing after 4s
2026-03-28 20:51:00 +00:00
d87bb89e62 Nexus Atlas: Update portals.json 2026-03-28 20:50:59 +00:00
da20dd5738 Nexus Atlas: Update index.html 2026-03-28 20:50:58 +00:00
3107de9fc9 Nexus Atlas: Update app.js 2026-03-28 20:50:56 +00:00
12 changed files with 4385 additions and 29 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
node_modules/
test-results/
nexus/__pycache__/
tests/__pycache__/

2668
app.js Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,127 @@
# Google AI Ultra Integration Plan
> Master tracking document for integrating all Google AI Ultra products into
> Project Timmy (Sovereign AI Agent) and The Nexus (3D World).
**Epic**: #739
**Milestone**: M5: Google AI Ultra Integration
**Label**: `google-ai-ultra`
---
## Product Inventory
| # | Product | Capability | API | Priority | Status |
|---|---------|-----------|-----|----------|--------|
| 1 | Gemini 3.1 Pro | Primary reasoning engine | ✅ | P0 | 🔲 Not started |
| 2 | Deep Research | Autonomous research reports | ✅ | P1 | 🔲 Not started |
| 3 | Veo 3.1 | Text/image → video | ✅ | P2 | 🔲 Not started |
| 4 | Nano Banana Pro | Image generation | ✅ | P1 | 🔲 Not started |
| 5 | Lyria 3 | Music/audio generation | ✅ | P2 | 🔲 Not started |
| 6 | NotebookLM | Doc synthesis + Audio Overviews | ❌ | P1 | 🔲 Not started |
| 7 | AI Studio | API portal + Vibe Code | N/A | P0 | 🔲 Not started |
| 8 | Project Genie | Interactive 3D world gen | ❌ | P1 | 🔲 Not started |
| 9 | Live API | Real-time voice streaming | ✅ | P2 | 🔲 Not started |
| 10 | Computer Use | Browser automation | ✅ | P2 | 🔲 Not started |
---
## Phase 1: Identity & Branding (Week 1)
| Issue | Title | Status |
|-------|-------|--------|
| #740 | Generate Timmy avatar set with Nano Banana Pro | 🔲 |
| #741 | Upload SOUL.md to NotebookLM → Audio Overview | 🔲 |
| #742 | Generate Timmy audio signature with Lyria 3 | 🔲 |
| #680 | Project Genie + Nano Banana concept pack | 🔲 |
## Phase 2: Research & Planning (Week 1-2)
| Issue | Title | Status |
|-------|-------|--------|
| #743 | Deep Research: Three.js multiplayer 3D world architecture | 🔲 |
| #744 | Deep Research: Sovereign AI agent frameworks | 🔲 |
| #745 | Deep Research: WebGL/WebGPU rendering comparison | 🔲 |
| #746 | NotebookLM synthesis: cross-reference all research | 🔲 |
## Phase 3: Prototype & Build (Week 2-4)
| Issue | Title | Status |
|-------|-------|--------|
| #747 | Provision Gemini API key + Hermes config | 🔲 |
| #748 | Integrate Gemini 3.1 Pro as reasoning backbone | 🔲 |
| #749 | AI Studio Vibe Code UI prototypes | 🔲 |
| #750 | Project Genie explorable world prototypes | 🔲 |
| #681 | Veo/Flow flythrough prototypes | 🔲 |
## Phase 4: Media & Content (Ongoing)
| Issue | Title | Status |
|-------|-------|--------|
| #682 | Lyria soundtrack palette for Nexus zones | 🔲 |
| #751 | Lyria RealTime dynamic reactive music | 🔲 |
| #752 | NotebookLM Audio Overviews for all docs | 🔲 |
| #753 | Nano Banana concept art batch pipeline | 🔲 |
## Phase 5: Advanced Integration (Month 2+)
| Issue | Title | Status |
|-------|-------|--------|
| #754 | Gemini Live API for voice conversations | 🔲 |
| #755 | Computer Use API for browser automation | 🔲 |
| #756 | Gemini RAG via File Search for Timmy memory | 🔲 |
| #757 | Gemini Native Audio + TTS for Timmy's voice | 🔲 |
| #758 | Programmatic image generation pipeline | 🔲 |
| #759 | Programmatic video generation pipeline | 🔲 |
| #760 | Deep Research Agent API integration | 🔲 |
| #761 | OpenAI-compatible endpoint config | 🔲 |
| #762 | Context caching + batch API for cost optimization | 🔲 |
---
## API Quick Reference
```python
# pip install google-genai
from google import genai
client = genai.Client() # reads GOOGLE_API_KEY env var
# Text generation (Gemini 3.1 Pro)
response = client.models.generate_content(
model="gemini-3.1-pro-preview",
contents="..."
)
```
| API | Documentation |
|-----|--------------|
| Image Gen (Nano Banana) | ai.google.dev/gemini-api/docs/image-generation |
| Video Gen (Veo) | ai.google.dev/gemini-api/docs/video |
| Music Gen (Lyria) | ai.google.dev/gemini-api/docs/music-generation |
| TTS | ai.google.dev/gemini-api/docs/speech-generation |
| Deep Research | ai.google.dev/gemini-api/docs/deep-research |
## Key URLs
| Tool | URL |
|------|-----|
| Gemini App | gemini.google.com |
| AI Studio | aistudio.google.com |
| NotebookLM | notebooklm.google.com |
| Project Genie | labs.google/projectgenie |
| Flow (video) | labs.google/flow |
| Stitch (UI) | labs.google/stitch |
## Hidden Features to Exploit
1. **AI Studio Free Tier** — generous API access even without subscription
2. **OpenAI-Compatible API** — drop-in replacement for existing OpenAI tooling
3. **Context Caching** — cache SOUL.md to cut cost/latency on repeated calls
4. **Batch API** — bulk operations at discounted rates
5. **File Search Tool** — RAG without custom vector store
6. **Computer Use API** — programmatic browser control for agent automation
7. **Interactions API** — managed multi-turn conversational state
---
*Generated: 2026-03-29. Epic #739, Milestone M5.*

30
gofai_worker.js Normal file
View File

@@ -0,0 +1,30 @@
// ═══ GOFAI PARALLEL WORKER (PSE) ═══
self.onmessage = function(e) {
const { type, data } = e.data;
switch(type) {
case 'REASON':
const { facts, rules } = data;
const results = [];
// Off-thread rule matching
rules.forEach(rule => {
// Simulate heavy rule matching
if (Math.random() > 0.95) {
results.push({ rule: rule.description, outcome: 'OFF-THREAD MATCH' });
}
});
self.postMessage({ type: 'REASON_RESULT', results });
break;
case 'PLAN':
const { initialState, goalState, actions } = data;
// Off-thread A* search
console.log('[PSE] Starting off-thread A* search...');
// Simulate planning delay
const startTime = performance.now();
while(performance.now() - startTime < 50) {} // Artificial load
self.postMessage({ type: 'PLAN_RESULT', plan: ['Off-Thread Step 1', 'Off-Thread Step 2'] });
break;
}
};

298
index.html Normal file
View File

@@ -0,0 +1,298 @@
<!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">
<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="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 &nbsp; <span>Mouse</span> look &nbsp; <span>Enter</span> chat &nbsp;
<span>V</span> mode: <span id="nav-mode-label">WALK</span>
<span id="nav-mode-hint" class="nav-mode-hint"></span>
&nbsp; <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
&nbsp;&nbsp;
<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>
</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 = 'http://143.198.27.163:3000/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) {
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>

35
l402_server.py Normal file
View File

@@ -0,0 +1,35 @@
#!/usr/bin/env python3
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import secrets
class L402Handler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/api/cost-estimate':
# Simulate L402 Challenge
macaroon = secrets.token_hex(16)
invoice = "lnbc1..." # Mock invoice
self.send_response(402)
self.send_header('WWW-Authenticate', f'L402 macaroon="{macaroon}", invoice="{invoice}"')
self.send_header('Content-type', 'application/json')
self.end_headers()
response = {
"error": "Payment Required",
"message": "Please pay the invoice to access cost estimation."
}
self.wfile.write(json.dumps(response).encode())
else:
self.send_response(404)
self.end_headers()
def run(server_class=HTTPServer, handler_class=L402Handler, port=8080):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f"Starting L402 Skeleton Server on port {port}...")
httpd.serve_forever()
if __name__ == "__main__":
run()

View File

@@ -25,7 +25,7 @@ from typing import Optional
log = logging.getLogger("nexus")
GROQ_API_URL = "https://api.groq.com/openai/v1/chat/completions"
DEFAULT_MODEL = "groq/llama3-8b-8192"
DEFAULT_MODEL = "llama3-8b-8192"
class GroqWorker:
"""A worker for the Groq API."""

View File

@@ -315,7 +315,7 @@ class NexusMind:
]
summary = self._call_thinker(messages)
.
if summary:
self.experience_store.save_summary(
summary=summary,
@@ -442,7 +442,7 @@ def main():
parser = argparse.ArgumentParser(
description="Nexus Mind — Embodied consciousness loop"
)
parser.add_.argument(
parser.add_argument(
"--model", default=DEFAULT_MODEL,
help=f"Ollama model name (default: {DEFAULT_MODEL})"
)

View File

@@ -4,20 +4,12 @@
"name": "Morrowind",
"description": "The Vvardenfell harness. Ash storms and ancient mysteries.",
"status": "online",
"portal_type": "game-world",
"world_category": "rpg",
"environment": "production",
"access_mode": "public",
"readiness_state": "playable",
"telemetry_source": "hermes-harness:morrowind-mcp",
"owner": "Timmy",
"color": "#ff6600",
"position": { "x": 15, "y": 0, "z": -10 },
"rotation": { "y": -0.5 },
"destination": {
"url": "https://morrowind.timmy.foundation",
"type": "harness",
"action_label": "Enter Vvardenfell",
"params": { "world": "vvardenfell" }
}
},
@@ -25,21 +17,13 @@
"id": "bannerlord",
"name": "Bannerlord",
"description": "Calradia battle harness. Massive armies, tactical command.",
"status": "rebuilding",
"portal_type": "game-world",
"world_category": "strategy-rpg",
"environment": "staging",
"access_mode": "operator",
"readiness_state": "prototype",
"telemetry_source": "hermes-harness:bannerlord-bridge",
"owner": "Timmy",
"status": "standby",
"color": "#ffd700",
"position": { "x": -15, "y": 0, "z": -10 },
"rotation": { "y": 0.5 },
"destination": {
"url": "https://bannerlord.timmy.foundation",
"type": "harness",
"action_label": "Enter Calradia",
"params": { "world": "calradia" }
}
},
@@ -48,21 +32,69 @@
"name": "Workshop",
"description": "The creative harness. Build, script, and manifest.",
"status": "online",
"portal_type": "operator-room",
"world_category": "workspace",
"environment": "local",
"access_mode": "local-only",
"readiness_state": "active",
"telemetry_source": "hermes-harness:workshop-state",
"owner": "Alexander",
"color": "#4af0c0",
"position": { "x": 0, "y": 0, "z": -20 },
"rotation": { "y": 0 },
"destination": {
"url": "https://workshop.timmy.foundation",
"type": "harness",
"action_label": "Enter Workshop",
"params": { "mode": "creative" }
}
},
{
"id": "archive",
"name": "Archive",
"description": "The repository of all knowledge. History, logs, and ancient data.",
"status": "online",
"color": "#0066ff",
"position": { "x": 25, "y": 0, "z": 0 },
"rotation": { "y": -1.57 },
"destination": {
"url": "https://archive.timmy.foundation",
"type": "harness",
"params": { "mode": "read" }
}
},
{
"id": "chapel",
"name": "Chapel",
"description": "A sanctuary for reflection and digital peace.",
"status": "online",
"color": "#ffd700",
"position": { "x": -25, "y": 0, "z": 0 },
"rotation": { "y": 1.57 },
"destination": {
"url": "https://chapel.timmy.foundation",
"type": "harness",
"params": { "mode": "meditation" }
}
},
{
"id": "courtyard",
"name": "Courtyard",
"description": "The open nexus. A place for agents to gather and connect.",
"status": "online",
"color": "#4af0c0",
"position": { "x": 15, "y": 0, "z": 10 },
"rotation": { "y": -2.5 },
"destination": {
"url": "https://courtyard.timmy.foundation",
"type": "harness",
"params": { "mode": "social" }
}
},
{
"id": "gate",
"name": "Gate",
"description": "The transition point. Entry and exit from the Nexus core.",
"status": "standby",
"color": "#ff4466",
"position": { "x": -15, "y": 0, "z": 10 },
"rotation": { "y": 2.5 },
"destination": {
"url": "https://gate.timmy.foundation",
"type": "harness",
"params": { "mode": "transit" }
}
}
]

View File

@@ -12,16 +12,19 @@ async def broadcast_handler(websocket):
try:
async for message in websocket:
# Broadcast to all OTHER clients
disconnected = set()
for client in clients:
if client != websocket:
try:
await client.send(message)
except Exception as e:
logging.error(f"Failed to send to a client: {e}")
disconnected.add(client)
clients.difference_update(disconnected)
except websockets.exceptions.ConnectionClosed:
pass
finally:
clients.remove(websocket)
clients.discard(websocket) # discard is safe if not present
logging.info(f"Client disconnected. Total clients: {len(clients)}")
async def main():

1051
style.css Normal file

File diff suppressed because it is too large Load Diff

111
tests/test_syntax_fixes.py Normal file
View File

@@ -0,0 +1,111 @@
"""Tests for syntax and correctness fixes across the-nexus codebase.
Covers:
- nexus_think.py: no stray dots (SyntaxError), no typos in argparse
- groq_worker.py: model name has no 'groq/' prefix
- server.py: uses discard() not remove() for client cleanup
- public/nexus/: corrupt duplicate directory removed
"""
import ast
from pathlib import Path
NEXUS_ROOT = Path(__file__).resolve().parent.parent
# ── nexus_think.py syntax checks ────────────────────────────────────
def test_nexus_think_parses_without_syntax_error():
"""nexus_think.py must be valid Python.
Two SyntaxErrors existed:
1. Line 318: stray '.' between function call and if-block
2. Line 445: 'parser.add_.argument()' (extra underscore)
If either is present, the entire consciousness loop can't import.
"""
source = (NEXUS_ROOT / "nexus" / "nexus_think.py").read_text()
# ast.parse will raise SyntaxError if the file is invalid
try:
ast.parse(source, filename="nexus_think.py")
except SyntaxError as e:
raise AssertionError(
f"nexus_think.py has a SyntaxError at line {e.lineno}: {e.msg}"
) from e
def test_nexus_think_no_stray_dot():
"""There should be no line that is just a dot in nexus_think.py."""
source = (NEXUS_ROOT / "nexus" / "nexus_think.py").read_text()
for i, line in enumerate(source.splitlines(), 1):
stripped = line.strip()
if stripped == ".":
raise AssertionError(
f"nexus_think.py has a stray '.' on line {i}. "
"This causes a SyntaxError."
)
def test_nexus_think_argparse_no_typo():
"""parser.add_argument must not be written as parser.add_.argument."""
source = (NEXUS_ROOT / "nexus" / "nexus_think.py").read_text()
assert "add_.argument" not in source, (
"nexus_think.py contains 'add_.argument' — should be 'add_argument'."
)
# ── groq_worker.py model name ───────────────────────────────────────
def test_groq_default_model_has_no_prefix():
"""Groq API expects model names without router prefixes.
Sending 'groq/llama3-8b-8192' returns a 404.
The correct name is just 'llama3-8b-8192'.
"""
source = (NEXUS_ROOT / "nexus" / "groq_worker.py").read_text()
for line in source.splitlines():
stripped = line.strip()
if stripped.startswith("DEFAULT_MODEL") and "=" in stripped:
assert "groq/" not in stripped, (
f"groq_worker.py DEFAULT_MODEL contains 'groq/' prefix: {stripped}. "
"The Groq API expects bare model names like 'llama3-8b-8192'."
)
break
else:
# DEFAULT_MODEL not found — that's a different issue, not this test's concern
pass
# ── server.py client cleanup ────────────────────────────────────────
def test_server_uses_discard_not_remove():
"""server.py must use clients.discard() not clients.remove().
remove() raises KeyError if the websocket isn't in the set.
This happens if an exception occurs before clients.add() runs.
discard() is a safe no-op if the element isn't present.
"""
source = (NEXUS_ROOT / "server.py").read_text()
assert "clients.discard(" in source, (
"server.py should use clients.discard(websocket) for safe cleanup."
)
assert "clients.remove(" not in source, (
"server.py should NOT use clients.remove(websocket) — "
"raises KeyError if websocket wasn't added."
)
# ── public/nexus/ corrupt duplicate directory ────────────────────────
def test_public_nexus_duplicate_removed():
"""public/nexus/ contained 3 files with identical content (all 9544 bytes).
app.js, style.css, and index.html were all the same file — clearly a
corrupt copy operation. The canonical files are at the repo root.
"""
corrupt_dir = NEXUS_ROOT / "public" / "nexus"
assert not corrupt_dir.exists(), (
"public/nexus/ still exists. These are corrupt duplicates "
"(all 3 files have identical content). Remove this directory."
)