Files
lucidia-core/sanctum.py
Alexa Louise 6afdb4b148 Initial extraction from blackroad-prism-console
Lucidia Core - AI reasoning engines for specialized domains:
- Physicist (867 lines) - energy modeling, force calculations
- Mathematician (760 lines) - symbolic computation, proofs
- Geologist (654 lines) - terrain modeling, stratigraphy
- Engineer (599 lines) - structural analysis, optimization
- Painter (583 lines) - visual generation, graphics
- Chemist (569 lines) - molecular analysis, reactions
- Analyst (505 lines) - pattern recognition, insights
- Plus: architect, researcher, mediator, speaker, poet, navigator

Features:
- FastAPI wrapper with REST endpoints for each agent
- CLI with `lucidia list`, `lucidia run`, `lucidia api`
- Codex YAML configurations for agent personalities
- Quantum engine extensions

12,512 lines of Python across 91 files.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 08:00:53 -06:00

83 lines
2.3 KiB
Python

#!/usr/bin/env python3
"""
Sanctum — Fullscreen Ritual Shell
Provides a minimal curses-based UI that displays real-time events,
contradiction pings, and allows the operator to perform rituals such as
acknowledging daily awaken codes. It integrates with Gamma to monitor the
events log.
This is intentionally simple and can be expanded into a full TUI application.
"""
import curses
import time
from pathlib import Path
from typing import List
STATE_DIR = Path("/srv/lucidia/state")
EVENT_LOG_PATH = STATE_DIR / "events.log"
CONTRA_PATH = STATE_DIR / "contradictions.log"
def tail_file(path: Path, last_pos: int) -> (List[str], int):
"""Read new lines from a file since the last position."""
if not path.exists():
return [], last_pos
with open(path, "r", encoding="utf-8") as f:
f.seek(last_pos)
lines = f.readlines()
last_pos = f.tell()
return [line.rstrip("\n") for line in lines], last_pos
def draw_screen(stdscr):
curses.curs_set(0)
stdscr.nodelay(True)
height, width = stdscr.getmaxyx()
event_pos = 0
contra_pos = 0
events: List[str] = []
contras: List[str] = []
while True:
# Read new events
new_events, event_pos = tail_file(EVENT_LOG_PATH, event_pos)
events.extend(new_events)
if len(events) > 100:
events = events[-100:]
# Read new contradictions
new_contras, contra_pos = tail_file(CONTRA_PATH, contra_pos)
contras.extend(new_contras)
if len(contras) > 100:
contras = contras[-100:]
stdscr.clear()
stdscr.addstr(0, 0, "Sanctum - Lucidia Ritual Shell (press 'q' to quit)")
stdscr.addstr(2, 0, "Events:")
for i, line in enumerate(reversed(events[-(height // 2 - 3) :])):
stdscr.addstr(3 + i, 2, line[: width - 4])
offset = height // 2
stdscr.addstr(offset, 0, "Contradictions:")
for i, line in enumerate(reversed(contras[-(height - offset - 2) :])):
stdscr.addstr(offset + 1 + i, 2, line[: width - 4])
stdscr.refresh()
time.sleep(1.0)
try:
ch = stdscr.getch()
if ch == ord("q"):
break
except Exception:
pass
def main():
curses.wrapper(draw_screen)
if __name__ == "__main__":
main()