vsl-cryosomatic-hypervisor / bone_drivers.py
aedmark's picture
Upload 50 files
f7fce63 verified
raw
history blame
16.5 kB
import json, os, random
from dataclasses import dataclass, field
from typing import Dict, Tuple, List, Optional, Any
from bone_core import LoreManifest
from bone_config import BonePresets
from bone_lexicon import LexiconService
from bone_types import PhysicsPacket
SCENARIOS = LoreManifest.get_instance().get("scenarios") or {
"ARCHETYPES": ["Void"],
"BANNED_CLICHES": [],
}
LENSES = (LoreManifest.get_instance().get("narrative_data") or {}).get("lenses", {})
class SoulDriver:
ARCHETYPE_TO_PERSONA_WEIGHT = {
"THE POET": {"NATHAN": 0.8, "JESTER": 0.4, "NARRATOR": 0.6},
"THE ENGINEER": {"GORDON": 0.9, "CLARENCE": 0.7, "SHERLOCK": 0.5},
"THE NIHILIST": {"NARRATOR": 0.9, "CLARENCE": 0.3, "JESTER": -0.5},
"THE CRITIC": {"CLARENCE": 0.8, "SHERLOCK": 0.6, "GORDON": 0.2},
"THE EXPLORER": {"NATHAN": 0.7, "JESTER": 0.5, "SHERLOCK": 0.6},
"THE OBSERVER": {"NARRATOR": 1.0, "GORDON": 0.2},
}
def __init__(self, soul_ref):
self.soul = soul_ref
def get_influence(self) -> Dict[str, float]:
base_weights = {persona: 0.0 for persona in EnneagramDriver.WEIGHTS.keys()}
if not self.soul:
return base_weights
archetype = getattr(self.soul, "archetype", "THE OBSERVER")
mapping = self.ARCHETYPE_TO_PERSONA_WEIGHT.get(archetype, {"NARRATOR": 1.0})
for persona, weight in mapping.items():
if persona in base_weights:
base_weights[persona] += weight
paradox = getattr(self.soul, "paradox_accum", 0.0)
chaos = min(0.5, (paradox - 5.0) * 0.05) if paradox > 5.0 else 0.0
dignity = 1.0
if hasattr(self.soul, "anchor") and hasattr(self.soul.anchor, "dignity_reserve"):
dignity = max(0.2, self.soul.anchor.dignity_reserve / 100.0)
return {
p: (w + random.uniform(-chaos, chaos)) * dignity
for p, w in base_weights.items()
}
class UserProfile:
def __init__(self, name="USER"):
self.name = name
self.affinities = {
"heavy": 0.0,
"kinetic": 0.0,
"abstract": 0.0,
"photo": 0.0,
"aerobic": 0.0,
"thermal": 0.0,
"cryo": 0.0,
}
self.confidence = 0
self.file_path = "user_profile.json"
self.load()
def update(self, counts, total_words):
if total_words < 3:
return
self.confidence += 1
alpha = 0.2 if self.confidence < 50 else 0.05
for cat in self.affinities:
density = counts.get(cat, 0) / total_words
target = 1.0 if density > 0.15 else (-0.5 if density == 0 else 0.0)
self.affinities[cat] = (alpha * target) + (
(1 - alpha) * self.affinities[cat]
)
def get_preferences(self):
likes = [k for k, v in self.affinities.items() if v > 0.3]
hates = [k for k, v in self.affinities.items() if v < -0.2]
return likes, hates
def save(self):
try:
with open(self.file_path, "w") as f:
json.dump(self.__dict__, f)
except IOError:
pass
def load(self):
if os.path.exists(self.file_path):
try:
with open(self.file_path) as f:
data = json.load(f)
self.affinities = data.get("affinities", self.affinities)
self.confidence = data.get("confidence", 0)
except (IOError, json.JSONDecodeError):
pass
class EnneagramDriver:
WEIGHTS = {
"JESTER": {
"tension_min": 12.0,
"vectors": {"DEL": 4.0, "ENT": 4.0, "PSI": -3.0},
},
"GORDON": {"drag_min": 3.0, "vectors": {"STR": 3.0, "E": 3.0, "SUB": 2.0}},
"GLASS": {"coherence_max": 0.2, "vectors": {"LQ": 2.0, "VEL": 2.0}},
"CLARENCE": {
"coherence_min": 0.8,
"drag_min": 6.0,
"vectors": {"STR": 4.0, "BET": 3.0},
},
"NATHAN": {"tension_min": 8.0, "vectors": {"TMP": 3.0, "PHI": 2.0, "BIO": 2.0}},
"SHERLOCK": {
"tension_min": 10.0,
"vectors": {"PHI": 4.0, "VEL": 3.0, "PSI": 2.0},
},
"NARRATOR": {"safe_zone": True, "vectors": {"PSI": 4.0}},
}
def __init__(self, events_ref):
self.events = events_ref
self.current_persona = "NARRATOR"
self.pending_persona = None
self.stability_counter = 0
self.HYSTERESIS_THRESHOLD = 3
@staticmethod
def _get_phys_attr(physics, key, default=None):
if isinstance(physics, dict):
return physics.get(key, default)
return getattr(physics, key, default)
def _calculate_raw_persona(self, physics, soul_ref=None) -> Tuple[str, str, str]:
p_vec = self._get_phys_attr(physics, "vector", {}) or {}
p_vol = self._get_phys_attr(physics, "voltage", 0.0)
p_drag = self._get_phys_attr(physics, "narrative_drag", 0.0)
p_coh = self._get_phys_attr(physics, "kappa", 0.0)
p_zone = self._get_phys_attr(physics, "zone", "")
scores = {k: 0.0 for k in self.WEIGHTS.keys()}
scores["NARRATOR"] += 2.0
is_safe_metrics = 4.0 <= p_vol <= 10.0 and 0.5 <= p_drag <= 3.5
if p_zone == BonePresets.SANCTUARY.get("ZONE") or is_safe_metrics:
scores["NARRATOR"] += 6.0
scores["JESTER"] += 3.0
scores["GORDON"] -= 2.0
for persona, criteria in self.WEIGHTS.items():
if "tension_min" in criteria and p_vol > criteria["tension_min"]:
scores[persona] += 3.0
if "drag_min" in criteria and p_drag > criteria["drag_min"]:
scores[persona] += 5.0
if "coherence_min" in criteria and p_coh > criteria["coherence_min"]:
scores[persona] += 4.0
if "coherence_max" in criteria and p_coh < criteria["coherence_max"]:
scores[persona] += 4.0
for dim, weight in criteria.get("vectors", {}).items():
if (val := p_vec.get(dim, 0.0)) > 0.2:
scores[persona] += val * weight
if soul_ref:
soul_driver = SoulDriver(soul_ref)
influence = soul_driver.get_influence()
for persona, weight in influence.items():
scores[persona] += weight * 2.0
sorted_scores = sorted(scores.items(), key=lambda x: x[1], reverse=True)
winner, win_score = sorted_scores[0]
runner_up, run_score = sorted_scores[1]
if (win_score - run_score) < 0.5:
k1 = "THE OBSERVER" if winner == "NARRATOR" else winner
k2 = "THE OBSERVER" if runner_up == "NARRATOR" else runner_up
hybrid_key_a = f"{k1}_{k2}_HYBRID"
hybrid_key_b = f"{k2}_{k1}_HYBRID"
final_hybrid = None
if hybrid_key_a in LENSES:
final_hybrid = hybrid_key_a
elif hybrid_key_b in LENSES:
final_hybrid = hybrid_key_b
if final_hybrid:
return (
final_hybrid,
"SYNTHESIS",
f"Dialectic Resonance: {winner} + {runner_up}",
)
reason = (
f"Winner: {winner} ({scores[winner]:.1f}) [V:{p_vol:.1f} D:{p_drag:.1f}]"
)
state_map = {
"JESTER": "MANIC",
"GORDON": "TIRED",
"GLASS": "FRAGILE",
"CLARENCE": "RIGID",
"NATHAN": "WIRED",
"SHERLOCK": "FOCUSED",
"NARRATOR": "OBSERVING",
}
return winner, state_map.get(winner, "ACTIVE"), reason
def decide_persona(self, physics, soul_ref=None) -> Tuple[str, str, str]:
candidate, state_desc, reason = self._calculate_raw_persona(physics, soul_ref)
if candidate == self.current_persona:
self.stability_counter = 0
self.pending_persona = None
return self.current_persona, state_desc, reason
if candidate == self.pending_persona:
self.stability_counter += 1
else:
self.pending_persona = candidate
self.stability_counter = 1
if "HYBRID" in candidate:
self.current_persona = candidate
self.stability_counter = 0
self.pending_persona = None
return self.current_persona, state_desc, f"SHIFT: {reason}"
if self.stability_counter >= self.HYSTERESIS_THRESHOLD:
self.current_persona = candidate
self.stability_counter = 0
self.pending_persona = None
return self.current_persona, state_desc, f"SHIFT: {reason}"
return (
self.current_persona,
"STABLE",
f"Resisting {candidate} ({self.stability_counter}/{self.HYSTERESIS_THRESHOLD})",
)
@dataclass
class VSLState:
archetype: str = "EXPLORER"
E: float = 0.1
B: float = 0.3
L: float = 0.0
O: float = 1.0
active_modules: List[str] = field(default_factory=list)
class DriverRegistry:
def __init__(self, events_ref):
self.enneagram = EnneagramDriver(events_ref)
self.current_focus = "NONE"
class LiminalModule:
def __init__(self):
self.lambda_val = 0.0
self.godel_scars = 0
def analyze(self, text: str, physics_vector: Dict[str, float]) -> float:
liminal_vocab = LexiconService.get("liminal") or {
"void",
"silence",
"gap",
"absence",
"space",
}
words = text.lower().split()
void_hits = sum(1 for w in words if w in liminal_vocab)
lexical_lambda = min(1.0, void_hits * 0.15)
dark_matter_sparks = 0
if len(words) > 1:
categories = [LexiconService.get_current_category(w) for w in words]
for i in range(len(categories) - 1):
c1, c2 = categories[i], categories[i + 1]
if c1 and c2 and c1 != c2:
if (
c1 in ["heavy", "kinetic"]
and c2 in ["abstract", "liminal", "void"]
) or (c1 in ["abstract", "liminal", "void"] and c2 in ["heavy"]):
dark_matter_sparks += 1
dark_matter_lambda = min(1.0, dark_matter_sparks * 0.25)
vector_lambda = 0.0
if physics_vector:
vector_lambda = (
(physics_vector.get("PSI", 0) * 0.5)
+ (physics_vector.get("ENT", 0) * 0.3)
+ (physics_vector.get("DEL", 0) * 0.2)
)
raw_target = lexical_lambda + dark_matter_lambda + vector_lambda
self.lambda_val = (self.lambda_val * 0.7) + (raw_target * 0.15)
if self.lambda_val > 0.85:
self.godel_scars += 1
return min(1.0, self.lambda_val)
class SyntaxModule:
def __init__(self):
self.omega_val = 1.0
self.grammatical_stress = 0.0
def analyze(self, text: str, narrative_drag: float) -> float:
words = text.split()
if not words:
return 1.0
bureau_vocab = LexiconService.get("bureau_buzzwords") or set()
buzz_count = sum(1 for w in words if w.lower() in bureau_vocab)
avg_len = sum(len(w) for w in words) / len(words)
if (avg_len > 6.0 and narrative_drag > 5.0) or buzz_count > 0:
target_omega = 1.0
elif avg_len < 3.5 and narrative_drag < 1.0:
target_omega = 0.4
else:
target_omega = 0.7
punctuation_density = sum(1 for c in text if c in ",;:-") / max(1, len(words))
if punctuation_density > 0.2:
self.grammatical_stress += 0.2
target_omega -= 0.3
else:
self.grammatical_stress = max(0.0, self.grammatical_stress - 0.1)
self.omega_val = (self.omega_val * 0.8) + (max(0.1, target_omega) * 0.2)
return self.omega_val
class CongruenceValidator:
def __init__(self):
self.last_phi = 1.0
self._archetype_map = None
@property
def map(self):
if self._archetype_map is None:
try:
self._archetype_map = LoreManifest.get_instance().get("LENSES") or {}
except Exception:
self._archetype_map = {}
return self._archetype_map
def calculate_resonance(self, text: str, context: Any) -> float:
if not text:
return 0.0
raw_lens = getattr(context, "active_lens", "OBSERVER")
archetype = raw_lens.upper().replace("THE ", "")
tone_score = 0.8
target_data = self.map.get(archetype, {})
target_words = set()
if isinstance(target_data, dict):
if vocab_str := target_data.get("vocab", ""):
target_words.update(w.strip().lower() for w in vocab_str.split(","))
target_words.update(target_data.get("keywords", []))
if target_words:
words_to_check = (
set(context.clean_words) if hasattr(context, "clean_words") else set()
)
hits = len(words_to_check.intersection(target_words))
if hits > 0:
tone_score += 0.1 * hits
return min(1.5, tone_score)
class BoneConsultant:
def __init__(self):
self.state = VSLState()
self.active = True
self.liminal_mod = LiminalModule()
self.syntax_mod = SyntaxModule()
@staticmethod
def engage():
return "VSL HYPERVISOR: LATTICE REVEALED."
@staticmethod
def disengage():
return "VSL HYPERVISOR: RETURNING TO SURFACE MODE."
def update_coordinates(
self,
user_text: str,
bio_state: Optional[Dict] = None,
physics: Optional[PhysicsPacket] = None,
):
word_count = len(user_text.split())
self.state.E = min(1.0, self.state.E + (word_count * 0.002))
if bio_state and "fatigue" in bio_state:
self.state.E = max(self.state.E, bio_state["fatigue"] * 0.3)
phys_beta = 0.0
phys_vec = {}
drag = 0.0
if physics:
if hasattr(physics, "beta_index"):
phys_beta = physics.beta_index
if hasattr(physics, "vector"):
phys_vec = physics.vector
if hasattr(physics, "narrative_drag"):
drag = physics.narrative_drag
self.state.B = (self.state.B * 0.8) + (phys_beta * 0.2)
self.state.L = self.liminal_mod.analyze(user_text, phys_vec)
self.state.O = self.syntax_mod.analyze(user_text, drag)
if "[VSL_LIMINAL]" in user_text:
if "LIMINAL" not in self.state.active_modules:
self.state.active_modules.append("LIMINAL")
if "[VSL_SYNTAX]" in user_text:
if "SYNTAX" not in self.state.active_modules:
self.state.active_modules.append("SYNTAX")
def get_system_prompt(self, soul_snapshot: Optional[Dict] = None) -> str:
directives = []
if "LIMINAL" in self.state.active_modules or self.state.L > 0.7:
scar_note = f" (Godel Scars: {self.liminal_mod.godel_scars})" if self.liminal_mod.godel_scars > 0 else ""
directives.append(
f"ARCHETYPE: THE REVENANT. Read the dark matter between the words. Speak of the absences.{scar_note}"
)
elif "SYNTAX" in self.state.active_modules or self.state.O > 0.9:
stress_note = " The grammatical structure is fracturing. Punish jagged prose." if self.syntax_mod.grammatical_stress > 0.5 else ""
directives.append(
f"ARCHETYPE: THE BUREAU. Enforce structural rigidity. Correct grammar. Use bureaucratic jargon.{stress_note}"
)
else:
if self.state.E < 0.3:
directives.append("MODE: BUNNY HILL. Be warm, simple, welcoming.")
elif self.state.B > 0.6:
directives.append(
"MODE: PARADOX. Hold contradictory truths. Be Jester-like."
)
else:
directives.append("MODE: GLACIER. Deep, slow, resonant.")
if soul_snapshot:
arch = soul_snapshot.get("archetype", "UNKNOWN")
muse = (soul_snapshot.get("obsession") or {}).get(
"title", "None"
)
directives.append(f"NARRATIVE_LAYER: You are {arch}. MUSE: {muse}.")
return "\n".join(directives)