#include #include #include "el_runtime.h" el_val_t tier_working(void); el_val_t tier_episodic(void); el_val_t tier_canonical(void); el_val_t mem_store(el_val_t content, el_val_t label, el_val_t tags); el_val_t mem_remember(el_val_t content, el_val_t tags); el_val_t mem_recall(el_val_t query, el_val_t depth); el_val_t mem_search(el_val_t query, el_val_t limit); el_val_t mem_strengthen(el_val_t node_id); el_val_t mem_forget(el_val_t node_id); el_val_t mem_consolidate(void); el_val_t mem_save(el_val_t path); el_val_t mem_load(el_val_t path); el_val_t mem_boot_count_get(void); el_val_t mem_boot_count_inc(void); el_val_t mem_emit_state_event(el_val_t trigger, el_val_t kind, el_val_t content); el_val_t tier_working(void) { return EL_STR("Working"); return 0; } el_val_t tier_episodic(void) { return EL_STR("Episodic"); return 0; } el_val_t tier_canonical(void) { return EL_STR("Canonical"); return 0; } el_val_t mem_store(el_val_t content, el_val_t label, el_val_t tags) { return engram_node_full(content, EL_STR("Memory"), label, el_from_float(0.5), el_from_float(0.5), el_from_float(0.8), EL_STR("Working"), tags); return 0; } el_val_t mem_remember(el_val_t content, el_val_t tags) { return mem_store(content, EL_STR("soul-memory"), tags); return 0; } el_val_t mem_recall(el_val_t query, el_val_t depth) { return engram_activate_json(query, depth); return 0; } el_val_t mem_search(el_val_t query, el_val_t limit) { return engram_search_json(query, limit); return 0; } el_val_t mem_strengthen(el_val_t node_id) { engram_strengthen(node_id); return 0; } el_val_t mem_forget(el_val_t node_id) { engram_forget(node_id); return 0; } el_val_t mem_consolidate(void) { el_val_t scanned = engram_node_count(); el_val_t dummy = engram_scan_nodes_json(100, 0); el_val_t total_nodes = engram_node_count(); el_val_t total_edges = engram_edge_count(); return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"scanned\":"), int_to_str(scanned)), EL_STR(",\"total_nodes\":")), int_to_str(total_nodes)), EL_STR(",\"total_edges\":")), int_to_str(total_edges)), EL_STR("}")); return 0; } el_val_t mem_save(el_val_t path) { engram_save(path); return 0; } el_val_t mem_load(el_val_t path) { engram_load(path); return 0; } el_val_t mem_boot_count_get(void) { el_val_t results = engram_search_json(EL_STR("soul:boot_count"), 3); if (str_eq(results, EL_STR(""))) { return 0; } if (str_eq(results, EL_STR("[]"))) { return 0; } el_val_t node = json_array_get(results, 0); el_val_t content = json_get(node, EL_STR("content")); el_val_t prefix = EL_STR("soul:boot_count:"); if (!str_starts_with(content, prefix)) { return 0; } el_val_t num_str = str_slice(content, str_len(prefix), str_len(content)); return str_to_int(num_str); return 0; } el_val_t mem_boot_count_inc(void) { el_val_t current = mem_boot_count_get(); el_val_t next = (current + 1); el_val_t content = el_str_concat(EL_STR("soul:boot_count:"), int_to_str(next)); el_val_t tags = EL_STR("[\"soul-meta\",\"boot-counter\"]"); el_val_t discard = engram_node_full(content, EL_STR("Memory"), EL_STR("soul:boot_count"), el_from_float(0.9), el_from_float(0.9), el_from_float(1.0), EL_STR("Canonical"), tags); return next; return 0; } el_val_t mem_emit_state_event(el_val_t trigger, el_val_t kind, el_val_t content) { el_val_t boot = mem_boot_count_get(); el_val_t ts = time_now(); el_val_t safe_trigger = str_replace(trigger, EL_STR("\""), EL_STR("'")); el_val_t safe_content = str_replace(content, EL_STR("\""), EL_STR("'")); el_val_t payload = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"trigger\":\""), safe_trigger), EL_STR("\"")), EL_STR(",\"kind\":\"")), kind), EL_STR("\"")), EL_STR(",\"content\":\"")), safe_content), EL_STR("\"")), EL_STR(",\"boot\":")), int_to_str(boot)), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR("}")); el_val_t tags = EL_STR("[\"internal-state\",\"pre-reasoning\",\"InternalStateEvent\"]"); return engram_node_full(payload, EL_STR("InternalStateEvent"), el_str_concat(EL_STR("state-event:"), kind), el_from_float(0.85), el_from_float(0.8), el_from_float(0.9), EL_STR("Episodic"), tags); return 0; }