rumpk/core/ontology.nim

236 lines
6.2 KiB
Nim

# SPDX-License-Identifier: LSL-1.0
# Copyright (c) 2026 Markus Maiwald
# Stewardship: Self Sovereign Society Foundation
#
# This file is part of the Nexus Sovereign Core.
# See legal/LICENSE_SOVEREIGN.md for license terms.
# SPEC-060: System Ontology - Nim Bindings
# Ground Zero Phase 2: Event System
## Event System Nim Bindings
# Kernel logging (freestanding-safe)
proc kprint(s: cstring) {.importc, cdecl.}
proc kprint_hex(n: uint64) {.importc, cdecl.}
proc kprintln(s: cstring) {.importc, cdecl.}
# Import STL from HAL
proc stl_init*() {.importc, cdecl.}
proc stl_emit*(
kind: uint16,
fiber_id: uint64,
entity_id: uint64,
cause_id: uint64,
data0: uint64,
data1: uint64,
data2: uint64
): uint64 {.importc, cdecl.}
proc stl_lookup*(event_id: uint64): pointer {.importc, cdecl.}
proc stl_count*(): uint32 {.importc, cdecl.}
type
QueryResult* = object
count*: uint32
events*: array[64, pointer]
proc stl_query_by_fiber*(fiber_id: uint64, result: var QueryResult) {.importc, cdecl.}
proc stl_query_by_kind*(kind: uint16, result: var QueryResult) {.importc, cdecl.}
proc stl_get_recent*(max_count: uint32, result: var QueryResult) {.importc, cdecl.}
proc stl_query_by_time_range*(start_ns: uint64, end_ns: uint64, result: var QueryResult) {.importc, cdecl.}
type
LineageResult* = object
count*: uint32
event_ids*: array[16, uint64]
proc stl_trace_lineage*(event_id: uint64, result: var LineageResult) {.importc, cdecl.}
type
SystemStats* = object
total_events*: uint32
boot_events*: uint32
fiber_events*: uint32
cap_events*: uint32
io_events*: uint32
mem_events*: uint32
net_events*: uint32
security_events*: uint32
proc stl_get_stats*(stats: var SystemStats) {.importc, cdecl.}
proc stl_export_binary*(dest: pointer, max_size: uint64): uint64 {.importc, cdecl.}
## Event Types (Mirror from ontology.zig)
type
EventKind* = enum
EvNull = 0
# Lifecycle
EvSystemBoot = 1
EvSystemShutdown = 2
EvFiberSpawn = 3
EvFiberTerminate = 4
# Capability
EvCapabilityGrant = 10
EvCapabilityRevoke = 11
EvCapabilityDelegate = 12
# I/O
EvChannelOpen = 20
EvChannelClose = 21
EvChannelRead = 22
EvChannelWrite = 23
# Memory
EvMemoryAllocate = 30
EvMemoryFree = 31
EvMemoryMap = 32
# Network
EvNetworkPacketRx = 40
EvNetworkPacketTx = 41
# Security
EvAccessDenied = 50
EvPolicyViolation = 51
## High-level API for kernel use
proc emit_system_boot*(): uint64 =
## Emit system boot event
return stl_emit(
uint16(EvSystemBoot),
0, # fiber_id (kernel)
0, # entity_id
0, # cause_id
0, 0, 0 # data
)
proc emit_fiber_spawn*(fiber_id: uint64, parent_id: uint64, cause_id: uint64 = 0): uint64 =
## Emit fiber spawn event
return stl_emit(
uint16(EvFiberSpawn),
parent_id,
fiber_id,
cause_id,
0, 0, 0
)
proc emit_capability_grant*(
fiber_id: uint64,
cap_type: uint8,
object_id: uint64,
slot: uint32,
cause_id: uint64 = 0
): uint64 =
## Emit capability grant event
return stl_emit(
uint16(EvCapabilityGrant),
fiber_id,
object_id,
cause_id,
uint64(cap_type),
uint64(slot),
0
)
proc emit_channel_write*(
fiber_id: uint64,
channel_id: uint64,
bytes_written: uint64,
cause_id: uint64 = 0
): uint64 =
## Emit channel write event
return stl_emit(
uint16(EvChannelWrite),
fiber_id,
channel_id,
cause_id,
bytes_written,
0, 0
)
proc emit_access_denied*(
fiber_id: uint64,
resource_id: uint64,
attempted_perm: uint8,
cause_id: uint64 = 0
): uint64 =
## Emit access denied event (security)
return stl_emit(
uint16(EvAccessDenied),
fiber_id,
resource_id,
cause_id,
uint64(attempted_perm),
0, 0
)
proc emit_policy_violation*(
fiber_id: uint64,
budget_ns: uint64,
actual_ns: uint64,
violation_count: uint32,
cause_id: uint64 = 0
): uint64 {.exportc, cdecl.} =
## Emit budget violation event to STL (The Ratchet, M4.5)
return stl_emit(
uint16(EvPolicyViolation),
fiber_id,
budget_ns,
cause_id,
actual_ns,
uint64(violation_count),
0
)
## Initialization
proc init_stl_subsystem*() =
## Initialize the STL subsystem (call from kmain)
stl_init()
kprintln("[STL] System Truth Ledger initialized")
## Query API
proc stl_print_summary*() {.exportc, cdecl.} =
## Print a summary of the STL ledger to the console
var stats: SystemStats
stl_get_stats(stats)
kprintln("\n[STL] System Truth Ledger Summary:")
kprint("[STL] Total Events: "); kprint_hex(uint64(stats.total_events)); kprintln("")
kprint("[STL] Lifecycle: "); kprint_hex(uint64(stats.boot_events + stats.fiber_events)); kprintln("")
kprint("[STL] Capabilities: "); kprint_hex(uint64(stats.cap_events)); kprintln("")
kprint("[STL] I/O & Channels: "); kprint_hex(uint64(stats.io_events)); kprintln("")
kprint("[STL] Memory: "); kprint_hex(uint64(stats.mem_events)); kprintln("")
kprint("[STL] Security/Policy: "); kprint_hex(uint64(stats.security_events)); kprintln("")
# Demonstrate Causal Graph for the last event
if stats.total_events > 0:
let last_id = uint64(stats.total_events - 1)
var lineage: LineageResult
stl_trace_lineage(last_id, lineage)
kprintln("\n[STL] Causal Graph Audit:");
kprint("[STL] Target: "); kprint_hex(last_id); kprintln("")
for i in 0..<lineage.count:
let eid = lineage.event_ids[i]
let ev_ptr = stl_lookup(eid)
if i > 0: kprintln(" |")
kprint(" +-- ["); kprint_hex(eid); kprint("] ")
if ev_ptr != nil:
# Kind is at offset 0 (2 bytes)
let kind_val = cast[ptr uint16](ev_ptr)[]
if kind_val == uint16(EvSystemBoot): kprintln("SystemBoot")
elif kind_val == uint16(EvFiberSpawn): kprintln("FiberSpawn")
elif kind_val == uint16(EvCapabilityGrant): kprintln("CapGrant")
elif kind_val == uint16(EvAccessDenied): kprintln("AccessDenied")
else:
kprint("Kind="); kprint_hex(uint64(kind_val)); kprintln("")
else:
kprintln("Unknown")
kprintln("\n[STL] Summary complete.")
proc export_stl_binary*(dest: pointer, max_size: uint64): uint64 =
## Export STL events to a binary buffer
return stl_export_binary(dest, max_size)