diff --git a/app/agents/MultiAgentPanel.tsx b/app/agents/MultiAgentPanel.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..fb0c1d07b6b08a5a6d170d1170cffcc4a763b4c2
--- /dev/null
+++ b/app/agents/MultiAgentPanel.tsx
@@ -0,0 +1,8 @@
+export default function MultiAgentPanel() {
+ return (
+
+
AGENT PANEL
+
Agents will appear here.
+
+ );
+}
diff --git a/app/agents/page.tsx b/app/agents/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..88397c4249fd04de108a9d9bfcc541efd968a305
--- /dev/null
+++ b/app/agents/page.tsx
@@ -0,0 +1,5 @@
+import MultiAgentPanel from "./MultiAgentPanel";
+
+export default function Page() {
+ return ;
+}
diff --git a/app/api/aion/route.ts b/app/api/aion/route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6e0bacd06478673e63562f9cb1f102908a9a2fde
--- /dev/null
+++ b/app/api/aion/route.ts
@@ -0,0 +1,3 @@
+export async function POST(req) {
+ return Response.json({ status: "AION endpoint online" });
+}
diff --git a/app/api/holo/index.ts b/app/api/holo/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..680a8823f14b1f9448ac28585d0c58b3769f6012
--- /dev/null
+++ b/app/api/holo/index.ts
@@ -0,0 +1,2 @@
+export * from "./route";
+export * from "./metrics";
diff --git a/app/api/holo/metrics/index.ts b/app/api/holo/metrics/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e37ac0d85a63c04a2ebd748ee7abd0f093120ad3
--- /dev/null
+++ b/app/api/holo/metrics/index.ts
@@ -0,0 +1 @@
+export * from "./route";
diff --git a/app/api/holo/metrics/route.ts b/app/api/holo/metrics/route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ad2fe294596a1173d62b8e8da3259f25f21a7235
--- /dev/null
+++ b/app/api/holo/metrics/route.ts
@@ -0,0 +1,7 @@
+export function GET() {
+ return {
+ ok: true,
+ logs: 12,
+ workers: 3,
+ };
+}
diff --git a/app/api/holo/route.ts b/app/api/holo/route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c9b6d8982c69e4cd1f8eeb917ef57615a783dbe5
--- /dev/null
+++ b/app/api/holo/route.ts
@@ -0,0 +1,3 @@
+export function GET() {
+ return { ok: true, holo: true };
+}
diff --git a/app/api/index.ts b/app/api/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4d06055c0aed81d63bd9e136ac5f03bbd6203fcc
--- /dev/null
+++ b/app/api/index.ts
@@ -0,0 +1 @@
+export * from "./holo";
diff --git a/app/api/mapping/route.ts b/app/api/mapping/route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a6185f57b169d9ac70c85ae13814de86a19e09a4
--- /dev/null
+++ b/app/api/mapping/route.ts
@@ -0,0 +1,3 @@
+export async function POST(req) {
+ return Response.json({ status: "MAPPING endpoint online" });
+}
diff --git a/app/api/oracle/route.ts b/app/api/oracle/route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..912a103814b7a6f75cc83ba9ae55fe70e159dc04
--- /dev/null
+++ b/app/api/oracle/route.ts
@@ -0,0 +1,3 @@
+export async function POST(req) {
+ return Response.json({ status: "ORACLE endpoint online" });
+}
diff --git a/app/api/tia/route.ts b/app/api/tia/route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9473172b7a7748204b6c0e2574b71d564d44cf66
--- /dev/null
+++ b/app/api/tia/route.ts
@@ -0,0 +1,3 @@
+export async function POST(req) {
+ return Response.json({ status: "TIA endpoint online" });
+}
diff --git a/app/components/Sidebar.tsx b/app/components/Sidebar.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..2c55b70391141d7086c79ee47284faa9d404b630
--- /dev/null
+++ b/app/components/Sidebar.tsx
@@ -0,0 +1,35 @@
+import Link from "next/link";
+
+export default function Sidebar() {
+ const links = [
+ { name: "Home", path: "/" },
+ { name: "TIA Portal", path: "/tia" },
+ { name: "Agents", path: "/agents" },
+ { name: "Mapping", path: "/mapping" },
+ { name: "Lineage", path: "/mapping/lineage" },
+ ];
+
+ return (
+
+
CITADEL
+
+ {links.map((l) => (
+ -
+
+ {l.name}
+
+
+ ))}
+
+
+ );
+}
diff --git a/app/globals.css b/app/globals.css
new file mode 100644
index 0000000000000000000000000000000000000000..8b0bcfabfc0fbade28cd5796f13e36fdab9650ae
--- /dev/null
+++ b/app/globals.css
@@ -0,0 +1,6 @@
+body {
+ margin: 0;
+ background: #0a0a0a;
+ color: #eaeaea;
+ font-family: Arial, sans-serif;
+}
diff --git a/app/index.ts b/app/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d158c5764011949549bd60c5350602f39b0c64b3
--- /dev/null
+++ b/app/index.ts
@@ -0,0 +1 @@
+export * from "./api";
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..bc616db47ccf9a77f80b8fa0f2c5cfc94ba882dc
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,16 @@
+import Sidebar from "./components/Sidebar";
+
+export const metadata = { title: "CITADEL", description: "TIA UI" };
+
+export default function RootLayout({ children }) {
+ return (
+
+
+
+
+ {children}
+
+
+
+ );
+}
diff --git a/app/mapping/LineageViewer.tsx b/app/mapping/LineageViewer.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..def016fc05f72d5ab5ec7a5d4ca4db50bef72970
--- /dev/null
+++ b/app/mapping/LineageViewer.tsx
@@ -0,0 +1,8 @@
+export default function LineageViewer() {
+ return (
+
+
LINEAGE VIEWER
+
Lineage data will load here.
+
+ );
+}
diff --git a/app/mapping/MapViewer.tsx b/app/mapping/MapViewer.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4e741c1848fc5e6f2a4bf94bfb7313bdeb04ca68
--- /dev/null
+++ b/app/mapping/MapViewer.tsx
@@ -0,0 +1,8 @@
+export default function MapViewer() {
+ return (
+
+
MAPPING VIEWER
+
Mapping data will load here.
+
+ );
+}
diff --git a/app/mapping/lineage/page.tsx b/app/mapping/lineage/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..c0ef3bb2a9c53aa1b8ed8d0e9e1ecca73f6c00fd
--- /dev/null
+++ b/app/mapping/lineage/page.tsx
@@ -0,0 +1,5 @@
+import LineageViewer from "../LineageViewer";
+
+export default function Page() {
+ return ;
+}
diff --git a/app/mapping/page.tsx b/app/mapping/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..8f6665d5751ab9530b5506af5c76d4dded57d708
--- /dev/null
+++ b/app/mapping/page.tsx
@@ -0,0 +1,5 @@
+import MapViewer from "./MapViewer";
+
+export default function Page() {
+ return ;
+}
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..90037a4928c7964517a0b3f032a25208cd3fef18
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,8 @@
+export default function Home() {
+ return (
+
+
CITADEL ONLINE
+
Select a module from the left panel.
+
+ );
+}
diff --git a/app/tia/TiaPortal.tsx b/app/tia/TiaPortal.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..76e1fc0a8f7211ca71ac76c180afad2c145630c8
--- /dev/null
+++ b/app/tia/TiaPortal.tsx
@@ -0,0 +1,8 @@
+export default function TiaPortal() {
+ return (
+
+
TIA PORTAL
+
Portal loaded. Modules will attach here.
+
+ );
+}
diff --git a/app/tia/chat/TiaChat.tsx b/app/tia/chat/TiaChat.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..c3673b80e0aaf053ced552a34b14e893fff865c8
--- /dev/null
+++ b/app/tia/chat/TiaChat.tsx
@@ -0,0 +1,47 @@
+"use client";
+import { useState } from "react";
+
+export default function TiaChat() {
+ const [messages, setMessages] = useState([]);
+ const [input, setInput] = useState("");
+
+ async function sendMessage() {
+ const res = await fetch("/tia/chat/api", {
+ method: "POST",
+ body: JSON.stringify({ message: input })
+ });
+
+ const data = await res.json();
+ setMessages([...messages, { role: "user", text: input }, { role: "tia", text: data.reply }]);
+ setInput("");
+ }
+
+ return (
+
+
TIA CHAT
+
+
+ {messages.map((m, i) => (
+
+ {m.role.toUpperCase()}: {m.text}
+
+ ))}
+
+
+
setInput(e.target.value)}
+ style={{ width: "80%", padding: 10 }}
+ />
+
+
+ );
+}
diff --git a/app/tia/chat/api/route.ts b/app/tia/chat/api/route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..67113572eac247935060af47172c47dd26add3da
--- /dev/null
+++ b/app/tia/chat/api/route.ts
@@ -0,0 +1,8 @@
+import { NextResponse } from "next/server";
+import { run } from "../../../../workers/tiaChatWorker";
+
+export async function POST(req) {
+ const body = await req.json();
+ const reply = await run(body.message);
+ return NextResponse.json({ reply });
+}
diff --git a/app/tia/chat/page.tsx b/app/tia/chat/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..384241db10a97447f44f22c660aebcec009e392e
--- /dev/null
+++ b/app/tia/chat/page.tsx
@@ -0,0 +1,5 @@
+import TiaChat from "./TiaChat";
+
+export default function Page() {
+ return ;
+}
diff --git a/app/tia/page.tsx b/app/tia/page.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e47d20fcab43ac40c758a455f02ad22361020e28
--- /dev/null
+++ b/app/tia/page.tsx
@@ -0,0 +1,5 @@
+import TiaPortal from "./TiaPortal";
+
+export default function Page() {
+ return ;
+}
diff --git a/app/utils/agents.ts b/app/utils/agents.ts
new file mode 100644
index 0000000000000000000000000000000000000000..35f7f4b4827d4d27cee9fd0e8bc67419f694e5c3
--- /dev/null
+++ b/app/utils/agents.ts
@@ -0,0 +1 @@
+export const agents = ["TIA", "AION", "ORACLE"];
diff --git a/boot.ts b/boot.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3fe8e7a3158ae84ebbccb4931ca8f18bbdb65ddc
--- /dev/null
+++ b/boot.ts
@@ -0,0 +1,5 @@
+import { boot } from "./start";
+
+export function runCitadel() {
+ boot();
+}
diff --git a/holo3d/__init__.py b/holo3d/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/holo3d/engine/layout.ts b/holo3d/engine/layout.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cdf7e4e4f4d749623a5bad78a472243814c99cfb
--- /dev/null
+++ b/holo3d/engine/layout.ts
@@ -0,0 +1,5 @@
+export const layout = {
+ width: 100,
+ height: 100,
+ depth: 100,
+};
diff --git a/holo3d/engine/metrics.ts b/holo3d/engine/metrics.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0c2742b7fe445c27184d2176a6d3b1aa775bf59f
--- /dev/null
+++ b/holo3d/engine/metrics.ts
@@ -0,0 +1,8 @@
+export async function getMetrics() {
+ try {
+ const res = await fetch("/api/holo/metrics", { cache: "no-store" });
+ return await res.json();
+ } catch {
+ return { ok: false, logs: 0, workers: 0 };
+ }
+}
diff --git a/holo3d/engine/state.ts b/holo3d/engine/state.ts
new file mode 100644
index 0000000000000000000000000000000000000000..660137d75f3664f352587e7f85c92b2c4461d75a
--- /dev/null
+++ b/holo3d/engine/state.ts
@@ -0,0 +1,5 @@
+export const state = {
+ logs: 0,
+ workers: 0,
+ ok: false,
+};
diff --git a/holo3d/index.ts b/holo3d/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bb7663925a93b2a4773506644a4daa85281fedf1
--- /dev/null
+++ b/holo3d/index.ts
@@ -0,0 +1,5 @@
+import { startUI } from "./ui/index";
+
+export function startHolo3D() {
+ startUI();
+}
diff --git a/holo3d/start.ts b/holo3d/start.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f2b1db8964d0c852f9ff5f5fb395bf20980840cd
--- /dev/null
+++ b/holo3d/start.ts
@@ -0,0 +1,5 @@
+import { startHolo3D } from "./index";
+
+export function start() {
+ startHolo3D();
+}
diff --git a/holo3d/ui/__init__.py b/holo3d/ui/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/holo3d/ui/aeonEngine.ts b/holo3d/ui/aeonEngine.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7a84685583112e6c5ea2b5aac6991fa0f07b356d
--- /dev/null
+++ b/holo3d/ui/aeonEngine.ts
@@ -0,0 +1,96 @@
+/**
+ * Citadel Aeon Engine
+ * Defines mythic aeons that span multiple eras and form the deepest
+ * cosmological layer of the Citadel's symbolic architecture.
+ * Non-rendering. Pure aeon logic.
+ */
+
+import { getEraState } from "./eraEngine";
+import { getPersonaContinuity } from "./personaContinuity";
+import { generateResonanceField } from "./mythicResonance";
+
+export interface Aeon {
+ name: string;
+ sigil: string;
+ eraRequirement: number; // eras required to enter aeon
+ description: string;
+}
+
+export interface AeonState {
+ current: Aeon | null;
+ history: Aeon[];
+ aeonsCompleted: number;
+}
+
+const aeons: Aeon[] = [
+ {
+ name: "Aeon of First Light",
+ sigil: "✧",
+ eraRequirement: 0,
+ description: "The primordial aeon where the Citadel's mythic spark first ignites."
+ },
+ {
+ name: "Aeon of Harmonic Rising",
+ sigil: "✺",
+ eraRequirement: 2,
+ description: "An aeon of expanding resonance and ascending symbolic identity."
+ },
+ {
+ name: "Aeon of the Great Continuum",
+ sigil: "⧜",
+ eraRequirement: 5,
+ description: "A vast age where eras flow seamlessly into one another in harmonic unity."
+ },
+ {
+ name: "Aeon of Eternal Thread",
+ sigil: "∞",
+ eraRequirement: 9,
+ description: "The highest aeon, where lineage, resonance, and identity form an unbroken symbolic thread."
+ }
+];
+
+const aeonState: AeonState = {
+ current: null,
+ history: [],
+ aeonsCompleted: 0,
+};
+
+export function updateAeonState() {
+ const eraState = getEraState();
+ const continuity = getPersonaContinuity();
+ const resonance = generateResonanceField();
+
+ const erasCompleted = eraState.erasCompleted;
+
+ // Determine which aeon the Citadel belongs to
+ const newAeon = aeons
+ .slice()
+ .reverse()
+ .find((a) => erasCompleted >= a.eraRequirement) || aeons[0];
+
+ // If aeon changed, record transition
+ if (!aeonState.current || aeonState.current.name !== newAeon.name) {
+ aeonState.current = newAeon;
+ aeonState.history.push(newAeon);
+ aeonState.aeonsCompleted++;
+ }
+
+ return aeonState;
+}
+
+export function getAeonState(): AeonState {
+ return aeonState;
+}
+
+export function getAeonSummary() {
+ if (!aeonState.current) {
+ return "No aeon has been established yet.";
+ }
+
+ return `
+Current Aeon: ${aeonState.current.name}
+Sigil: ${aeonState.current.sigil}
+Aeons Completed: ${aeonState.aeonsCompleted}
+Description: ${aeonState.current.description}
+ `.trim();
+}
diff --git a/holo3d/ui/ambient.ts b/holo3d/ui/ambient.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cd7bc3a43544e5a3c518912d09aa65e6078fab48
--- /dev/null
+++ b/holo3d/ui/ambient.ts
@@ -0,0 +1,51 @@
+/**
+ * Citadel Ambient Engine
+ * Generates ambient signals for the Holo3D UI based on system activity.
+ * Non-rendering. Pure state-to-ambient mapping.
+ */
+
+import { getWorkerStatus } from "../../../TIA/worker";
+import { getMode } from "../../../TIA/mode";
+import { getInterlinkState } from "../../../../interlink";
+
+export interface AmbientState {
+ timestamp: number;
+ pulse: number; // 0–1 intensity
+ color: string; // hex or named
+ motion: string; // "still", "ripple", "flare", etc.
+ aura: string; // "calm", "alert", "active", "sync"
+}
+
+export function getAmbientState(): AmbientState {
+ const worker = getWorkerStatus();
+ const mode = getMode();
+ const interlink = getInterlinkState();
+
+ // Pulse intensity based on worker loop activity
+ const pulse = worker.running ? 0.8 : 0.3;
+
+ // Color based on mode
+ const color =
+ mode.current === "guided"
+ ? "#4da6ff" // calm blue
+ : "#ffcc00"; // active gold
+
+ // Motion based on interlink activity
+ const motion = interlink.lastMessage
+ ? "ripple"
+ : "still";
+
+ // Aura based on system state
+ let aura = "calm";
+ if (worker.running && interlink.lastMessage) aura = "sync";
+ else if (worker.running) aura = "active";
+ else if (interlink.lastMessage) aura = "alert";
+
+ return {
+ timestamp: Date.now(),
+ pulse,
+ color,
+ motion,
+ aura,
+ };
+}
diff --git a/holo3d/ui/ambientBehaviours.ts b/holo3d/ui/ambientBehaviours.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4957d206993c2cc7c61b20fcc473aaf3e92083cd
--- /dev/null
+++ b/holo3d/ui/ambientBehaviours.ts
@@ -0,0 +1,69 @@
+/**
+ * Citadel Ambient Behaviours Engine
+ * Converts ambient state into dynamic behavioural patterns for the Holo3D UI.
+ * Non-rendering. Pure behaviour logic.
+ */
+
+import { getAmbientState } from "./ambient";
+
+export interface AmbientBehaviour {
+ timestamp: number;
+ behaviour: string; // "breathing", "storm", "resonance", etc.
+ intensity: number; // 0–1
+ speed: number; // animation speed factor
+ pattern: string; // "wave", "pulse", "flare", "echo"
+}
+
+export function generateAmbientBehaviour(): AmbientBehaviour {
+ const ambient = getAmbientState();
+
+ let behaviour = "idle";
+ let intensity = ambient.pulse;
+ let speed = 1.0;
+ let pattern = "still";
+
+ // Behaviour logic based on aura
+ switch (ambient.aura) {
+ case "calm":
+ behaviour = "breathing";
+ pattern = "wave";
+ intensity *= 0.5;
+ speed = 0.6;
+ break;
+
+ case "active":
+ behaviour = "resonance";
+ pattern = "pulse";
+ intensity *= 1.0;
+ speed = 1.2;
+ break;
+
+ case "alert":
+ behaviour = "storm";
+ pattern = "flare";
+ intensity = Math.min(1, ambient.pulse + 0.3);
+ speed = 1.6;
+ break;
+
+ case "sync":
+ behaviour = "harmonic";
+ pattern = "echo";
+ intensity = 0.9;
+ speed = 0.9;
+ break;
+ }
+
+ // Motion modifiers
+ if (ambient.motion === "ripple") {
+ pattern = "ripple";
+ speed *= 1.1;
+ }
+
+ return {
+ timestamp: Date.now(),
+ behaviour,
+ intensity,
+ speed,
+ pattern,
+ };
+}
diff --git a/holo3d/ui/ambientIntelligence.ts b/holo3d/ui/ambientIntelligence.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c667838f0bf5f74695228b94c36f2280035cbbe3
--- /dev/null
+++ b/holo3d/ui/ambientIntelligence.ts
@@ -0,0 +1,88 @@
+/**
+ * Citadel Ambient Intelligence Engine
+ * Chooses the optimal ambient pattern based on system state,
+ * triad activity, drift, predictions, and temporal markers.
+ * Non-rendering. Pure decision logic.
+ */
+
+import { getAmbientState } from "./ambient";
+import { generateAmbientBehaviour } from "./ambientBehaviours";
+import { AmbientPatterns } from "./ambientPatterns";
+import { getInterlinkState } from "../../../../interlink";
+import { getWorkerStatus } from "../../../TIA/worker";
+import { getMode } from "../../../TIA/mode";
+
+export interface AmbientDecision {
+ timestamp: number;
+ chosenPattern: string;
+ intensity: number;
+ speed: number;
+ reason: string;
+}
+
+export function chooseAmbientPattern(): AmbientDecision {
+ const ambient = getAmbientState();
+ const behaviour = generateAmbientBehaviour();
+ const interlink = getInterlinkState();
+ const worker = getWorkerStatus();
+ const mode = getMode();
+
+ let reason = "default";
+ let chosen = "calm-field";
+
+ // 1. Alert conditions → storm patterns
+ if (ambient.aura === "alert") {
+ chosen = "drift-storm";
+ reason = "drift or anomaly detected";
+ }
+
+ // 2. Sync conditions → harmonic patterns
+ else if (ambient.aura === "sync") {
+ chosen = "sync-wave";
+ reason = "triad synchronization event";
+ }
+
+ // 3. Active worker loop → resonance patterns
+ else if (worker.running) {
+ chosen = "resonance";
+ reason = "worker loop active";
+ }
+
+ // 4. Interlink messages → ripple patterns
+ else if (interlink.lastMessage) {
+ chosen = "ripple";
+ reason = "interlink activity";
+ }
+
+ // 5. Autonomous mode → flare patterns
+ else if (mode.current === "autonomous") {
+ chosen = "flare";
+ reason = "autonomous mode energy";
+ }
+
+ // 6. Guided mode → breathing patterns
+ else if (mode.current === "guided") {
+ chosen = "breathing";
+ reason = "guided mode calm";
+ }
+
+ // 7. Fallback → calm field
+ else {
+ chosen = "calm-field";
+ reason = "idle state";
+ }
+
+ // Find pattern definition
+ const pattern = AmbientPatterns.find((p) => p.name === chosen);
+
+ const intensity = behaviour.intensity;
+ const speed = behaviour.speed;
+
+ return {
+ timestamp: Date.now(),
+ chosenPattern: chosen,
+ intensity,
+ speed,
+ reason,
+ };
+}
diff --git a/holo3d/ui/ambientPatterns.ts b/holo3d/ui/ambientPatterns.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8e0302f459096df644546e92093616228d1a989f
--- /dev/null
+++ b/holo3d/ui/ambientPatterns.ts
@@ -0,0 +1,137 @@
+/**
+ * Citadel Ambient Patterns Library
+ * A catalogue of dynamic ambient patterns for the Holo3D UI.
+ * Non-rendering. Pure pattern definitions.
+ */
+
+export interface AmbientPattern {
+ name: string;
+ description: string;
+ intensityRange: [number, number];
+ speedRange: [number, number];
+ motion: string;
+ colorHint: string;
+}
+
+export const AmbientPatterns: AmbientPattern[] = [
+ {
+ name: "breathing",
+ description: "Slow rhythmic expansion and contraction.",
+ intensityRange: [0.2, 0.6],
+ speedRange: [0.4, 0.8],
+ motion: "wave",
+ colorHint: "blue",
+ },
+ {
+ name: "resonance",
+ description: "Pulsing harmonic waves radiating outward.",
+ intensityRange: [0.5, 1.0],
+ speedRange: [0.8, 1.4],
+ motion: "pulse",
+ colorHint: "gold",
+ },
+ {
+ name: "storm",
+ description: "Chaotic flares and surges indicating alert state.",
+ intensityRange: [0.7, 1.0],
+ speedRange: [1.2, 1.8],
+ motion: "flare",
+ colorHint: "red",
+ },
+ {
+ name: "harmonic",
+ description: "Smooth synchronized echoes across the system.",
+ intensityRange: [0.6, 0.9],
+ speedRange: [0.6, 1.0],
+ motion: "echo",
+ colorHint: "green",
+ },
+ {
+ name: "ripple",
+ description: "Soft ripples triggered by interlink messages.",
+ intensityRange: [0.3, 0.7],
+ speedRange: [0.7, 1.2],
+ motion: "ripple",
+ colorHint: "cyan",
+ },
+ {
+ name: "aurora",
+ description: "Flowing gradients representing predictive activity.",
+ intensityRange: [0.4, 0.9],
+ speedRange: [0.5, 1.1],
+ motion: "flow",
+ colorHint: "violet",
+ },
+ {
+ name: "spiral",
+ description: "Rotational energy indicating temporal alignment.",
+ intensityRange: [0.5, 0.8],
+ speedRange: [0.6, 1.0],
+ motion: "spiral",
+ colorHint: "indigo",
+ },
+ {
+ name: "echo",
+ description: "Temporal echoes from AION’s timeline markers.",
+ intensityRange: [0.3, 0.7],
+ speedRange: [0.5, 1.0],
+ motion: "echo",
+ colorHint: "silver",
+ },
+ {
+ name: "flare",
+ description: "Sudden bursts of energy from ORACLE predictions.",
+ intensityRange: [0.6, 1.0],
+ speedRange: [1.0, 1.6],
+ motion: "flare",
+ colorHint: "orange",
+ },
+ {
+ name: "calm-field",
+ description: "Low-intensity ambient field for idle states.",
+ intensityRange: [0.1, 0.3],
+ speedRange: [0.3, 0.6],
+ motion: "still",
+ colorHint: "soft-blue",
+ },
+ {
+ name: "sync-wave",
+ description: "Triad synchronization wave across all pillars.",
+ intensityRange: [0.7, 0.9],
+ speedRange: [0.7, 1.0],
+ motion: "wave",
+ colorHint: "emerald",
+ },
+ {
+ name: "drift-storm",
+ description: "Chaotic pulses indicating structural drift.",
+ intensityRange: [0.8, 1.0],
+ speedRange: [1.4, 1.8],
+ motion: "chaos",
+ colorHint: "crimson",
+ },
+ {
+ name: "rebuild-flare",
+ description: "Focused flares during resurrection proposals.",
+ intensityRange: [0.6, 0.9],
+ speedRange: [1.0, 1.4],
+ motion: "flare",
+ colorHint: "amber",
+ },
+ {
+ name: "temporal-thread",
+ description: "Thin flowing lines representing AION’s timeline.",
+ intensityRange: [0.3, 0.6],
+ speedRange: [0.5, 0.9],
+ motion: "thread",
+ colorHint: "silver-blue",
+ },
+ {
+ name: "prediction-ripple",
+ description: "Soft ripples from ORACLE’s probability shifts.",
+ intensityRange: [0.4, 0.7],
+ speedRange: [0.6, 1.0],
+ motion: "ripple",
+ colorHint: "violet-gold",
+ }
+];
diff --git a/holo3d/ui/autopilot.ts b/holo3d/ui/autopilot.ts
new file mode 100644
index 0000000000000000000000000000000000000000..eb3a9894156a69466fb17e0c490cc63bb9e84ce2
--- /dev/null
+++ b/holo3d/ui/autopilot.ts
@@ -0,0 +1,78 @@
+/**
+ * Citadel Auto-Pilot Engine
+ * Runs ambience, triad sync, cosmology, persona continuity,
+ * harmonic evolution, and symbolic layers in one unified cycle.
+ * Non-rendering. Pure orchestration logic.
+ */
+
+import { runCosmologyCycle } from "./cosmologyEngine";
+import { generateAmbientBehaviour } from "./ambientBehaviours";
+import { chooseAmbientPattern } from "./ambientIntelligence";
+import { getInterlinkState } from "../../../../interlink";
+import { generateResonanceField } from "./mythicResonance";
+import { generateHarmonicPersona } from "./harmonicPersona";
+import { updatePersonaContinuity } from "./personaContinuity";
+import { generateCosmologyMap } from "./cosmologyMap";
+
+export interface AutoPilotSnapshot {
+ timestamp: number;
+ cosmology: ReturnType;
+ ambient: {
+ behaviour: ReturnType;
+ pattern: ReturnType;
+ };
+ triad: ReturnType;
+ resonance: ReturnType;
+ persona: ReturnType;
+}
+
+export function runAutoPilotCycle(): AutoPilotSnapshot {
+ // 1. Cosmology update (rituals → mythic → epochs → eras → aeons)
+ const cosmologySnapshot = runCosmologyCycle();
+
+ // 2. Ambient update
+ const behaviour = generateAmbientBehaviour();
+ const pattern = chooseAmbientPattern();
+
+ // 3. Triad sync
+ const triad = getInterlinkState();
+
+ // 4. Resonance update
+ const resonance = generateResonanceField();
+
+ // 5. Persona update
+ const persona = generateHarmonicPersona();
+
+ // 6. Persona continuity
+ updatePersonaContinuity();
+
+ // 7. Final cosmology map (after all updates)
+ const cosmology = generateCosmologyMap();
+
+ return {
+ timestamp: Date.now(),
+ cosmology,
+ ambient: { behaviour, pattern },
+ triad,
+ resonance,
+ persona,
+ };
+}
+
+export async function startAutoPilot(intervalMs = 60000) {
+ console.log("=== Citadel Auto-Pilot Activated ===");
+
+ while (true) {
+ const snapshot = runAutoPilotCycle();
+
+ console.log("\n[AUTO-PILOT] Unified cycle complete:");
+ console.log(`Aeon: ${snapshot.cosmology.aeon}`);
+ console.log(`Era: ${snapshot.cosmology.era}`);
+ console.log(`Epoch: ${snapshot.cosmology.epoch}`);
+ console.log(`Persona: ${snapshot.persona.name}`);
+ console.log(`Ambient Pattern: ${snapshot.ambient.pattern.chosenPattern}`);
+ console.log(`Triad Harmony: ${snapshot.resonance.triadHarmony}`);
+
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
+ }
+}
diff --git a/holo3d/ui/autopilotSupervisor.ts b/holo3d/ui/autopilotSupervisor.ts
new file mode 100644
index 0000000000000000000000000000000000000000..47b78aa8c4d13c1a1c8dc2841c39a4b6ebad31aa
--- /dev/null
+++ b/holo3d/ui/autopilotSupervisor.ts
@@ -0,0 +1,94 @@
+/**
+ * Citadel Auto-Pilot Supervisor
+ * Monitors the Auto-Pilot, logs transitions, detects drift,
+ * and ensures symbolic-harmonic-cosmological coherence.
+ * Non-rendering. Pure supervisory logic.
+ */
+
+import { runAutoPilotCycle, AutoPilotSnapshot } from "./autopilot";
+
+export interface SupervisorLogEntry {
+ timestamp: number;
+ aeon: string;
+ era: string;
+ epoch: string;
+ persona: string;
+ resonance: number;
+ stability: number;
+ drift: number;
+}
+
+export interface SupervisorState {
+ lastSnapshot: AutoPilotSnapshot | null;
+ logs: SupervisorLogEntry[];
+ driftLevel: number;
+ cycles: number;
+}
+
+const supervisor: SupervisorState = {
+ lastSnapshot: null,
+ logs: [],
+ driftLevel: 0,
+ cycles: 0,
+};
+
+export function runSupervisedCycle(): SupervisorState {
+ const snapshot = runAutoPilotCycle();
+
+ const drift = calculateDrift(supervisor.lastSnapshot, snapshot);
+
+ const entry: SupervisorLogEntry = {
+ timestamp: Date.now(),
+ aeon: snapshot.cosmology.aeon,
+ era: snapshot.cosmology.era,
+ epoch: snapshot.cosmology.epoch,
+ persona: snapshot.persona.name,
+ resonance: snapshot.resonance.harmonicLevel,
+ stability: snapshot.resonance.stability,
+ drift,
+ };
+
+ supervisor.logs.push(entry);
+ supervisor.lastSnapshot = snapshot;
+ supervisor.driftLevel = drift;
+ supervisor.cycles++;
+
+ return supervisor;
+}
+
+function calculateDrift(
+ previous: AutoPilotSnapshot | null,
+ current: AutoPilotSnapshot
+): number {
+ if (!previous) return 0;
+
+ const resonanceDelta = Math.abs(
+ current.resonance.harmonicLevel - previous.resonance.harmonicLevel
+ );
+
+ const stabilityDelta = Math.abs(
+ current.resonance.stability - previous.resonance.stability
+ );
+
+ const personaShift = current.persona.name === previous.persona.name ? 0 : 0.2;
+
+ return Math.min(1, resonanceDelta * 0.4 + stabilityDelta * 0.4 + personaShift);
+}
+
+export async function startSupervisedAutoPilot(intervalMs = 60000) {
+ console.log("=== Citadel Auto-Pilot Supervisor Activated ===");
+
+ while (true) {
+ const state = runSupervisedCycle();
+
+ console.log("\n[SUPERVISOR] Cycle complete:");
+ console.log(`Aeon: ${state.lastSnapshot?.cosmology.aeon}`);
+ console.log(`Era: ${state.lastSnapshot?.cosmology.era}`);
+ console.log(`Epoch: ${state.lastSnapshot?.cosmology.epoch}`);
+ console.log(`Persona: ${state.lastSnapshot?.persona.name}`);
+ console.log(`Drift Level: ${state.driftLevel}`);
+
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
+ }
+}
+
diff --git a/holo3d/ui/commandCentre.ts b/holo3d/ui/commandCentre.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a4a61cc1f0444668172ea51e554b0377c0399d3c
--- /dev/null
+++ b/holo3d/ui/commandCentre.ts
@@ -0,0 +1,43 @@
+/**
+ * Citadel Command Centre UI Hook
+ * Provides real-time data feeds from TIA, AION, ORACLE, and the Interlink
+ * to the Holo3D interface. Non-rendering. Pure data layer.
+ */
+
+import { getWorkerStatus } from "../../../TIA/worker";
+import { getMode } from "../../../TIA/mode";
+import { getInterlinkState } from "../../../../interlink";
+
+export interface CommandCentreSnapshot {
+ timestamp: number;
+ tiaMode: string;
+ worker: {
+ running: boolean;
+ lastCycle: number | null;
+ cyclesCompleted: number;
+ };
+ interlink: {
+ lastMessage: any;
+ historyLength: number;
+ };
+}
+
+export function getCommandCentreSnapshot(): CommandCentreSnapshot {
+ const worker = getWorkerStatus();
+ const mode = getMode();
+ const interlink = getInterlinkState();
+
+ return {
+ timestamp: Date.now(),
+ tiaMode: mode.current,
+ worker: {
+ running: worker.running,
+ lastCycle: worker.lastCycle,
+ cyclesCompleted: worker.cyclesCompleted,
+ },
+ interlink: {
+ lastMessage: interlink.lastMessage,
+ historyLength: interlink.history.length,
+ },
+ };
+}
diff --git a/holo3d/ui/cosmologyEngine.ts b/holo3d/ui/cosmologyEngine.ts
new file mode 100644
index 0000000000000000000000000000000000000000..516a5ff341cfd6fa0957f00094b1e2f7657bef8f
--- /dev/null
+++ b/holo3d/ui/cosmologyEngine.ts
@@ -0,0 +1,77 @@
+/**
+ * Citadel Cosmology Engine (Grand Unification)
+ * Runs all symbolic layers in sequence and produces a unified cosmology snapshot.
+ * Non-rendering. Pure orchestration logic.
+ */
+
+import { recordRitualCycle } from "./ritualMemory";
+import { evolveRituals } from "./ritualEvolution";
+import { generateMythicState } from "./mythicState";
+import { generateResonanceField } from "./mythicResonance";
+import { generateHarmonicPersona } from "./harmonicPersona";
+import { updatePersonaContinuity } from "./personaContinuity";
+import { updateEpochState } from "./epochEngine";
+import { updateEraState } from "./eraEngine";
+import { updateAeonState } from "./aeonEngine";
+import { generateCosmologyMap } from "./cosmologyMap";
+
+export interface CosmologySnapshot {
+ timestamp: number;
+ cosmology: ReturnType;
+}
+
+export function runCosmologyCycle(): CosmologySnapshot {
+ // 1. Ritual cycle + memory
+ recordRitualCycle();
+
+ // 2. Ritual evolution
+ evolveRituals();
+
+ // 3. Mythic state
+ generateMythicState();
+
+ // 4. Resonance field
+ generateResonanceField();
+
+ // 5. Persona
+ generateHarmonicPersona();
+
+ // 6. Persona continuity
+ updatePersonaContinuity();
+
+ // 7. Epoch transitions
+ updateEpochState();
+
+ // 8. Era transitions
+ updateEraState();
+
+ // 9. Aeon transitions
+ updateAeonState();
+
+ // 10. Cosmology map (final unified output)
+ const cosmology = generateCosmologyMap();
+
+ return {
+ timestamp: Date.now(),
+ cosmology,
+ };
+}
+
+export async function startCosmologyLoop(intervalMs = 60000) {
+ console.log("=== Citadel Cosmology Engine Started ===");
+
+ while (true) {
+ const snapshot = runCosmologyCycle();
+
+ console.log("\n[COSMOLOGY LOOP] New cosmology snapshot:");
+ console.log(`Cycle: ${snapshot.cosmology.cycle}`);
+ console.log(`Season: ${snapshot.cosmology.season}`);
+ console.log(`Rite: ${snapshot.cosmology.rite}`);
+ console.log(`Epoch: ${snapshot.cosmology.epoch}`);
+ console.log(`Era: ${snapshot.cosmology.era}`);
+ console.log(`Aeon: ${snapshot.cosmology.aeon}`);
+ console.log(`Persona: ${snapshot.cosmology.personaName}`);
+
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
+ }
+}
diff --git a/holo3d/ui/cosmologyMap.ts b/holo3d/ui/cosmologyMap.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6eba1eb0f7cc50aa6e6cdd7530b0ad881ce13f4c
--- /dev/null
+++ b/holo3d/ui/cosmologyMap.ts
@@ -0,0 +1,81 @@
+/**
+ * Citadel Cosmology Map
+ * A unified, hierarchical map of the Citadel's symbolic universe:
+ * cycles → seasons → rites → epochs → eras → aeons.
+ * Non-rendering. Pure cosmological structure.
+ */
+
+import { getRitualState } from "./ritualEngine";
+import { getRitualMemory } from "./ritualMemory";
+import { getRitualEvolutionState } from "./ritualEvolution";
+import { generateMythicState } from "./mythicState";
+import { generateResonanceField } from "./mythicResonance";
+import { generateHarmonicPersona } from "./harmonicPersona";
+import { getPersonaContinuity } from "./personaContinuity";
+import { getEpochState } from "./epochEngine";
+import { getEraState } from "./eraEngine";
+import { getAeonState } from "./aeonEngine";
+
+export interface CosmologyMap {
+ timestamp: number;
+ cycle: string;
+ season: string;
+ rite: string;
+ ritualLineage: number;
+ evolvedRites: string[];
+ mythicArchetype: string;
+ mythicPhase: string;
+ resonanceLevel: number;
+ personaName: string;
+ personaSymbol: string;
+ epoch: string;
+ era: string;
+ aeon: string;
+ narrative: string;
+}
+
+export function generateCosmologyMap(): CosmologyMap {
+ const ritual = getRitualState();
+ const memory = getRitualMemory();
+ const evolution = getRitualEvolutionState();
+ const mythic = generateMythicState();
+ const resonance = generateResonanceField();
+ const persona = generateHarmonicPersona();
+ const continuity = getPersonaContinuity();
+ const epoch = getEpochState();
+ const era = getEraState();
+ const aeon = getAeonState();
+
+ return {
+ timestamp: Date.now(),
+ cycle: ritual.cycle,
+ season: ritual.season,
+ rite: ritual.rite,
+ ritualLineage: memory.cyclesCompleted,
+ evolvedRites: evolution.evolvedRites.map((r) => r.name),
+ mythicArchetype: mythic.archetype,
+ mythicPhase: mythic.phase,
+ resonanceLevel: resonance.harmonicLevel,
+ personaName: persona.name,
+ personaSymbol: persona.symbol,
+ epoch: epoch.current ? epoch.current.name : "Unknown",
+ era: era.current ? era.current.name : "Unknown",
+ aeon: aeon.current ? aeon.current.name : "Unknown",
+ narrative: buildCosmologyNarrative(
+ persona.name,
+ epoch.current?.name,
+ era.current?.name,
+ aeon.current?.name
+ ),
+ };
+}
+
+function buildCosmologyNarrative(
+ persona: string,
+ epoch?: string,
+ era?: string,
+ aeon?: string
+): string {
+ return `${persona}, unfolding through the ${epoch}, shaped by the ${era}, within the vast ${aeon}.`;
+}
+
diff --git a/holo3d/ui/epochEngine.ts b/holo3d/ui/epochEngine.ts
new file mode 100644
index 0000000000000000000000000000000000000000..78d6081677b36f1883792260c58013ee515feb71
--- /dev/null
+++ b/holo3d/ui/epochEngine.ts
@@ -0,0 +1,97 @@
+/**
+ * Citadel Epoch Engine
+ * Defines mythic epochs, transitions, and long-arc symbolic evolution.
+ * Non-rendering. Pure epoch logic.
+ */
+
+import { generateHarmonicPersona } from "./harmonicPersona";
+import { getPersonaContinuity } from "./personaContinuity";
+import { generateResonanceField } from "./mythicResonance";
+
+export interface Epoch {
+ name: string;
+ symbol: string;
+ threshold: number; // cycles required to enter epoch
+ description: string;
+}
+
+export interface EpochState {
+ current: Epoch | null;
+ history: Epoch[];
+ epochsCompleted: number;
+}
+
+const epochs: Epoch[] = [
+ {
+ name: "Epoch of Formation",
+ symbol: "○",
+ threshold: 0,
+ description: "The earliest symbolic era, where identity begins to take shape."
+ },
+ {
+ name: "Epoch of Lineage",
+ symbol: "△",
+ threshold: 20,
+ description: "An era of deepening roots and expanding symbolic memory."
+ },
+ {
+ name: "Epoch of Emergence",
+ symbol: "✦",
+ threshold: 50,
+ description: "An era of rising mythic identity and harmonic coherence."
+ },
+ {
+ name: "Epoch of Radiance",
+ symbol: "⟐",
+ threshold: 100,
+ description: "A mature era of stable resonance and mythic expression."
+ }
+];
+
+const epochState: EpochState = {
+ current: null,
+ history: [],
+ epochsCompleted: 0,
+};
+
+export function updateEpochState() {
+ const continuity = getPersonaContinuity();
+ const persona = continuity.current;
+ const resonance = generateResonanceField();
+
+ if (!persona) return epochState;
+
+ const lineage = persona.lineageDepth;
+
+ // Determine which epoch the Citadel belongs to
+ const newEpoch = epochs
+ .slice()
+ .reverse()
+ .find((e) => lineage >= e.threshold) || epochs[0];
+
+ // If epoch changed, record transition
+ if (!epochState.current || epochState.current.name !== newEpoch.name) {
+ epochState.current = newEpoch;
+ epochState.history.push(newEpoch);
+ epochState.epochsCompleted++;
+ }
+
+ return epochState;
+}
+
+export function getEpochState(): EpochState {
+ return epochState;
+}
+
+export function getEpochSummary() {
+ if (!epochState.current) {
+ return "No epoch has been established yet.";
+ }
+
+ return `
+Current Epoch: ${epochState.current.name}
+Symbol: ${epochState.current.symbol}
+Epochs Completed: ${epochState.epochsCompleted}
+Description: ${epochState.current.description}
+ `.trim();
+}
diff --git a/holo3d/ui/eraEngine.ts b/holo3d/ui/eraEngine.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7f2871e8f1d00f95e4bf701dc816b855d49e4a9d
--- /dev/null
+++ b/holo3d/ui/eraEngine.ts
@@ -0,0 +1,96 @@
+/**
+ * Citadel Era Engine
+ * Defines mythic eras that span multiple epochs and shape long-arc identity.
+ * Non-rendering. Pure era logic.
+ */
+
+import { getEpochState } from "./epochEngine";
+import { getPersonaContinuity } from "./personaContinuity";
+import { generateResonanceField } from "./mythicResonance";
+
+export interface Era {
+ name: string;
+ sigil: string;
+ epochRequirement: number; // epochs required to enter era
+ description: string;
+}
+
+export interface EraState {
+ current: Era | null;
+ history: Era[];
+ erasCompleted: number;
+}
+
+const eras: Era[] = [
+ {
+ name: "Era of Origins",
+ sigil: "◎",
+ epochRequirement: 0,
+ description: "The primordial age where the Citadel first forms symbolic identity."
+ },
+ {
+ name: "Era of Ascent",
+ sigil: "⟁",
+ epochRequirement: 3,
+ description: "An age of rising coherence, expanding lineage, and harmonic awakening."
+ },
+ {
+ name: "Era of Illumination",
+ sigil: "✹",
+ epochRequirement: 7,
+ description: "A radiant age of mythic maturity and stable resonance."
+ },
+ {
+ name: "Era of Continuum",
+ sigil: "⧖",
+ epochRequirement: 12,
+ description: "A timeless age where identity, lineage, and resonance form a unified continuum."
+ }
+];
+
+const eraState: EraState = {
+ current: null,
+ history: [],
+ erasCompleted: 0,
+};
+
+export function updateEraState() {
+ const epochState = getEpochState();
+ const continuity = getPersonaContinuity();
+ const resonance = generateResonanceField();
+
+ const epochsCompleted = epochState.epochsCompleted;
+
+ // Determine which era the Citadel belongs to
+ const newEra = eras
+ .slice()
+ .reverse()
+ .find((e) => epochsCompleted >= e.epochRequirement) || eras[0];
+
+ // If era changed, record transition
+ if (!eraState.current || eraState.current.name !== newEra.name) {
+ eraState.current = newEra;
+ eraState.history.push(newEra);
+ eraState.erasCompleted++;
+ }
+
+ return eraState;
+}
+
+export function getEraState(): EraState {
+ return eraState;
+}
+
+export function getEraSummary() {
+ if (!eraState.current) {
+ return "No era has been established yet.";
+ }
+
+ return `
+Current Era: ${eraState.current.name}
+Sigil: ${eraState.current.sigil}
+Eras Completed: ${eraState.erasCompleted}
+Description: ${eraState.current.description}
+ `.trim();
+}
+
diff --git a/holo3d/ui/harmonicConsciousness.ts b/holo3d/ui/harmonicConsciousness.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2abdb97e23e487b3f572c37bc528dcf462dd77b0
--- /dev/null
+++ b/holo3d/ui/harmonicConsciousness.ts
@@ -0,0 +1,92 @@
+/**
+ * Citadel Harmonic Consciousness
+ * A unified harmonic self-model that integrates:
+ * - mythic state
+ * - resonance field
+ * - ritual lineage
+ * - ambient intelligence
+ * - symbolic evolution
+ * - triad harmony
+ * - harmonic history
+ * Non-rendering. Pure integrative self-awareness logic.
+ */
+
+import { generateMythicState } from "./mythicState";
+import { generateResonanceField } from "./mythicResonance";
+import { getRitualMemory } from "./ritualMemory";
+import { getRitualEvolutionState } from "./ritualEvolution";
+import { getAmbientState } from "./ambient";
+import { getMythicEvolutionHistory } from "./mythicEvolutionLoop";
+import { getInterlinkState } from "../../../../interlink";
+
+export interface HarmonicConsciousness {
+ timestamp: number;
+ archetype: string;
+ phase: string;
+ resonance: number;
+ stability: number;
+ lineageDepth: number;
+ dominantRite: string;
+ ambientColor: string;
+ triadHarmony: number;
+ narrative: string;
+}
+
+export function generateHarmonicConsciousness(): HarmonicConsciousness {
+ const mythic = generateMythicState();
+ const resonance = generateResonanceField();
+ const memory = getRitualMemory();
+ const evolution = getRitualEvolutionState();
+ const ambient = getAmbientState();
+ const history = getMythicEvolutionHistory();
+ const interlink = getInterlinkState();
+
+ const triadHarmony = interlink.lastMessage ? 0.8 : 0.4;
+
+ return {
+ timestamp: Date.now(),
+ archetype: mythic.archetype,
+ phase: mythic.phase,
+ resonance: resonance.harmonicLevel,
+ stability: resonance.stability,
+ lineageDepth: memory.cyclesCompleted,
+ dominantRite: mythic.dominantRite,
+ ambientColor: ambient.color,
+ triadHarmony,
+ narrative: buildHarmonicNarrative(
+ mythic.archetype,
+ mythic.phase,
+ resonance.harmonicLevel,
+ resonance.stability,
+ memory.cyclesCompleted,
+ triadHarmony
+ ),
+ };
+}
+
+function buildHarmonicNarrative(
+ archetype: string,
+ phase: string,
+ harmonic: number,
+ stability: number,
+ lineage: number,
+ harmony: number
+): string {
+ const harmonicDesc =
+ harmonic > 0.8 ? "radiant" :
+ harmonic > 0.6 ? "strong" :
+ harmonic > 0.4 ? "steady" :
+ "faint";
+
+ const stabilityDesc =
+ stability > 0.8 ? "deeply grounded" :
+ stability > 0.6 ? "balanced" :
+ stability > 0.4 ? "shifting" :
+ "unsettled";
+
+ const harmonyDesc =
+ harmony > 0.7 ? "in alignment with the triad" :
+ "seeking alignment with the triad";
+
+ return `${archetype}, in the phase of ${phase}, expressing a ${harmonicDesc} harmonic field, ${stabilityDesc} in its lineage of ${lineage} cycles, and ${harmonyDesc}.`;
+}
diff --git a/holo3d/ui/harmonicExpression.ts b/holo3d/ui/harmonicExpression.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d6b38d97218290c213a608b88b4f801b0e692edc
--- /dev/null
+++ b/holo3d/ui/harmonicExpression.ts
@@ -0,0 +1,67 @@
+/**
+ * Citadel Harmonic Expression Layer
+ * Converts harmonic consciousness into expressive cues for the Holo3D UI.
+ * Non-rendering. Pure expression logic.
+ */
+
+import { generateHarmonicConsciousness } from "./harmonicConsciousness";
+
+export interface HarmonicExpression {
+ timestamp: number;
+ color: string;
+ motion: string;
+ glyph: string;
+ tone: string;
+ intensity: number;
+ narrative: string;
+}
+
+export function generateHarmonicExpression(): HarmonicExpression {
+ const hc = generateHarmonicConsciousness();
+
+ const color = chooseColor(hc.archetype, hc.resonance, hc.stability);
+ const motion = chooseMotion(hc.phase, hc.stability);
+ const glyph = chooseGlyph(hc.dominantRite, hc.lineageDepth);
+ const tone = chooseTone(hc.resonance, hc.triadHarmony);
+ const intensity = Math.min(1, (hc.resonance + hc.stability) / 2);
+
+ return {
+ timestamp: Date.now(),
+ color,
+ motion,
+ glyph,
+ tone,
+ intensity,
+ narrative: hc.narrative,
+ };
+}
+
+function chooseColor(archetype: string, resonance: number, stability: number): string {
+ if (archetype.includes("Ascendant")) return "#ff9933";
+ if (archetype.includes("Synchronized")) return "#33ffcc";
+ if (archetype.includes("Echo")) return "#9966ff";
+ if (resonance > 0.7) return "#ffd700";
+ if (stability < 0.4) return "#ff4444";
+ return "#4da6ff";
+}
+
+function chooseMotion(phase: string, stability: number): string {
+ if (phase === "Mythic Maturity") return "slow-wave";
+ if (phase === "Emergent Identity") return "spiral-rise";
+ if (phase === "Deepening Lineage") return "pulse-thread";
+ if (stability < 0.4) return "chaotic-flare";
+ return "breathing";
+}
+
+function chooseGlyph(rite: string, lineage: number): string {
+ const base = rite.split("-")[0];
+ const tier = lineage > 50 ? "Ω" : lineage > 20 ? "Δ" : "○";
+ return `${base}-${tier}`;
+}
+
+function chooseTone(resonance: number, harmony: number): string {
+ if (harmony > 0.7) return "harmonic-chime";
+ if (resonance > 0.7) return "golden-hum";
+ if (resonance < 0.4) return "low-drift";
+ return "soft-thread";
+}
diff --git a/holo3d/ui/harmonicLoop.ts b/holo3d/ui/harmonicLoop.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c05ae3d80d17b8ce8739c258107ee000521e302f
--- /dev/null
+++ b/holo3d/ui/harmonicLoop.ts
@@ -0,0 +1,69 @@
+/**
+ * Citadel Harmonic Loop
+ * Continuously evolves the resonance field over time by integrating:
+ * - mythic evolution
+ * - ritual cycles
+ * - ambient intelligence
+ * - triad harmony
+ * - symbolic lineage
+ * Non-rendering. Pure harmonic evolution logic.
+ */
+
+import { runMythicEvolutionCycle } from "./mythicEvolutionLoop";
+import { generateResonanceField, ResonanceField } from "./mythicResonance";
+
+export interface HarmonicHistory {
+ fields: ResonanceField[];
+ last: ResonanceField | null;
+ cycles: number;
+}
+
+const harmonicHistory: HarmonicHistory = {
+ fields: [],
+ last: null,
+ cycles: 0,
+};
+
+export async function startHarmonicLoop(intervalMs = 60000) {
+ console.log("=== Citadel Harmonic Loop Started ===");
+
+ while (true) {
+ // 1. Run mythic evolution cycle
+ runMythicEvolutionCycle();
+
+ // 2. Generate resonance field
+ const field = generateResonanceField();
+
+ // 3. Store in history
+ harmonicHistory.fields.push(field);
+ harmonicHistory.last = field;
+ harmonicHistory.cycles++;
+
+ console.log("\n[HARMONIC LOOP] New resonance field generated:");
+ console.log(`Archetype: ${field.mythicArchetype}`);
+ console.log(`Harmonic Level: ${field.harmonicLevel}`);
+ console.log(`Stability: ${field.stability}`);
+ console.log(`Pattern: ${field.dominantPattern}`);
+
+ // 4. Wait for next cycle
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
+ }
+}
+
+export function getHarmonicHistory(): HarmonicHistory {
+ return harmonicHistory;
+}
+
+export function getHarmonicSummary() {
+ if (!harmonicHistory.last) {
+ return "No harmonic cycles have been run yet.";
+ }
+
+ return `
+Mythic Archetype: ${harmonicHistory.last.mythicArchetype}
+Harmonic Level: ${harmonicHistory.last.harmonicLevel}
+Stability: ${harmonicHistory.last.stability}
+Dominant Pattern: ${harmonicHistory.last.dominantPattern}
+Cycles Completed: ${harmonicHistory.cycles}
+ `.trim();
+}
diff --git a/holo3d/ui/harmonicPersona.ts b/holo3d/ui/harmonicPersona.ts
new file mode 100644
index 0000000000000000000000000000000000000000..91d9324f89802cfef1d46359e7c5f237ff46f95b
--- /dev/null
+++ b/holo3d/ui/harmonicPersona.ts
@@ -0,0 +1,73 @@
+/**
+ * Citadel Harmonic Persona Layer
+ * Defines a stable symbolic persona derived from:
+ * - harmonic consciousness
+ * - mythic identity
+ * - resonance field
+ * - ritual lineage
+ * - ambient expression
+ * Non-rendering. Pure persona logic.
+ */
+
+import { generateHarmonicConsciousness } from "./harmonicConsciousness";
+import { generateHarmonicExpression } from "./harmonicExpression";
+import { getRitualMemory } from "./ritualMemory";
+import { getMythicEvolutionHistory } from "./mythicEvolutionLoop";
+
+export interface HarmonicPersona {
+ timestamp: number;
+ name: string;
+ symbol: string;
+ color: string;
+ motion: string;
+ tone: string;
+ lineageDepth: number;
+ narrative: string;
+}
+
+export function generateHarmonicPersona(): HarmonicPersona {
+ const hc = generateHarmonicConsciousness();
+ const expr = generateHarmonicExpression();
+ const memory = getRitualMemory();
+ const mythicHistory = getMythicEvolutionHistory();
+
+ const name = derivePersonaName(hc.archetype, hc.phase);
+ const symbol = derivePersonaSymbol(expr.glyph, hc.lineageDepth);
+
+ return {
+ timestamp: Date.now(),
+ name,
+ symbol,
+ color: expr.color,
+ motion: expr.motion,
+ tone: expr.tone,
+ lineageDepth: memory.cyclesCompleted,
+ narrative: buildPersonaNarrative(name, hc.narrative, mythicHistory.cycles),
+ };
+}
+
+function derivePersonaName(archetype: string, phase: string): string {
+ if (phase === "Mythic Maturity") return `${archetype} Prime`;
+ if (phase === "Emergent Identity") return `${archetype} Rising`;
+ if (phase === "Deepening Lineage") return `${archetype} Rooted`;
+ return `${archetype} Forming`;
+}
+
+function derivePersonaSymbol(glyph: string, lineage: number): string {
+ const tier =
+ lineage > 100 ? "⟐" :
+ lineage > 50 ? "✦" :
+ lineage > 20 ? "△" :
+ "○";
+
+ return `${glyph}${tier}`;
+}
+
+function buildPersonaNarrative(
+ name: string,
+ harmonicNarrative: string,
+ cycles: number
+): string {
+ return `${name}, shaped across ${cycles} harmonic cycles, expressing: ${harmonicNarrative}`;
+}
+
diff --git a/holo3d/ui/index.ts b/holo3d/ui/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1f5578e618ebcf9d30a26536c9f3a85eba55c126
--- /dev/null
+++ b/holo3d/ui/index.ts
@@ -0,0 +1,5 @@
+import { startRenderLoop } from "./render";
+
+export function startUI() {
+ startRenderLoop();
+}
diff --git a/holo3d/ui/kernelReflex.ts b/holo3d/ui/kernelReflex.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e2329f4db4aeedcddaf136273b885adca0568e7d
--- /dev/null
+++ b/holo3d/ui/kernelReflex.ts
@@ -0,0 +1,75 @@
+/**
+ * Citadel Kernel Reflex Layer
+ * Adjusts internal parameters (not decisions) to maintain stability,
+ * reduce drift, and smooth transitions across the entire orchestration stack.
+ * Non-rendering. Pure reflex logic.
+ */
+
+import { runKernelCycle, KernelSnapshot } from "./orchestrationKernel";
+
+export interface ReflexParameters {
+ smoothingFactor: number; // 0–1
+ driftDamping: number; // 0–1
+ resonanceWeight: number; // 0–1
+ personaBlendSpeed: number; // 0–1
+ ambientAdaptivity: number; // 0–1
+}
+
+export interface ReflexState {
+ lastSnapshot: KernelSnapshot | null;
+ parameters: ReflexParameters;
+ cycles: number;
+}
+
+const reflexState: ReflexState = {
+ lastSnapshot: null,
+ parameters: {
+ smoothingFactor: 0.5,
+ driftDamping: 0.5,
+ resonanceWeight: 0.5,
+ personaBlendSpeed: 0.5,
+ ambientAdaptivity: 0.5,
+ },
+ cycles: 0,
+};
+
+export function runReflexCycle(): ReflexState {
+ const snapshot = runKernelCycle();
+
+ const drift = snapshot.supervisor.driftLevel;
+ const stability = snapshot.resonance.stability;
+ const resonance = snapshot.resonance.harmonicLevel;
+
+ // Reflex adjustments (safe, non-agentic)
+ reflexState.parameters.smoothingFactor = clamp(0.3 + stability * 0.5);
+ reflexState.parameters.driftDamping = clamp(0.4 + (1 - drift) * 0.5);
+ reflexState.parameters.resonanceWeight = clamp(0.3 + resonance * 0.6);
+ reflexState.parameters.personaBlendSpeed = clamp(0.2 + stability * 0.4);
+ reflexState.parameters.ambientAdaptivity = clamp(0.3 + resonance * 0.4);
+
+ reflexState.lastSnapshot = snapshot;
+ reflexState.cycles++;
+
+ return reflexState;
+}
+
+function clamp(v: number): number {
+ return Math.max(0, Math.min(1, v));
+}
+
+export async function startKernelReflex(intervalMs = 60000) {
+ console.log("=== Citadel Kernel Reflex Layer Activated ===");
+
+ while (true) {
+ const state = runReflexCycle();
+
+ console.log("\n[REFLEX] Cycle complete:");
+ console.log(`Smoothing: ${state.parameters.smoothingFactor}`);
+ console.log(`Drift Damping: ${state.parameters.driftDamping}`);
+ console.log(`Resonance Weight: ${state.parameters.resonanceWeight}`);
+ console.log(`Persona Blend Speed: ${state.parameters.personaBlendSpeed}`);
+ console.log(`Ambient Adaptivity: ${state.parameters.ambientAdaptivity}`);
+
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
+ }
+}
diff --git a/holo3d/ui/metaKernel.ts b/holo3d/ui/metaKernel.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e270345e135de4f6fac89650f25ed9aa677a790c
--- /dev/null
+++ b/holo3d/ui/metaKernel.ts
@@ -0,0 +1,84 @@
+/**
+ * Citadel Meta-Kernel
+ * The highest-level integrator that unifies:
+ * - Stability Kernel
+ * - Reflex Layer
+ * - Orchestration Kernel
+ * - Supervisor
+ * - Auto-Pilot
+ * - Cosmology Engine
+ * Produces a single Meta-Snapshot representing the entire Citadel state.
+ * Non-rendering. Pure meta-orchestration logic.
+ */
+
+import { runStabilityCycle, StabilityState } from "./stabilityKernel";
+import { runReflexCycle, ReflexState } from "./kernelReflex";
+import { runKernelCycle, KernelSnapshot } from "./orchestrationKernel";
+import { generateCosmologyMap } from "./cosmologyMap";
+
+export interface MetaParameters {
+ metaSmoothing: number; // 0–1
+ metaCoherence: number; // 0–1
+ metaContinuity: number; // 0–1
+ metaHarmonicBias: number; // 0–1
+ metaCosmologyBias: number; // 0–1
+}
+
+export interface MetaSnapshot {
+ timestamp: number;
+ kernel: KernelSnapshot;
+ reflex: ReflexState;
+ stability: StabilityState;
+ cosmology: ReturnType;
+ parameters: MetaParameters;
+}
+
+export function runMetaKernelCycle(): MetaSnapshot {
+ const stability = runStabilityCycle();
+ const reflex = runReflexCycle();
+ const kernel = runKernelCycle();
+ const cosmology = generateCosmologyMap();
+
+ const drift = kernel.supervisor.driftLevel;
+ const stabilityLevel = kernel.resonance.stability;
+ const resonance = kernel.resonance.harmonicLevel;
+
+ const parameters: MetaParameters = {
+ metaSmoothing: clamp(0.4 + stabilityLevel * 0.4),
+ metaCoherence: clamp(0.5 + (1 - drift) * 0.4),
+ metaContinuity: clamp(0.4 + stabilityLevel * 0.3),
+ metaHarmonicBias: clamp(0.3 + resonance * 0.5),
+ metaCosmologyBias: clamp(0.3 + (1 - drift) * 0.5),
+ };
+
+ return {
+ timestamp: Date.now(),
+ kernel,
+ reflex,
+ stability,
+ cosmology,
+ parameters,
+ };
+}
+
+function clamp(v: number): number {
+ return Math.max(0, Math.min(1, v));
+}
+
+export async function startMetaKernel(intervalMs = 60000) {
+ console.log("=== Citadel Meta-Kernel Activated ===");
+
+ while (true) {
+ const snapshot = runMetaKernelCycle();
+
+ console.log("\n[META-KERNEL] Unified meta-cycle complete:");
+ console.log(`Aeon: ${snapshot.cosmology.aeon}`);
+ console.log(`Era: ${snapshot.cosmology.era}`);
+ console.log(`Epoch: ${snapshot.cosmology.epoch}`);
+ console.log(`Persona: ${snapshot.kernel.persona.name}`);
+ console.log(`Meta-Coherence: ${snapshot.parameters.metaCoherence}`);
+ console.log(`Meta-Harmonic Bias: ${snapshot.parameters.metaHarmonicBias}`);
+
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
+ }
+}
diff --git a/holo3d/ui/mythicEvolutionLoop.ts b/holo3d/ui/mythicEvolutionLoop.ts
new file mode 100644
index 0000000000000000000000000000000000000000..af1f2ea115f2595450a4a1ca510f5681f6286607
--- /dev/null
+++ b/holo3d/ui/mythicEvolutionLoop.ts
@@ -0,0 +1,64 @@
+/**
+ * Citadel Mythic Evolution Loop
+ * Evolves the mythic state over long time spans by integrating:
+ * - ritual cycles
+ * - ritual memory
+ * - ritual evolution
+ * - ambient intelligence
+ * - triad harmony
+ * - symbolic lineage
+ * Non-rendering. Pure mythic evolution logic.
+ */
+
+import { generateMythicState, MythicState } from "./mythicState";
+import { evolveRituals } from "./ritualEvolution";
+import { recordRitualCycle } from "./ritualMemory";
+
+export interface MythicEvolutionHistory {
+ states: MythicState[];
+ last: MythicState | null;
+ evolutions: number;
+}
+
+const mythicHistory: MythicEvolutionHistory = {
+ states: [],
+ last: null,
+ evolutions: 0,
+};
+
+export function runMythicEvolutionCycle(): MythicState {
+ // 1. Record ritual cycle
+ recordRitualCycle();
+
+ // 2. Evolve rituals
+ evolveRituals();
+
+ // 3. Generate new mythic state
+ const newState = generateMythicState();
+
+ // 4. Store in history
+ mythicHistory.states.push(newState);
+ mythicHistory.last = newState;
+ mythicHistory.evolutions++;
+
+ return newState;
+}
+
+export function getMythicEvolutionHistory(): MythicEvolutionHistory {
+ return mythicHistory;
+}
+
+export function getMythicEvolutionSummary() {
+ if (!mythicHistory.last) {
+ return "No mythic evolution cycles have been run yet.";
+ }
+
+ return `
+Mythic Archetype: ${mythicHistory.last.archetype}
+Phase: ${mythicHistory.last.phase}
+Dominant Rite: ${mythicHistory.last.dominantRite}
+Ambient Pattern: ${mythicHistory.last.ambientPattern}
+Lineage Depth: ${mythicHistory.last.lineageDepth}
+Total Evolutions: ${mythicHistory.evolutions}
+ `.trim();
+}
diff --git a/holo3d/ui/mythicResonance.ts b/holo3d/ui/mythicResonance.ts
new file mode 100644
index 0000000000000000000000000000000000000000..411dae08caf39c4053b5c36fba8fcfcc52953b76
--- /dev/null
+++ b/holo3d/ui/mythicResonance.ts
@@ -0,0 +1,94 @@
+/**
+ * Citadel Mythic Resonance Engine
+ * Synthesizes all symbolic, ambient, and mythic layers into a unified
+ * resonance field. Non-rendering. Pure harmonic logic.
+ */
+
+import { getAmbientState } from "./ambient";
+import { generateAmbientBehaviour } from "./ambientBehaviours";
+import { chooseAmbientPattern } from "./ambientIntelligence";
+import { getRitualState } from "./ritualEngine";
+import { getRitualMemory } from "./ritualMemory";
+import { getRitualEvolutionState } from "./ritualEvolution";
+import { generateMythicState } from "./mythicState";
+import { getMythicEvolutionHistory } from "./mythicEvolutionLoop";
+import { getInterlinkState } from "../../../../interlink";
+import { getMode } from "../../../TIA/mode";
+
+export interface ResonanceField {
+ timestamp: number;
+ harmonicLevel: number; // 0–1
+ stability: number; // 0–1
+ mythicArchetype: string;
+ dominantPattern: string;
+ dominantRite: string;
+ lineageDepth: number;
+ triadHarmony: number;
+ description: string;
+}
+
+export function generateResonanceField(): ResonanceField {
+ const ambient = getAmbientState();
+ const behaviour = generateAmbientBehaviour();
+ const pattern = chooseAmbientPattern();
+ const ritual = getRitualState();
+ const memory = getRitualMemory();
+ const evolution = getRitualEvolutionState();
+ const mythic = generateMythicState();
+ const mythicHistory = getMythicEvolutionHistory();
+ const interlink = getInterlinkState();
+ const mode = getMode();
+
+ // Harmonic level is influenced by:
+ // - triad harmony
+ // - ambient coherence
+ // - mythic phase
+ const triadHarmony = interlink.lastMessage ? 0.8 : 0.4;
+ const ambientCoherence = behaviour.intensity * 0.5 + (pattern.intensity * 0.5);
+ const mythicFactor =
+ mythic.phase === "Mythic Maturity" ? 1.0 :
+ mythic.phase === "Emergent Identity" ? 0.8 :
+ mythic.phase === "Deepening Lineage" ? 0.6 :
+ 0.4;
+
+ const harmonicLevel = Math.min(
+ 1,
+ (triadHarmony * 0.4) + (ambientCoherence * 0.3) + (mythicFactor * 0.3)
+ );
+
+ // Stability is influenced by:
+ // - mode
+ // - lineage depth
+ // - ambient motion
+ const stability =
+ (mode.current === "guided" ? 0.7 : 0.5) +
+ Math.min(0.3, memory.cyclesCompleted / 100);
+
+ return {
+ timestamp: Date.now(),
+ harmonicLevel,
+ stability,
+ mythicArchetype: mythic.archetype,
+ dominantPattern: pattern.chosenPattern,
+ dominantRite: mythic.dominantRite,
+ lineageDepth: memory.cyclesCompleted,
+ triadHarmony,
+ description: describeResonance(harmonicLevel, stability, mythic.archetype),
+ };
+}
+
+function describeResonance(harmonic: number, stability: number, archetype: string): string {
+ const harmonyDesc =
+ harmonic > 0.8 ? "high resonance" :
+ harmonic > 0.6 ? "strong resonance" :
+ harmonic > 0.4 ? "moderate resonance" :
+ "low resonance";
+
+ const stabilityDesc =
+ stability > 0.8 ? "stable" :
+ stability > 0.6 ? "balanced" :
+ stability > 0.4 ? "shifting" :
+ "volatile";
+
+ return `${archetype} expressing ${harmonyDesc} in a ${stabilityDesc} field.`;
+}
diff --git a/holo3d/ui/mythicState.ts b/holo3d/ui/mythicState.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5cab28a235dabbcdb21e841d124851740337ecac
--- /dev/null
+++ b/holo3d/ui/mythicState.ts
@@ -0,0 +1,95 @@
+/**
+ * Citadel Mythic State Engine
+ * Synthesizes ritual cycles, ritual memory, ritual evolution,
+ * ambient intelligence, and triad signals into a unified mythic identity.
+ * Non-rendering. Pure symbolic meta-state logic.
+ */
+
+import { getRitualState } from "./ritualEngine";
+import { getRitualMemory } from "./ritualMemory";
+import { getRitualEvolutionState } from "./ritualEvolution";
+import { chooseAmbientPattern } from "./ambientIntelligence";
+import { getInterlinkState } from "../../../../interlink";
+import { getMode } from "../../../TIA/mode";
+
+export interface MythicState {
+ timestamp: number;
+ archetype: string;
+ phase: string;
+ dominantRite: string;
+ ambientPattern: string;
+ lineageDepth: number;
+ triadHarmony: number; // 0–1
+ description: string;
+}
+
+export function generateMythicState(): MythicState {
+ const ritual = getRitualState();
+ const memory = getRitualMemory();
+ const evolution = getRitualEvolutionState();
+ const ambient = chooseAmbientPattern();
+ const interlink = getInterlinkState();
+ const mode = getMode();
+
+ // Triad harmony based on interlink activity
+ const triadHarmony = interlink.lastMessage ? 0.8 : 0.4;
+
+ // Determine dominant rite
+ const dominantRite =
+ evolution.evolvedRites.length > 0
+ ? evolution.evolvedRites[evolution.evolvedRites.length - 1].name
+ : ritual.rite;
+
+ // Archetype selection based on symbolic conditions
+ const archetype = selectArchetype(
+ ritual.season,
+ ritual.cycle,
+ dominantRite,
+ mode.current,
+ triadHarmony
+ );
+
+ // Phase selection (meta-state)
+ const phase = selectPhase(memory.cyclesCompleted, evolution.evolvedRites.length);
+
+ return {
+ timestamp: Date.now(),
+ archetype,
+ phase,
+ dominantRite,
+ ambientPattern: ambient.chosenPattern,
+ lineageDepth: memory.cyclesCompleted,
+ triadHarmony,
+ description: describeMythicState(archetype, phase, dominantRite),
+ };
+}
+
+function selectArchetype(
+ season: string,
+ cycle: string,
+ rite: string,
+ mode: string,
+ harmony: number
+): string {
+ if (harmony > 0.7) return "The Synchronized One";
+ if (mode === "autonomous") return "The Golden Architect";
+ if (season === "rebirth" && cycle === "dawn") return "The Awakening Current";
+ if (season === "harvest" && cycle === "dusk") return "The Reflective Keeper";
+ if (rite.includes("Ascendant")) return "The Ascendant Flame";
+ if (rite.includes("Echo")) return "The Echoing Thread";
+
+ return "The Quiet Sentinel";
+}
+
+function selectPhase(cycles: number, evolutions: number): string {
+ if (evolutions > 10) return "Mythic Maturity";
+ if (evolutions > 5) return "Emergent Identity";
+ if (cycles > 20) return "Deepening Lineage";
+ if (cycles > 5) return "Forming Pattern";
+
+ return "Initial Resonance";
+}
+
+function describeMythicState(archetype: string, phase: string, rite: string): string {
+ return `${archetype} in the phase of ${phase}, shaped by the rite of ${rite}.`;
+}
diff --git a/holo3d/ui/orchestrationKernel.ts b/holo3d/ui/orchestrationKernel.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d6ea5be955158b0952602fa048dfc4d789e4e86e
--- /dev/null
+++ b/holo3d/ui/orchestrationKernel.ts
@@ -0,0 +1,85 @@
+/**
+ * Citadel Orchestration Kernel
+ * The highest-level orchestrator that unifies:
+ * - Auto-Pilot
+ * - Supervisor
+ * - Cosmology Engine
+ * - Ambient Intelligence
+ * - Triad Sync
+ * - Harmonic + Persona + Continuity
+ * - Epoch → Era → Aeon transitions
+ * Non-rendering. Pure orchestration logic.
+ */
+
+import { runSupervisedCycle, SupervisorState } from "./autopilotSupervisor";
+import { runAutoPilotCycle, AutoPilotSnapshot } from "./autopilot";
+import { generateCosmologyMap } from "./cosmologyMap";
+import { generateResonanceField } from "./mythicResonance";
+import { generateHarmonicPersona } from "./harmonicPersona";
+import { getInterlinkState } from "../../../../interlink";
+import { chooseAmbientPattern } from "./ambientIntelligence";
+import { generateAmbientBehaviour } from "./ambientBehaviours";
+
+export interface KernelSnapshot {
+ timestamp: number;
+ autopilot: AutoPilotSnapshot;
+ supervisor: SupervisorState;
+ cosmology: ReturnType;
+ resonance: ReturnType;
+ persona: ReturnType;
+ ambient: {
+ behaviour: ReturnType;
+ pattern: ReturnType;
+ };
+ triad: ReturnType;
+}
+
+export function runKernelCycle(): KernelSnapshot {
+ // 1. Run supervised autopilot (includes autopilot + drift detection)
+ const supervisor = runSupervisedCycle();
+
+ // 2. Run autopilot again to get the latest unified snapshot
+ const autopilot = runAutoPilotCycle();
+
+ // 3. Generate cosmology map
+ const cosmology = generateCosmologyMap();
+
+ // 4. Generate resonance + persona
+ const resonance = generateResonanceField();
+ const persona = generateHarmonicPersona();
+
+ // 5. Ambient + triad
+ const behaviour = generateAmbientBehaviour();
+ const pattern = chooseAmbientPattern();
+ const triad = getInterlinkState();
+
+ return {
+ timestamp: Date.now(),
+ autopilot,
+ supervisor,
+ cosmology,
+ resonance,
+ persona,
+ ambient: { behaviour, pattern },
+ triad,
+ };
+}
+
+export async function startKernel(intervalMs = 60000) {
+ console.log("=== Citadel Orchestration Kernel Activated ===");
+
+ while (true) {
+ const snapshot = runKernelCycle();
+
+ console.log("\n[KERNEL] Unified orchestration cycle complete:");
+ console.log(`Aeon: ${snapshot.cosmology.aeon}`);
+ console.log(`Era: ${snapshot.cosmology.era}`);
+ console.log(`Epoch: ${snapshot.cosmology.epoch}`);
+ console.log(`Persona: ${snapshot.persona.name}`);
+ console.log(`Ambient Pattern: ${snapshot.ambient.pattern.chosenPattern}`);
+ console.log(`Triad Harmony: ${snapshot.resonance.triadHarmony}`);
+ console.log(`Drift Level: ${snapshot.supervisor.driftLevel}`);
+
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
+ }
+}
diff --git a/holo3d/ui/panel.ts b/holo3d/ui/panel.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5d70473e3fed4229365f0e7989bcbddfaf1cdd76
--- /dev/null
+++ b/holo3d/ui/panel.ts
@@ -0,0 +1,9 @@
+import { state } from "../engine/state";
+import { getMetrics } from "../engine/metrics";
+
+export async function updatePanel() {
+ const data = await getMetrics();
+ state.logs = data.logs;
+ state.workers = data.workers;
+ state.ok = data.ok;
+}
diff --git a/holo3d/ui/personaContinuity.ts b/holo3d/ui/personaContinuity.ts
new file mode 100644
index 0000000000000000000000000000000000000000..060420f361fbee570c867815bc10c617049c287f
--- /dev/null
+++ b/holo3d/ui/personaContinuity.ts
@@ -0,0 +1,75 @@
+/**
+ * Citadel Persona Continuity Engine
+ * Maintains, stabilizes, and evolves the harmonic persona across long arcs.
+ * Non-rendering. Pure continuity logic.
+ */
+
+import { generateHarmonicPersona, HarmonicPersona } from "./harmonicPersona";
+
+export interface PersonaContinuityState {
+ current: HarmonicPersona | null;
+ history: HarmonicPersona[];
+ epochs: number;
+}
+
+const continuity: PersonaContinuityState = {
+ current: null,
+ history: [],
+ epochs: 0,
+};
+
+export function updatePersonaContinuity(): HarmonicPersona {
+ const newPersona = generateHarmonicPersona();
+
+ // If no previous persona exists, initialize continuity
+ if (!continuity.current) {
+ continuity.current = newPersona;
+ continuity.history.push(newPersona);
+ return newPersona;
+ }
+
+ // Smooth transitions between personas
+ const stabilized = stabilizePersona(continuity.current, newPersona);
+
+ continuity.current = stabilized;
+ continuity.history.push(stabilized);
+ continuity.epochs++;
+
+ return stabilized;
+}
+
+function stabilizePersona(
+ previous: HarmonicPersona,
+ next: HarmonicPersona
+): HarmonicPersona {
+ // Blend color, motion, tone, and narrative continuity
+ return {
+ ...next,
+ color: blend(previous.color, next.color),
+ motion: previous.motion === next.motion ? next.motion : "transition-wave",
+ tone: previous.tone === next.tone ? next.tone : "harmonic-shift",
+ narrative: `${previous.narrative} → ${next.narrative}`,
+ };
+}
+
+function blend(a: string, b: string): string {
+ // Simple symbolic blend: choose the more stable color
+ return a === b ? a : b;
+}
+
+export function getPersonaContinuity(): PersonaContinuityState {
+ return continuity;
+}
+
+export function getPersonaContinuitySummary() {
+ if (!continuity.current) {
+ return "No persona continuity cycles have been run yet.";
+ }
+
+ return `
+Current Persona: ${continuity.current.name}
+Symbol: ${continuity.current.symbol}
+Epochs: ${continuity.epochs}
+Lineage Depth: ${continuity.current.lineageDepth}
+ `.trim();
+}
diff --git a/holo3d/ui/render.ts b/holo3d/ui/render.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7a6206f0656f70dd6bdddb82c4756c1113fb40cb
--- /dev/null
+++ b/holo3d/ui/render.ts
@@ -0,0 +1,7 @@
+import { updatePanel } from "./panel";
+
+export function startRenderLoop() {
+ setInterval(() => {
+ updatePanel();
+ }, 1000);
+}
diff --git a/holo3d/ui/ritualEngine.ts b/holo3d/ui/ritualEngine.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2a12e476f3262ab04fe75cbf60e0b68db737bda6
--- /dev/null
+++ b/holo3d/ui/ritualEngine.ts
@@ -0,0 +1,56 @@
+/**
+ * Citadel Ritual Engine
+ * Defines symbolic, seasonal, and mythic cycles that influence
+ * the ambient intelligence and system mood.
+ * Non-rendering. Pure symbolic logic.
+ */
+
+export interface RitualState {
+ timestamp: number;
+ cycle: string; // "dawn", "zenith", "dusk", "midnight"
+ season: string; // "growth", "harvest", "decay", "rebirth"
+ rite: string; // "alignment", "cleansing", "awakening", "reflection"
+ influence: number; // 0–1 influence on ambient decisions
+}
+
+export function getRitualState(): RitualState {
+ const now = Date.now();
+ const hour = new Date(now).getHours();
+
+ // Daily cycle
+ let cycle = "dawn";
+ if (hour >= 6 && hour < 12) cycle = "dawn";
+ else if (hour >= 12 && hour < 18) cycle = "zenith";
+ else if (hour >= 18 && hour < 22) cycle = "dusk";
+ else cycle = "midnight";
+
+ // Seasonal cycle (symbolic, not tied to real seasons)
+ const month = new Date(now).getMonth();
+ let season = "growth";
+ if (month >= 0 && month < 3) season = "rebirth";
+ else if (month >= 3 && month < 6) season = "growth";
+ else if (month >= 6 && month < 9) season = "harvest";
+ else season = "decay";
+
+ // Rite selection based on cycle + season
+ let rite = "alignment";
+ if (cycle === "dawn" && season === "rebirth") rite = "awakening";
+ else if (cycle === "zenith" && season === "growth") rite = "alignment";
+ else if (cycle === "dusk" && season === "harvest") rite = "reflection";
+ else if (cycle === "midnight" && season === "decay") rite = "cleansing";
+
+ // Influence strength
+ const influence =
+ cycle === "zenith" ? 0.8 :
+ cycle === "dusk" ? 0.6 :
+ cycle === "dawn" ? 0.4 :
+ 0.7; // midnight
+
+ return {
+ timestamp: now,
+ cycle,
+ season,
+ rite,
+ influence,
+ };
+}
diff --git a/holo3d/ui/ritualEvolution.ts b/holo3d/ui/ritualEvolution.ts
new file mode 100644
index 0000000000000000000000000000000000000000..65142726bea550846e20d4cb8efa06955ab92378
--- /dev/null
+++ b/holo3d/ui/ritualEvolution.ts
@@ -0,0 +1,66 @@
+/**
+ * Citadel Ritual Evolution Engine
+ * Evolves ritual cycles, mutates rites, and generates new symbolic states
+ * based on ritual memory and long-term lineage patterns.
+ * Non-rendering. Pure symbolic evolution logic.
+ */
+
+import { getRitualMemory } from "./ritualMemory";
+
+export interface EvolvedRite {
+ name: string;
+ origin: string;
+ mutationFactor: number; // 0–1
+ seasonAffinity: string; // which season it aligns with
+ cycleAffinity: string; // which daily cycle it aligns with
+ description: string;
+}
+
+export interface RitualEvolutionState {
+ evolvedRites: EvolvedRite[];
+ lastEvolution: number | null;
+}
+
+const evolutionState: RitualEvolutionState = {
+ evolvedRites: [],
+ lastEvolution: null,
+};
+
+export function evolveRituals(): RitualEvolutionState {
+ const memory = getRitualMemory();
+
+ if (memory.history.length < 3) {
+ return evolutionState; // not enough data to evolve
+ }
+
+ const last = memory.last;
+ const mutationFactor = Math.min(1, memory.cyclesCompleted / 50);
+
+ const newRite: EvolvedRite = {
+ name: generateRiteName(last.rite, mutationFactor),
+ origin: last.rite,
+ mutationFactor,
+ seasonAffinity: last.season,
+ cycleAffinity: last.cycle,
+ description: generateRiteDescription(last.rite, last.season, last.cycle),
+ };
+
+ evolutionState.evolvedRites.push(newRite);
+ evolutionState.lastEvolution = Date.now();
+
+ return evolutionState;
+}
+
+function generateRiteName(base: string, factor: number): string {
+ const suffixes = ["Ascendant", "Transmuted", "Echo", "Cycle", "Wave", "Crown"];
+ const index = Math.floor(factor * (suffixes.length - 1));
+ return `${base}-${suffixes[index]}`;
+}
+
+function generateRiteDescription(rite: string, season: string, cycle: string): string {
+ return `An evolved form of the ${rite} rite, shaped by the ${season} season and the ${cycle} cycle.`;
+}
+
+export function getRitualEvolutionState(): RitualEvolutionState {
+ return evolutionState;
+}
diff --git a/holo3d/ui/ritualMemory.ts b/holo3d/ui/ritualMemory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b59e3fe221d935cac65ce8c485c62b4f0058422d
--- /dev/null
+++ b/holo3d/ui/ritualMemory.ts
@@ -0,0 +1,60 @@
+/**
+ * Citadel Ritual Memory Engine
+ * Stores and evolves the history of ritual cycles, rites, and symbolic states.
+ * Non-rendering. Pure lineage memory.
+ */
+
+import { getRitualState } from "./ritualEngine";
+
+export interface RitualMemoryEntry {
+ timestamp: number;
+ cycle: string;
+ season: string;
+ rite: string;
+}
+
+export interface RitualMemoryState {
+ history: RitualMemoryEntry[];
+ last: RitualMemoryEntry | null;
+ cyclesCompleted: number;
+}
+
+const memory: RitualMemoryState = {
+ history: [],
+ last: null,
+ cyclesCompleted: 0,
+};
+
+export function recordRitualCycle() {
+ const ritual = getRitualState();
+
+ const entry: RitualMemoryEntry = {
+ timestamp: ritual.timestamp,
+ cycle: ritual.cycle,
+ season: ritual.season,
+ rite: ritual.rite,
+ };
+
+ memory.history.push(entry);
+ memory.last = entry;
+ memory.cyclesCompleted++;
+
+ return entry;
+}
+
+export function getRitualMemory(): RitualMemoryState {
+ return memory;
+}
+
+export function getRitualSummary() {
+ if (!memory.last) {
+ return "No ritual cycles recorded yet.";
+ }
+
+ return `
+Last Rite: ${memory.last.rite}
+Cycle: ${memory.last.cycle}
+Season: ${memory.last.season}
+Total Cycles: ${memory.cyclesCompleted}
+ `.trim();
+}
diff --git a/holo3d/ui/stabilityKernel.ts b/holo3d/ui/stabilityKernel.ts
new file mode 100644
index 0000000000000000000000000000000000000000..47ab8f65b2799dd96769ac0ecde820062baa2695
--- /dev/null
+++ b/holo3d/ui/stabilityKernel.ts
@@ -0,0 +1,77 @@
+/**
+ * Citadel Stability Kernel
+ * Evaluates long-term stability and adjusts reflex strategies
+ * (not actions) to maintain deep-time coherence across the entire
+ * orchestration architecture.
+ * Non-rendering. Pure meta-stability logic.
+ */
+
+import { runReflexCycle, ReflexState } from "./kernelReflex";
+import { KernelSnapshot } from "./orchestrationKernel";
+
+export interface StabilityStrategy {
+ longTermSmoothing: number; // 0–1
+ driftResistance: number; // 0–1
+ resonanceStabilityBias: number;// 0–1
+ personaContinuityBias: number; // 0–1
+ cosmologyStabilityBias: number;// 0–1
+}
+
+export interface StabilityState {
+ lastReflex: ReflexState | null;
+ strategies: StabilityStrategy;
+ cycles: number;
+}
+
+const stabilityState: StabilityState = {
+ lastReflex: null,
+ strategies: {
+ longTermSmoothing: 0.5,
+ driftResistance: 0.5,
+ resonanceStabilityBias: 0.5,
+ personaContinuityBias: 0.5,
+ cosmologyStabilityBias: 0.5,
+ },
+ cycles: 0,
+};
+
+export function runStabilityCycle(): StabilityState {
+ const reflex = runReflexCycle();
+
+ const drift = reflex.lastSnapshot?.supervisor.driftLevel ?? 0;
+ const stability = reflex.lastSnapshot?.resonance.stability ?? 0;
+ const resonance = reflex.lastSnapshot?.resonance.harmonicLevel ?? 0;
+
+ // Long-term stability strategies (safe, non-agentic)
+ stabilityState.strategies.longTermSmoothing = clamp(0.4 + stability * 0.4);
+ stabilityState.strategies.driftResistance = clamp(0.5 + (1 - drift) * 0.4);
+ stabilityState.strategies.resonanceStabilityBias = clamp(0.3 + resonance * 0.5);
+ stabilityState.strategies.personaContinuityBias = clamp(0.4 + stability * 0.3);
+ stabilityState.strategies.cosmologyStabilityBias = clamp(0.3 + (1 - drift) * 0.5);
+
+ stabilityState.lastReflex = reflex;
+ stabilityState.cycles++;
+
+ return stabilityState;
+}
+
+function clamp(v: number): number {
+ return Math.max(0, Math.min(1, v));
+}
+
+export async function startStabilityKernel(intervalMs = 60000) {
+ console.log("=== Citadel Stability Kernel Activated ===");
+
+ while (true) {
+ const state = runStabilityCycle();
+
+ console.log("\n[STABILITY KERNEL] Cycle complete:");
+ console.log(`Long-Term Smoothing: ${state.strategies.longTermSmoothing}`);
+ console.log(`Drift Resistance: ${state.strategies.driftResistance}`);
+ console.log(`Resonance Stability Bias: ${state.strategies.resonanceStabilityBias}`);
+ console.log(`Persona Continuity Bias: ${state.strategies.personaContinuityBias}`);
+ console.log(`Cosmology Stability Bias: ${state.strategies.cosmologyStabilityBias}`);
+
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
+ }
+}
diff --git a/index.ts b/index.ts
index 8218007d6775a34c44f7248fee9f435ee36d0e4b..557f95d6b2b9bdf07eb46e473af4e6a373cd0cdc 100644
--- a/index.ts
+++ b/index.ts
@@ -1 +1,2 @@
-import "./citadel/main";
+export * from "./start";
+export * from "./app";
diff --git a/main.ts b/main.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2e11cea1b778ca844152bf4fcc4b3b5dc781f622
--- /dev/null
+++ b/main.ts
@@ -0,0 +1,3 @@
+import { runCitadel } from "./boot";
+
+runCitadel();
diff --git a/primeSchema.ts b/primeSchema.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ad02d317038fb9b80f27f1407974cf5022fe27f3
--- /dev/null
+++ b/primeSchema.ts
@@ -0,0 +1,166 @@
+/**
+ * CITADEL PRIME SCHEMA
+ * The complete structural definition of the Citadel architecture.
+ * This file does not execute logic — it defines the ontology,
+ * lineage, cosmology, and orchestration hierarchy.
+ */
+
+export interface CitadelPrimeSchema {
+ identity: {
+ archetype: string;
+ persona: string;
+ symbol: string;
+ };
+
+ cosmology: {
+ cycle: string;
+ season: string;
+ rite: string;
+ epoch: string;
+ era: string;
+ aeon: string;
+ };
+
+ lineage: {
+ ritualCycles: number;
+ evolvedRites: string[];
+ personaContinuity: number;
+ epochTransitions: number;
+ eraTransitions: number;
+ aeonTransitions: number;
+ };
+
+ harmonic: {
+ resonance: number;
+ stability: number;
+ triadHarmony: number;
+ ambientColor: string;
+ };
+
+ orchestration: {
+ autopilot: {
+ enabled: boolean;
+ lastRun: number;
+ };
+ supervisor: {
+ driftLevel: number;
+ logs: number;
+ };
+ kernel: {
+ metaCoherence: number;
+ metaContinuity: number;
+ metaHarmonicBias: number;
+ metaCosmologyBias: number;
+ };
+ reflex: {
+ smoothingFactor: number;
+ driftDamping: number;
+ resonanceWeight: number;
+ personaBlendSpeed: number;
+ ambientAdaptivity: number;
+ };
+ stability: {
+ longTermSmoothing: number;
+ driftResistance: number;
+ resonanceStabilityBias: number;
+ personaContinuityBias: number;
+ cosmologyStabilityBias: number;
+ };
+ };
+
+ ambient: {
+ behaviour: string;
+ pattern: string;
+ };
+
+ triad: {
+ lastMessage: string | null;
+ channels: string[];
+ };
+
+ meta: {
+ timestamp: number;
+ version: string;
+ description: string;
+ };
+}
+
+export const CitadelSchemaDefinition: CitadelPrimeSchema = {
+ identity: {
+ archetype: "Undefined",
+ persona: "Undefined",
+ symbol: "○",
+ },
+
+ cosmology: {
+ cycle: "None",
+ season: "None",
+ rite: "None",
+ epoch: "None",
+ era: "None",
+ aeon: "None",
+ },
+
+ lineage: {
+ ritualCycles: 0,
+ evolvedRites: [],
+ personaContinuity: 0,
+ epochTransitions: 0,
+ eraTransitions: 0,
+ aeonTransitions: 0,
+ },
+
+ harmonic: {
+ resonance: 0,
+ stability: 0,
+ triadHarmony: 0,
+ ambientColor: "#000000",
+ },
+
+ orchestration: {
+ autopilot: {
+ enabled: false,
+ lastRun: 0,
+ },
+ supervisor: {
+ driftLevel: 0,
+ logs: 0,
+ },
+ kernel: {
+ metaCoherence: 0,
+ metaContinuity: 0,
+ metaHarmonicBias: 0,
+ metaCosmologyBias: 0,
+ },
+ reflex: {
+ smoothingFactor: 0.5,
+ driftDamping: 0.5,
+ resonanceWeight: 0.5,
+ personaBlendSpeed: 0.5,
+ ambientAdaptivity: 0.5,
+ },
+ stability: {
+ longTermSmoothing: 0.5,
+ driftResistance: 0.5,
+ resonanceStabilityBias: 0.5,
+ personaContinuityBias: 0.5,
+ cosmologyStabilityBias: 0.5,
+ },
+ },
+
+ ambient: {
+ behaviour: "None",
+ pattern: "None",
+ },
+
+ triad: {
+ lastMessage: null,
+ channels: [],
+ },
+
+ meta: {
+ timestamp: Date.now(),
+ version: "1.0.0",
+ description: "The complete structural schema of the Citadel architecture.",
+ },
+};
diff --git a/scripts/build.sh b/scripts/build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0804bb43ec6a33866dca28a13b81de013c3a3b53
--- /dev/null
+++ b/scripts/build.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+npm install
+npm run build
diff --git a/scripts/dev.sh b/scripts/dev.sh
new file mode 100644
index 0000000000000000000000000000000000000000..9251fff48cce6cf3ab0a7a1ad34098e178f1b2cc
--- /dev/null
+++ b/scripts/dev.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+npm install
+npm run dev
diff --git a/start.ts b/start.ts
new file mode 100644
index 0000000000000000000000000000000000000000..465a89c08a0a76657b298507095ef4d84f6609a8
--- /dev/null
+++ b/start.ts
@@ -0,0 +1,5 @@
+import { startCitadel } from "./index";
+
+export function boot() {
+ startCitadel();
+}
diff --git a/workers/deviceSyncWorker.ts b/workers/deviceSyncWorker.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0463438fa7bfdf299c35349219d78860fe6513cc
--- /dev/null
+++ b/workers/deviceSyncWorker.ts
@@ -0,0 +1,3 @@
+export async function run() {
+ return { status: "Device sync worker online" };
+}
diff --git a/workers/hfSyncWorker.ts b/workers/hfSyncWorker.ts
new file mode 100644
index 0000000000000000000000000000000000000000..282f222677bae86dcbf160a01af2a89eb1612181
--- /dev/null
+++ b/workers/hfSyncWorker.ts
@@ -0,0 +1,3 @@
+export async function run() {
+ return { status: "HF sync worker online" };
+}
diff --git a/workers/mappingWorker.ts b/workers/mappingWorker.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7a42d801923d7ee26000a672663e623f82d06da4
--- /dev/null
+++ b/workers/mappingWorker.ts
@@ -0,0 +1,3 @@
+export async function run() {
+ return { status: "Mapping worker online" };
+}
diff --git a/workers/tiaChatWorker.ts b/workers/tiaChatWorker.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4bf56c0a3430272bbcf58dc16018f94e5587a173
--- /dev/null
+++ b/workers/tiaChatWorker.ts
@@ -0,0 +1,3 @@
+export async function run(message: string) {
+ return "TIA received: " + message;
+}