Implement GlyphOS Event System

Add lightweight, in-process event bus with Cognitive Kernel integration:

New Components:
- glyphos/events.py: EventBus class + functional API
  * EventBus: publish/subscribe pattern with history
  * Event type definitions (EventType literal)
  * Singleton: get_event_bus(), emit(), on()
  * History filtering and limits
  * Graceful handler error handling

- tests/test_events.py: Comprehensive test suite (16 tests, 100% pass)
  * EventBus subscription/publishing/history
  * Global singleton behavior
  * Functional API (on, emit, get_event_bus)
  * Kernel integration tests
  * Cognition event emission tests

Modified:
- glyphos/cognitive_kernel.py: Event emissions at key points
  * kernel.warmup.completed: After warmup() completes
  * cognition.started: At start of execute_gx()
  * cognition.completed: After execute_gx() completes
  * glyph.resonance.updated: When glyph resonance present

- glyphos/__init__.py: Export events module

Test Results:
- Registry tests:          12/12 
- Bridge tests:            10/10 
- Kernel tests:             8/8  
- Event system tests:      16/16  (NEW)
- Integration tests:        6/6  
- Total:                   52/52 

No breaking changes - all 36 existing tests still pass.
This commit is contained in:
GlyphRunner System
2026-05-20 18:11:25 -04:00
parent 9f4f31e2a3
commit 9792449157
4 changed files with 807 additions and 2 deletions
+44
View File
@@ -10,6 +10,7 @@ from pathlib import Path
from gx_lain.runtime import execute_gx_path, load_gx, normalize_segments, map_lanes, build_envelope, execute_with_lain
from glyphs.super_registry import load_all_supercharged, super_stats
from glyphos.events import emit
class CognitiveKernel:
@@ -44,6 +45,9 @@ class CognitiveKernel:
Records:
- Kernel startup time
Emits:
- kernel.warmup.completed event
"""
if self._warmed_up:
return
@@ -58,6 +62,12 @@ class CognitiveKernel:
self._warmed_up = True
# Emit warmup completed event
emit("kernel.warmup.completed", {
"glyph_stats": self._glyph_stats_cache,
"startup_time": self._startup_time,
})
def execute_gx(
self,
gx_path: str,
@@ -78,10 +88,22 @@ class CognitiveKernel:
- output_text: Rendered analysis
- cognition_trace: Step-by-step processing
- diagnostics: Performance metrics + glyph resonance
Emits:
- cognition.started event
- cognition.completed event
- glyph.resonance.updated event (if glyph resonance present)
"""
if not self._warmed_up:
self.warmup()
# Emit cognition started event
emit("cognition.started", {
"gx_path": gx_path,
"mode": mode,
"context": context,
})
# Build context with mode
exec_context = context or {}
exec_context["cognitive_mode"] = mode
@@ -93,6 +115,28 @@ class CognitiveKernel:
self._last_result = result
self._last_mode = mode
# Extract event payload from result
fused_symbol = result.get("fused_symbol", {})
diagnostics = result.get("diagnostics", {})
# Emit cognition completed event
emit("cognition.completed", {
"gx_path": gx_path,
"mode": mode,
"elapsed": diagnostics.get("elapsed"),
"glyph_resonance": diagnostics.get("glyph_resonance"),
"summary": fused_symbol.get("summary"),
})
# Emit glyph resonance event if present
glyph_resonance = diagnostics.get("glyph_resonance")
if glyph_resonance and glyph_resonance.get("glyph_found"):
emit("glyph.resonance.updated", {
"glyph_id": glyph_resonance.get("glyph_id"),
"glyph_score": glyph_resonance.get("glyph_score"),
"glyph_resonance": glyph_resonance,
})
return result
def execute_symbolic(