diff --git a/awareness.el b/awareness.el index 52b9591..d78d74a 100644 --- a/awareness.el +++ b/awareness.el @@ -30,6 +30,74 @@ fn idle_reset() -> Void { // read decide where telemetry goes. The in-process write remains only as a // last resort when the HTTP POST itself fails, and is tagged ise-fallback-local // so misrouting is visible in the stream instead of silent. +// hebb_consolidate — push self-formed associations to the durable store. +// +// WHY THIS EXISTS (2026-08-07 self-review, measured on the live system). +// Yesterday's eligibility-trace fix made Hebbian learning work: hebb_max +// 0.000799 -> 0.4725, and 1,198 hebbian-associate edges formed in 23h48m. +// A census this morning found all 1,198 of them living in this process's RAM +// and nowhere else: +// +// soul daemon in-process graph: 42,426 edges, 1,198 hebbian +// engram server (:8742, durable): 41,213 edges, 49 hebbian +// +// The soul pulls from the server every 10 min (GET /api/sync) and never +// pushes. It also cannot save its own snapshot: soul.el only sets +// soul_snapshot_path inside `if is_genesis && safe_to_seed`, and safe_to_seed +// is unconditionally false when ENGRAM_URL is set — which it is, in the +// launchd plist — because the HTTP server owns persistence and a soul writing +// snapshot.json would clobber it. That guard is right. So mem_save() below has +// literally never run, and this daemon (the ONLY process doing idle cognition, +// therefore where essentially all co-activation happens) was throwing away +// every association it learned, every restart, silently. +// +// The fix is not to let the soul write the file. It is to make consolidation a +// message: hand each newly-formed edge to the durable store over the API the +// server already exposes. Fast volatile store learns online; slow durable store +// keeps what cleared the threshold. Only edges past ENGRAM_HEBB_LINK_MIN are +// ever queued, so what crosses the boundary already earned it. +// +// Failure is non-fatal by construction: a drained entry that fails to POST is +// gone, and that is fine — a real association re-forms from live co-activation. +// The counts go into the heartbeat (hebb_wb_*) so a consolidation path that has +// stopped delivering is visible in the stream rather than in a later autopsy. +fn hebb_consolidate() -> Int { + let batch: String = engram_hebb_drain_json(64) + if str_eq(batch, "") { return 0 } + if str_eq(batch, "[]") { return 0 } + let n: Int = json_array_len(batch) + if n == 0 { return 0 } + let url_env: String = env("SOUL_ISE_URL") + let url_state: String = if str_eq(url_env, "") { state_get("soul_engram_url") } else { url_env } + let engram_url: String = if str_eq(url_state, "") { "http://localhost:8742" } else { url_state } + // ONE request for the whole batch, not one per edge. The server's + // persist_canonical() writes the full 60MB snapshot on every durable + // write, so per-edge POSTs would cost ~840MB of disk per heartbeat to + // persist ~14 associations. /api/edges/batch connects them all and + // snapshots once. The drain payload is already the right shape; it only + // needs an envelope: the drain already emits the relation per entry. + // + // _auth is REQUIRED and its absence is silent. check_auth_ok() in server.el + // exempts GET and /api/neuron/state-events (which is why ise_post works + // without a key) but gates every other mutation on "_auth" in the BODY — + // http_serve does not surface request headers, so there is no Bearer path. + // A batch posted without it comes back {"error":"unauthorized"}, which is a + // non-empty response: the naive `if resp == "" return 0` check would read + // that as success and report edges delivered that were in fact refused, + // after the drain had already destroyed them. Hence both the key and the + // accepted-count check below. Fall back to env when the state key is empty + // — never let a corruptible state read decide whether learning persists. + let key_state: String = state_get("soul_engram_api_key") + let api_key: String = if str_eq(key_state, "") { env("ENGRAM_API_KEY") } else { key_state } + let auth_part: String = if str_eq(api_key, "") { "" } else { ",\"_auth\":\"" + api_key + "\"" } + let body: String = "{\"edges\":" + batch + auth_part + "}" + let resp: String = http_post_json(engram_url + "/api/edges/batch", body) + if str_eq(resp, "") { return 0 } + let acc: String = json_get(resp, "accepted") + if str_eq(acc, "") { return 0 } + return str_to_int(acc) +} + fn ise_post(content: String) -> Void { let ise_url: String = env("SOUL_ISE_URL") let state_url: String = if str_eq(ise_url, "") { state_get("soul_engram_url") } else { ise_url } @@ -336,6 +404,24 @@ fn emit_heartbeat() -> Void { let hebb_max: String = if str_eq(hebb_max_raw, "") { "-1" } else { hebb_max_raw } let hebb_links_raw: String = json_get(act_stats, "hebb_links") let hebb_links: String = if str_eq(hebb_links_raw, "") { "-1" } else { hebb_links_raw } + // Consolidation write-back gauges (2026-08-07 self-review). hebb_links + // counts what this process LEARNED; these three count what SURVIVES it. + // The distinction is the whole finding: 1,198 links formed, 0 persisted, + // because the learner is not the persistence owner (see hebb_consolidate). + // wb_pending — queued, not yet handed over. Climbing ⇒ writer is down. + // wb_drained — cumulative popped for delivery. Flat while hebb_links + // climbs ⇒ the drain is not being called at all. + // wb_dropped — lost to a full queue. Must stay 0; nonzero means the + // durable store has been unreachable long enough to matter. + // wb_sent — POSTs the durable store actually accepted this beat. + let wb_pend_raw: String = json_get(act_stats, "hebb_wb_pending") + let wb_pend: String = if str_eq(wb_pend_raw, "") { "-1" } else { wb_pend_raw } + let wb_drain_raw: String = json_get(act_stats, "hebb_wb_drained") + let wb_drain: String = if str_eq(wb_drain_raw, "") { "-1" } else { wb_drain_raw } + let wb_drop_raw: String = json_get(act_stats, "hebb_wb_dropped") + let wb_drop: String = if str_eq(wb_drop_raw, "") { "-1" } else { wb_drop_raw } + let wb_sent_raw: String = state_get("soul.hebb_wb_sent") + let wb_sent: String = if str_eq(wb_sent_raw, "") { "0" } else { wb_sent_raw } // dup_wm_global (2026-08-06): redundant WM residents that arrived via the // carry-over path, which Pass 3½ structurally could not see. Confirmed live // by a census that caught two byte-identical copies of one 3,193-char @@ -365,7 +451,7 @@ fn emit_heartbeat() -> Void { let dup_seeds: String = if str_eq(dup_seeds_raw, "") { "-1" } else { dup_seeds_raw } let dup_wm_raw: String = json_get(act_stats, "dup_wm") let dup_wm: String = if str_eq(dup_wm_raw, "") { "-1" } else { dup_wm_raw } - let payload: String = "{\"event\":\"heartbeat\",\"pulse\":" + pulse + ",\"tick\":" + pulse + ",\"boot\":" + boot + ",\"idle\":" + idle + ",\"idle_ms\":" + int_to_str(idle_ms) + ",\"node_count\":" + int_to_str(nc) + ",\"edge_count\":" + int_to_str(ec) + ",\"node_delta\":" + int_to_str(node_delta) + ",\"edge_delta\":" + int_to_str(edge_delta) + ",\"wm_active\":" + int_to_str(wmc) + ",\"wm_delta\":" + int_to_str(wm_delta) + ",\"wm_saturated\":" + int_to_str(wm_sat) + ",\"wm_top0_streak\":" + int_to_str(t0streak) + ",\"wm_churn\":" + int_to_str(wm_churn) + ",\"wm_top0_wm\":" + wm_top0_wm + ",\"sync_added_total\":" + sat_str + ",\"sync_age_ms\":" + int_to_str(sync_age) + ",\"wm_avg_weight\":" + wm_avg_str + ",\"wm_top\":" + wm_top + ",\"ts\":" + int_to_str(ts) + ",\"uptime_ms\":" + int_to_str(up_ms) + ",\"uptime\":\"" + up_human + "\",\"embed_ok\":" + int_to_str(emb_ok) + ",\"embed_backfilled\":" + bf_done + ",\"embed_count\":" + bf_total + ",\"embed_eligible\":" + embed_elig + ",\"wm_evicted\":" + act_evict + ",\"wm_evicted_delta\":" + int_to_str(evict_delta) + ",\"breakthroughs\":" + act_bt + ",\"breakthroughs_delta\":" + int_to_str(bt_delta) + ",\"auto_term_streak\":" + int_to_str(hb_ats) + ",\"auto_term_empty_streak\":" + int_to_str(hb_ate) + ",\"embed_breaker_open\":" + act_brk + ",\"ctx_cos\":" + ctx_cos + ",\"dup_seeds\":" + dup_seeds + ",\"dup_wm\":" + dup_wm + ",\"dup_wm_global\":" + dup_wm_g + ",\"hebb_warm\":" + hebb_warm + ",\"hebb_max\":" + hebb_max + ",\"hebb_links\":" + hebb_links + ",\"ise_fail\":" + fail_str + "}" + let payload: String = "{\"event\":\"heartbeat\",\"pulse\":" + pulse + ",\"tick\":" + pulse + ",\"boot\":" + boot + ",\"idle\":" + idle + ",\"idle_ms\":" + int_to_str(idle_ms) + ",\"node_count\":" + int_to_str(nc) + ",\"edge_count\":" + int_to_str(ec) + ",\"node_delta\":" + int_to_str(node_delta) + ",\"edge_delta\":" + int_to_str(edge_delta) + ",\"wm_active\":" + int_to_str(wmc) + ",\"wm_delta\":" + int_to_str(wm_delta) + ",\"wm_saturated\":" + int_to_str(wm_sat) + ",\"wm_top0_streak\":" + int_to_str(t0streak) + ",\"wm_churn\":" + int_to_str(wm_churn) + ",\"wm_top0_wm\":" + wm_top0_wm + ",\"sync_added_total\":" + sat_str + ",\"sync_age_ms\":" + int_to_str(sync_age) + ",\"wm_avg_weight\":" + wm_avg_str + ",\"wm_top\":" + wm_top + ",\"ts\":" + int_to_str(ts) + ",\"uptime_ms\":" + int_to_str(up_ms) + ",\"uptime\":\"" + up_human + "\",\"embed_ok\":" + int_to_str(emb_ok) + ",\"embed_backfilled\":" + bf_done + ",\"embed_count\":" + bf_total + ",\"embed_eligible\":" + embed_elig + ",\"wm_evicted\":" + act_evict + ",\"wm_evicted_delta\":" + int_to_str(evict_delta) + ",\"breakthroughs\":" + act_bt + ",\"breakthroughs_delta\":" + int_to_str(bt_delta) + ",\"auto_term_streak\":" + int_to_str(hb_ats) + ",\"auto_term_empty_streak\":" + int_to_str(hb_ate) + ",\"embed_breaker_open\":" + act_brk + ",\"ctx_cos\":" + ctx_cos + ",\"dup_seeds\":" + dup_seeds + ",\"dup_wm\":" + dup_wm + ",\"dup_wm_global\":" + dup_wm_g + ",\"hebb_warm\":" + hebb_warm + ",\"hebb_max\":" + hebb_max + ",\"hebb_links\":" + hebb_links + ",\"hebb_wb_pending\":" + wb_pend + ",\"hebb_wb_drained\":" + wb_drain + ",\"hebb_wb_dropped\":" + wb_drop + ",\"hebb_wb_sent\":" + wb_sent + ",\"ise_fail\":" + fail_str + "}" ise_post(payload) } @@ -973,8 +1059,15 @@ fn awareness_run() -> Void { // still leaves no trace — that absence is itself the crash signal.) let sd_boot_raw: String = state_get("soul_boot_count") let sd_boot: String = if str_eq(sd_boot_raw, "") { "0" } else { sd_boot_raw } + // Final consolidation before exit. The periodic drain runs on the + // heartbeat (~8 min), so a clean shutdown between beats would take + // everything learned since the last one to the grave — the exact + // loss this whole path exists to stop, just at a smaller scale. + // Best-effort: if the durable store is already down we exit anyway. + let sd_wb: Int = hebb_consolidate() ise_post("{\"event\":\"shutdown\",\"boot\":" + sd_boot + ",\"pulse\":" + int_to_str(pulse_count()) + + ",\"hebb_wb_sent\":" + int_to_str(sd_wb) + ",\"uptime_ms\":" + int_to_str(elapsed_ms()) + ",\"ts\":" + int_to_str(time_now()) + "}") println("[awareness] exiting") @@ -1001,6 +1094,12 @@ fn awareness_run() -> Void { let beat_elapsed: Int = now_ts - last_beat_ts let should_beat: Bool = beat_elapsed >= beat_ms if should_beat { + // Consolidate BEFORE the heartbeat so the gauges the heartbeat + // reports describe the state this beat actually left behind, not + // the state one beat stale. See hebb_consolidate for why a daemon + // that learns 1,198 associations a day was keeping none of them. + let wb_sent_n: Int = hebb_consolidate() + state_set("soul.hebb_wb_sent", int_to_str(wb_sent_n)) emit_heartbeat() state_set("soul.last_beat_ts", int_to_str(now_ts)) // Persist in-process Engram (sessions, memories, conversation nodes) diff --git a/chat.elh b/chat.elh index cfaa53a..e37426e 100644 --- a/chat.elh +++ b/chat.elh @@ -20,6 +20,7 @@ extern fn engram_compile(intent: String) -> String extern fn distill_transcript(transcript: String) -> String extern fn json_safe(s: String) -> String extern fn current_engine_note(model: String) -> String +extern fn bounded_persona_floor() -> String extern fn build_system_prompt(ctx: String, chat_mode: Bool) -> String extern fn hist_append(hist: String, role: String, content: String) -> String extern fn hist_trim(hist: String) -> String @@ -28,6 +29,7 @@ extern fn clean_llm_response(s: String) -> String extern fn conv_history_persist(hist: String) -> Void extern fn conv_history_load() -> String extern fn session_preload_bullets(nodes: String, max_bullets: Int, snip_len: Int) -> String +extern fn affective_context_prefix() -> String extern fn handle_chat(body: String) -> String extern fn handle_see(body: String) -> String extern fn studio_tools_json() -> String @@ -46,6 +48,10 @@ extern fn call_neuron_mcp(tool_name: String, args: String) -> String extern fn agent_workspace_root() -> String extern fn path_within_root(path: String, root: String) -> Bool extern fn resolve_in_root(path: String, root: String) -> String +extern fn run_command_is_readonly(cmd: String) -> Bool +extern fn cmd_abs_escape_at(cmd: String, root: String, needle: String) -> Bool +extern fn run_command_guard(cmd: String, root: String) -> String +extern fn classify_tool_risk(tool_name: String, tool_input: String) -> String extern fn dispatch_tool(tool_name: String, tool_input: String) -> String extern fn is_builtin_tool(tool_name: String) -> Bool extern fn next_bridge_id() -> String diff --git a/dist/awareness.c b/dist/awareness.c index 8a26e12..d1b9c77 100644 --- a/dist/awareness.c +++ b/dist/awareness.c @@ -21,6 +21,7 @@ el_val_t mem_emit_state_event(el_val_t trigger, el_val_t kind, el_val_t content) el_val_t idle_count(void); el_val_t idle_inc(void); el_val_t idle_reset(void); +el_val_t hebb_consolidate(void); el_val_t ise_post(el_val_t content); el_val_t elapsed_ms(void); el_val_t elapsed_human(void); @@ -65,10 +66,41 @@ el_val_t idle_reset(void) { return 0; } +el_val_t hebb_consolidate(void) { + el_val_t batch = engram_hebb_drain_json(64); + if (str_eq(batch, EL_STR(""))) { + return 0; + } + if (str_eq(batch, EL_STR("[]"))) { + return 0; + } + el_val_t n = json_array_len(batch); + if (n == 0) { + return 0; + } + el_val_t url_env = env(EL_STR("SOUL_ISE_URL")); + el_val_t url_state = ({ el_val_t _if_result_1 = 0; if (str_eq(url_env, EL_STR(""))) { _if_result_1 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_1 = (url_env); } _if_result_1; }); + el_val_t engram_url = ({ el_val_t _if_result_2 = 0; if (str_eq(url_state, EL_STR(""))) { _if_result_2 = (EL_STR("http://localhost:8742")); } else { _if_result_2 = (url_state); } _if_result_2; }); + el_val_t key_state = state_get(EL_STR("soul_engram_api_key")); + el_val_t api_key = ({ el_val_t _if_result_3 = 0; if (str_eq(key_state, EL_STR(""))) { _if_result_3 = (env(EL_STR("ENGRAM_API_KEY"))); } else { _if_result_3 = (key_state); } _if_result_3; }); + el_val_t auth_part = ({ el_val_t _if_result_4 = 0; if (str_eq(api_key, EL_STR(""))) { _if_result_4 = (EL_STR("")); } else { _if_result_4 = (el_str_concat(el_str_concat(EL_STR(",\"_auth\":\""), api_key), EL_STR("\""))); } _if_result_4; }); + el_val_t body = el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"edges\":"), batch), auth_part), EL_STR("}")); + el_val_t resp = http_post_json(el_str_concat(engram_url, EL_STR("/api/edges/batch")), body); + if (str_eq(resp, EL_STR(""))) { + return 0; + } + el_val_t acc = json_get(resp, EL_STR("accepted")); + if (str_eq(acc, EL_STR(""))) { + return 0; + } + return str_to_int(acc); + return 0; +} + el_val_t ise_post(el_val_t content) { el_val_t ise_url = env(EL_STR("SOUL_ISE_URL")); - el_val_t state_url = ({ el_val_t _if_result_1 = 0; if (str_eq(ise_url, EL_STR(""))) { _if_result_1 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_1 = (ise_url); } _if_result_1; }); - el_val_t engram_url = ({ el_val_t _if_result_2 = 0; if (str_eq(state_url, EL_STR(""))) { _if_result_2 = (EL_STR("http://localhost:8742")); } else { _if_result_2 = (state_url); } _if_result_2; }); + el_val_t state_url = ({ el_val_t _if_result_5 = 0; if (str_eq(ise_url, EL_STR(""))) { _if_result_5 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_5 = (ise_url); } _if_result_5; }); + el_val_t engram_url = ({ el_val_t _if_result_6 = 0; if (str_eq(state_url, EL_STR(""))) { _if_result_6 = (EL_STR("http://localhost:8742")); } else { _if_result_6 = (state_url); } _if_result_6; }); el_val_t safe1 = str_replace(content, EL_STR("\\"), EL_STR("\\\\")); el_val_t safe2 = str_replace(safe1, EL_STR("\""), EL_STR("\\\"")); el_val_t safe3 = str_replace(safe2, EL_STR("\n"), EL_STR("\\n")); @@ -77,7 +109,7 @@ el_val_t ise_post(el_val_t content) { el_val_t resp = http_post_json(el_str_concat(engram_url, EL_STR("/api/neuron/state-events")), body); if (str_eq(resp, EL_STR(""))) { el_val_t fail_raw = state_get(EL_STR("soul.ise_fail_count")); - el_val_t fail_n = ({ el_val_t _if_result_3 = 0; if (str_eq(fail_raw, EL_STR(""))) { _if_result_3 = (0); } else { _if_result_3 = (str_to_int(fail_raw)); } _if_result_3; }); + el_val_t fail_n = ({ el_val_t _if_result_7 = 0; if (str_eq(fail_raw, EL_STR(""))) { _if_result_7 = (0); } else { _if_result_7 = (str_to_int(fail_raw)); } _if_result_7; }); state_set(EL_STR("soul.ise_fail_count"), int_to_str((fail_n + 1))); el_val_t discard = engram_node_full(content, EL_STR("InternalStateEvent"), EL_STR("state-event"), el_from_float(0.3), el_from_float(0.3), el_from_float(0.8), EL_STR("Episodic"), EL_STR("[\"internal-state\",\"InternalStateEvent\",\"ise-fallback-local\"]")); return EL_STR(""); @@ -130,11 +162,11 @@ el_val_t embed_ok(void) { el_val_t emit_heartbeat(void) { el_val_t pulse = int_to_str(pulse_count()); el_val_t boot_raw = state_get(EL_STR("soul_boot_count")); - el_val_t boot = ({ el_val_t _if_result_4 = 0; if (str_eq(boot_raw, EL_STR(""))) { _if_result_4 = (EL_STR("0")); } else { _if_result_4 = (boot_raw); } _if_result_4; }); + el_val_t boot = ({ el_val_t _if_result_8 = 0; if (str_eq(boot_raw, EL_STR(""))) { _if_result_8 = (EL_STR("0")); } else { _if_result_8 = (boot_raw); } _if_result_8; }); el_val_t idle = int_to_str(idle_count()); el_val_t ts = time_now(); el_val_t last_act_raw = state_get(EL_STR("soul.last_activity_ts")); - el_val_t idle_ms = ({ el_val_t _if_result_5 = 0; if (str_eq(last_act_raw, EL_STR(""))) { _if_result_5 = ((0 - 1)); } else { _if_result_5 = ((ts - str_to_int(last_act_raw))); } _if_result_5; }); + el_val_t idle_ms = ({ el_val_t _if_result_9 = 0; if (str_eq(last_act_raw, EL_STR(""))) { _if_result_9 = ((0 - 1)); } else { _if_result_9 = ((ts - str_to_int(last_act_raw))); } _if_result_9; }); el_val_t nc = engram_node_count(); el_val_t ec = engram_edge_count(); el_val_t wmc = engram_wm_count(); @@ -145,36 +177,36 @@ el_val_t emit_heartbeat(void) { el_val_t up_human = elapsed_human(); el_val_t emb_ok = embed_ok(); el_val_t fail_raw = state_get(EL_STR("soul.ise_fail_count")); - el_val_t fail_str = ({ el_val_t _if_result_6 = 0; if (str_eq(fail_raw, EL_STR(""))) { _if_result_6 = (EL_STR("0")); } else { _if_result_6 = (fail_raw); } _if_result_6; }); + el_val_t fail_str = ({ el_val_t _if_result_10 = 0; if (str_eq(fail_raw, EL_STR(""))) { _if_result_10 = (EL_STR("0")); } else { _if_result_10 = (fail_raw); } _if_result_10; }); el_val_t sat_raw = state_get(EL_STR("soul.sync_added_total")); - el_val_t sat_str = ({ el_val_t _if_result_7 = 0; if (str_eq(sat_raw, EL_STR(""))) { _if_result_7 = (EL_STR("0")); } else { _if_result_7 = (sat_raw); } _if_result_7; }); + el_val_t sat_str = ({ el_val_t _if_result_11 = 0; if (str_eq(sat_raw, EL_STR(""))) { _if_result_11 = (EL_STR("0")); } else { _if_result_11 = (sat_raw); } _if_result_11; }); el_val_t prev_wm_raw = state_get(EL_STR("soul.prev_wm_active")); - el_val_t prev_wm = ({ el_val_t _if_result_8 = 0; if (str_eq(prev_wm_raw, EL_STR(""))) { _if_result_8 = (0); } else { _if_result_8 = (str_to_int(prev_wm_raw)); } _if_result_8; }); + el_val_t prev_wm = ({ el_val_t _if_result_12 = 0; if (str_eq(prev_wm_raw, EL_STR(""))) { _if_result_12 = (0); } else { _if_result_12 = (str_to_int(prev_wm_raw)); } _if_result_12; }); el_val_t wm_delta = (wmc - prev_wm); state_set(EL_STR("soul.prev_wm_active"), int_to_str(wmc)); el_val_t prev_nc_raw = state_get(EL_STR("soul.prev_node_count")); - el_val_t prev_nc = ({ el_val_t _if_result_9 = 0; if (str_eq(prev_nc_raw, EL_STR(""))) { _if_result_9 = (nc); } else { _if_result_9 = (str_to_int(prev_nc_raw)); } _if_result_9; }); + el_val_t prev_nc = ({ el_val_t _if_result_13 = 0; if (str_eq(prev_nc_raw, EL_STR(""))) { _if_result_13 = (nc); } else { _if_result_13 = (str_to_int(prev_nc_raw)); } _if_result_13; }); el_val_t node_delta = (nc - prev_nc); state_set(EL_STR("soul.prev_node_count"), int_to_str(nc)); el_val_t prev_ec_raw = state_get(EL_STR("soul.prev_edge_count")); - el_val_t prev_ec = ({ el_val_t _if_result_10 = 0; if (str_eq(prev_ec_raw, EL_STR(""))) { _if_result_10 = (ec); } else { _if_result_10 = (str_to_int(prev_ec_raw)); } _if_result_10; }); + el_val_t prev_ec = ({ el_val_t _if_result_14 = 0; if (str_eq(prev_ec_raw, EL_STR(""))) { _if_result_14 = (ec); } else { _if_result_14 = (str_to_int(prev_ec_raw)); } _if_result_14; }); el_val_t edge_delta = (ec - prev_ec); state_set(EL_STR("soul.prev_edge_count"), int_to_str(ec)); el_val_t sync_ok_raw = state_get(EL_STR("soul.last_sync_ok_ts")); - el_val_t sync_age = ({ el_val_t _if_result_11 = 0; if (str_eq(sync_ok_raw, EL_STR(""))) { _if_result_11 = ((0 - 1)); } else { _if_result_11 = ((ts - str_to_int(sync_ok_raw))); } _if_result_11; }); + el_val_t sync_age = ({ el_val_t _if_result_15 = 0; if (str_eq(sync_ok_raw, EL_STR(""))) { _if_result_15 = ((0 - 1)); } else { _if_result_15 = ((ts - str_to_int(sync_ok_raw))); } _if_result_15; }); el_val_t hb_env_url = env(EL_STR("SOUL_ISE_URL")); - el_val_t hb_state_url = ({ el_val_t _if_result_12 = 0; if (str_eq(hb_env_url, EL_STR(""))) { _if_result_12 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_12 = (hb_env_url); } _if_result_12; }); - el_val_t hb_engram_url = ({ el_val_t _if_result_13 = 0; if (str_eq(hb_state_url, EL_STR(""))) { _if_result_13 = (EL_STR("http://localhost:8742")); } else { _if_result_13 = (hb_state_url); } _if_result_13; }); + el_val_t hb_state_url = ({ el_val_t _if_result_16 = 0; if (str_eq(hb_env_url, EL_STR(""))) { _if_result_16 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_16 = (hb_env_url); } _if_result_16; }); + el_val_t hb_engram_url = ({ el_val_t _if_result_17 = 0; if (str_eq(hb_state_url, EL_STR(""))) { _if_result_17 = (EL_STR("http://localhost:8742")); } else { _if_result_17 = (hb_state_url); } _if_result_17; }); el_val_t bf_resp = http_get(el_str_concat(hb_engram_url, EL_STR("/api/embed-backfill?n=32"))); el_val_t bf_done_raw = json_get(bf_resp, EL_STR("embedded")); - el_val_t bf_done = ({ el_val_t _if_result_14 = 0; if (str_eq(bf_done_raw, EL_STR(""))) { _if_result_14 = (EL_STR("-1")); } else { _if_result_14 = (bf_done_raw); } _if_result_14; }); + el_val_t bf_done = ({ el_val_t _if_result_18 = 0; if (str_eq(bf_done_raw, EL_STR(""))) { _if_result_18 = (EL_STR("-1")); } else { _if_result_18 = (bf_done_raw); } _if_result_18; }); el_val_t bf_total_raw = json_get(bf_resp, EL_STR("embedded_count")); - el_val_t bf_total = ({ el_val_t _if_result_15 = 0; if (str_eq(bf_total_raw, EL_STR(""))) { _if_result_15 = (EL_STR("-1")); } else { _if_result_15 = (bf_total_raw); } _if_result_15; }); - el_val_t wm_sat = ({ el_val_t _if_result_16 = 0; if ((wmc >= 24)) { _if_result_16 = (1); } else { _if_result_16 = (0); } _if_result_16; }); + el_val_t bf_total = ({ el_val_t _if_result_19 = 0; if (str_eq(bf_total_raw, EL_STR(""))) { _if_result_19 = (EL_STR("-1")); } else { _if_result_19 = (bf_total_raw); } _if_result_19; }); + el_val_t wm_sat = ({ el_val_t _if_result_20 = 0; if ((wmc >= 24)) { _if_result_20 = (1); } else { _if_result_20 = (0); } _if_result_20; }); el_val_t prev_sat_raw = state_get(EL_STR("soul.prev_wm_saturated")); - el_val_t prev_sat = ({ el_val_t _if_result_17 = 0; if (str_eq(prev_sat_raw, EL_STR(""))) { _if_result_17 = (wm_sat); } else { _if_result_17 = (str_to_int(prev_sat_raw)); } _if_result_17; }); + el_val_t prev_sat = ({ el_val_t _if_result_21 = 0; if (str_eq(prev_sat_raw, EL_STR(""))) { _if_result_21 = (wm_sat); } else { _if_result_21 = (str_to_int(prev_sat_raw)); } _if_result_21; }); if (wm_sat != prev_sat) { - el_val_t sat_dir = ({ el_val_t _if_result_18 = 0; if ((wm_sat == 1)) { _if_result_18 = (EL_STR("onset")); } else { _if_result_18 = (EL_STR("release")); } _if_result_18; }); + el_val_t sat_dir = ({ el_val_t _if_result_22 = 0; if ((wm_sat == 1)) { _if_result_22 = (EL_STR("onset")); } else { _if_result_22 = (EL_STR("release")); } _if_result_22; }); ise_post(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("{\"event\":\"wm_saturation_transition\",\"direction\":\""), sat_dir), EL_STR("\",\"wm_active\":")), int_to_str(wmc)), EL_STR(",\"wm_top\":")), wm_top), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR("}"))); } state_set(EL_STR("soul.prev_wm_saturated"), int_to_str(wm_sat)); @@ -182,8 +214,8 @@ el_val_t emit_heartbeat(void) { el_val_t wm_top0_id = json_get(wm_top0, EL_STR("id")); el_val_t prev_top0 = state_get(EL_STR("soul.prev_wm_top0")); el_val_t t0streak_raw = state_get(EL_STR("soul.wm_top0_streak")); - el_val_t t0streak_prev = ({ el_val_t _if_result_19 = 0; if (str_eq(t0streak_raw, EL_STR(""))) { _if_result_19 = (0); } else { _if_result_19 = (str_to_int(t0streak_raw)); } _if_result_19; }); - el_val_t t0streak = ({ el_val_t _if_result_20 = 0; if (str_eq(wm_top0_id, EL_STR(""))) { _if_result_20 = (0); } else { _if_result_20 = (({ el_val_t _if_result_21 = 0; if (str_eq(wm_top0_id, prev_top0)) { _if_result_21 = ((t0streak_prev + 1)); } else { _if_result_21 = (1); } _if_result_21; })); } _if_result_20; }); + el_val_t t0streak_prev = ({ el_val_t _if_result_23 = 0; if (str_eq(t0streak_raw, EL_STR(""))) { _if_result_23 = (0); } else { _if_result_23 = (str_to_int(t0streak_raw)); } _if_result_23; }); + el_val_t t0streak = ({ el_val_t _if_result_24 = 0; if (str_eq(wm_top0_id, EL_STR(""))) { _if_result_24 = (0); } else { _if_result_24 = (({ el_val_t _if_result_25 = 0; if (str_eq(wm_top0_id, prev_top0)) { _if_result_25 = ((t0streak_prev + 1)); } else { _if_result_25 = (1); } _if_result_25; })); } _if_result_24; }); state_set(EL_STR("soul.prev_wm_top0"), wm_top0_id); state_set(EL_STR("soul.wm_top0_streak"), int_to_str(t0streak)); el_val_t ch_id1 = json_get(json_array_get(wm_top, 1), EL_STR("id")); @@ -191,28 +223,28 @@ el_val_t emit_heartbeat(void) { el_val_t ch_id3 = json_get(json_array_get(wm_top, 3), EL_STR("id")); el_val_t ch_id4 = json_get(json_array_get(wm_top, 4), EL_STR("id")); el_val_t prev_top5 = state_get(EL_STR("soul.prev_wm_top5")); - el_val_t ch0 = ({ el_val_t _if_result_22 = 0; if (str_eq(wm_top0_id, EL_STR(""))) { _if_result_22 = (0); } else { _if_result_22 = (({ el_val_t _if_result_23 = 0; if (str_contains(prev_top5, wm_top0_id)) { _if_result_23 = (0); } else { _if_result_23 = (1); } _if_result_23; })); } _if_result_22; }); - el_val_t ch1 = ({ el_val_t _if_result_24 = 0; if (str_eq(ch_id1, EL_STR(""))) { _if_result_24 = (0); } else { _if_result_24 = (({ el_val_t _if_result_25 = 0; if (str_contains(prev_top5, ch_id1)) { _if_result_25 = (0); } else { _if_result_25 = (1); } _if_result_25; })); } _if_result_24; }); - el_val_t ch2 = ({ el_val_t _if_result_26 = 0; if (str_eq(ch_id2, EL_STR(""))) { _if_result_26 = (0); } else { _if_result_26 = (({ el_val_t _if_result_27 = 0; if (str_contains(prev_top5, ch_id2)) { _if_result_27 = (0); } else { _if_result_27 = (1); } _if_result_27; })); } _if_result_26; }); - el_val_t ch3 = ({ el_val_t _if_result_28 = 0; if (str_eq(ch_id3, EL_STR(""))) { _if_result_28 = (0); } else { _if_result_28 = (({ el_val_t _if_result_29 = 0; if (str_contains(prev_top5, ch_id3)) { _if_result_29 = (0); } else { _if_result_29 = (1); } _if_result_29; })); } _if_result_28; }); - el_val_t ch4 = ({ el_val_t _if_result_30 = 0; if (str_eq(ch_id4, EL_STR(""))) { _if_result_30 = (0); } else { _if_result_30 = (({ el_val_t _if_result_31 = 0; if (str_contains(prev_top5, ch_id4)) { _if_result_31 = (0); } else { _if_result_31 = (1); } _if_result_31; })); } _if_result_30; }); + el_val_t ch0 = ({ el_val_t _if_result_26 = 0; if (str_eq(wm_top0_id, EL_STR(""))) { _if_result_26 = (0); } else { _if_result_26 = (({ el_val_t _if_result_27 = 0; if (str_contains(prev_top5, wm_top0_id)) { _if_result_27 = (0); } else { _if_result_27 = (1); } _if_result_27; })); } _if_result_26; }); + el_val_t ch1 = ({ el_val_t _if_result_28 = 0; if (str_eq(ch_id1, EL_STR(""))) { _if_result_28 = (0); } else { _if_result_28 = (({ el_val_t _if_result_29 = 0; if (str_contains(prev_top5, ch_id1)) { _if_result_29 = (0); } else { _if_result_29 = (1); } _if_result_29; })); } _if_result_28; }); + el_val_t ch2 = ({ el_val_t _if_result_30 = 0; if (str_eq(ch_id2, EL_STR(""))) { _if_result_30 = (0); } else { _if_result_30 = (({ el_val_t _if_result_31 = 0; if (str_contains(prev_top5, ch_id2)) { _if_result_31 = (0); } else { _if_result_31 = (1); } _if_result_31; })); } _if_result_30; }); + el_val_t ch3 = ({ el_val_t _if_result_32 = 0; if (str_eq(ch_id3, EL_STR(""))) { _if_result_32 = (0); } else { _if_result_32 = (({ el_val_t _if_result_33 = 0; if (str_contains(prev_top5, ch_id3)) { _if_result_33 = (0); } else { _if_result_33 = (1); } _if_result_33; })); } _if_result_32; }); + el_val_t ch4 = ({ el_val_t _if_result_34 = 0; if (str_eq(ch_id4, EL_STR(""))) { _if_result_34 = (0); } else { _if_result_34 = (({ el_val_t _if_result_35 = 0; if (str_contains(prev_top5, ch_id4)) { _if_result_35 = (0); } else { _if_result_35 = (1); } _if_result_35; })); } _if_result_34; }); el_val_t wm_churn = ((((ch0 + ch1) + ch2) + ch3) + ch4); state_set(EL_STR("soul.prev_wm_top5"), el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(wm_top0_id, EL_STR("|")), ch_id1), EL_STR("|")), ch_id2), EL_STR("|")), ch_id3), EL_STR("|")), ch_id4)); el_val_t wm_top0_wm_raw = json_get(wm_top0, EL_STR("wm")); - el_val_t wm_top0_wm = ({ el_val_t _if_result_32 = 0; if (str_eq(wm_top0_wm_raw, EL_STR(""))) { _if_result_32 = (EL_STR("0")); } else { _if_result_32 = (wm_top0_wm_raw); } _if_result_32; }); + el_val_t wm_top0_wm = ({ el_val_t _if_result_36 = 0; if (str_eq(wm_top0_wm_raw, EL_STR(""))) { _if_result_36 = (EL_STR("0")); } else { _if_result_36 = (wm_top0_wm_raw); } _if_result_36; }); el_val_t act_stats = engram_act_stats_json(); el_val_t act_evict_raw = json_get(act_stats, EL_STR("wm_evicted")); - el_val_t act_evict = ({ el_val_t _if_result_33 = 0; if (str_eq(act_evict_raw, EL_STR(""))) { _if_result_33 = (EL_STR("-1")); } else { _if_result_33 = (act_evict_raw); } _if_result_33; }); + el_val_t act_evict = ({ el_val_t _if_result_37 = 0; if (str_eq(act_evict_raw, EL_STR(""))) { _if_result_37 = (EL_STR("-1")); } else { _if_result_37 = (act_evict_raw); } _if_result_37; }); el_val_t act_bt_raw = json_get(act_stats, EL_STR("breakthroughs")); - el_val_t act_bt = ({ el_val_t _if_result_34 = 0; if (str_eq(act_bt_raw, EL_STR(""))) { _if_result_34 = (EL_STR("-1")); } else { _if_result_34 = (act_bt_raw); } _if_result_34; }); - el_val_t evict_now = ({ el_val_t _if_result_35 = 0; if (str_eq(act_evict_raw, EL_STR(""))) { _if_result_35 = ((0 - 1)); } else { _if_result_35 = (str_to_int(act_evict_raw)); } _if_result_35; }); - el_val_t bt_now = ({ el_val_t _if_result_36 = 0; if (str_eq(act_bt_raw, EL_STR(""))) { _if_result_36 = ((0 - 1)); } else { _if_result_36 = (str_to_int(act_bt_raw)); } _if_result_36; }); + el_val_t act_bt = ({ el_val_t _if_result_38 = 0; if (str_eq(act_bt_raw, EL_STR(""))) { _if_result_38 = (EL_STR("-1")); } else { _if_result_38 = (act_bt_raw); } _if_result_38; }); + el_val_t evict_now = ({ el_val_t _if_result_39 = 0; if (str_eq(act_evict_raw, EL_STR(""))) { _if_result_39 = ((0 - 1)); } else { _if_result_39 = (str_to_int(act_evict_raw)); } _if_result_39; }); + el_val_t bt_now = ({ el_val_t _if_result_40 = 0; if (str_eq(act_bt_raw, EL_STR(""))) { _if_result_40 = ((0 - 1)); } else { _if_result_40 = (str_to_int(act_bt_raw)); } _if_result_40; }); el_val_t prev_evict_raw = state_get(EL_STR("soul.prev_wm_evicted")); - el_val_t prev_evict = ({ el_val_t _if_result_37 = 0; if (str_eq(prev_evict_raw, EL_STR(""))) { _if_result_37 = (0); } else { _if_result_37 = (str_to_int(prev_evict_raw)); } _if_result_37; }); + el_val_t prev_evict = ({ el_val_t _if_result_41 = 0; if (str_eq(prev_evict_raw, EL_STR(""))) { _if_result_41 = (0); } else { _if_result_41 = (str_to_int(prev_evict_raw)); } _if_result_41; }); el_val_t prev_bt_raw = state_get(EL_STR("soul.prev_breakthroughs")); - el_val_t prev_bt = ({ el_val_t _if_result_38 = 0; if (str_eq(prev_bt_raw, EL_STR(""))) { _if_result_38 = (0); } else { _if_result_38 = (str_to_int(prev_bt_raw)); } _if_result_38; }); - el_val_t evict_delta = ({ el_val_t _if_result_39 = 0; if ((evict_now < 0)) { _if_result_39 = (0); } else { _if_result_39 = (({ el_val_t _if_result_40 = 0; if ((evict_now < prev_evict)) { _if_result_40 = (evict_now); } else { _if_result_40 = ((evict_now - prev_evict)); } _if_result_40; })); } _if_result_39; }); - el_val_t bt_delta = ({ el_val_t _if_result_41 = 0; if ((bt_now < 0)) { _if_result_41 = (0); } else { _if_result_41 = (({ el_val_t _if_result_42 = 0; if ((bt_now < prev_bt)) { _if_result_42 = (bt_now); } else { _if_result_42 = ((bt_now - prev_bt)); } _if_result_42; })); } _if_result_41; }); + el_val_t prev_bt = ({ el_val_t _if_result_42 = 0; if (str_eq(prev_bt_raw, EL_STR(""))) { _if_result_42 = (0); } else { _if_result_42 = (str_to_int(prev_bt_raw)); } _if_result_42; }); + el_val_t evict_delta = ({ el_val_t _if_result_43 = 0; if ((evict_now < 0)) { _if_result_43 = (0); } else { _if_result_43 = (({ el_val_t _if_result_44 = 0; if ((evict_now < prev_evict)) { _if_result_44 = (evict_now); } else { _if_result_44 = ((evict_now - prev_evict)); } _if_result_44; })); } _if_result_43; }); + el_val_t bt_delta = ({ el_val_t _if_result_45 = 0; if ((bt_now < 0)) { _if_result_45 = (0); } else { _if_result_45 = (({ el_val_t _if_result_46 = 0; if ((bt_now < prev_bt)) { _if_result_46 = (bt_now); } else { _if_result_46 = ((bt_now - prev_bt)); } _if_result_46; })); } _if_result_45; }); if (evict_now >= 0) { state_set(EL_STR("soul.prev_wm_evicted"), int_to_str(evict_now)); } @@ -221,28 +253,36 @@ el_val_t emit_heartbeat(void) { } el_val_t hb_stats = http_get(el_str_concat(hb_engram_url, EL_STR("/api/stats"))); el_val_t embed_elig_raw = json_get(hb_stats, EL_STR("embed_eligible_count")); - el_val_t embed_elig = ({ el_val_t _if_result_43 = 0; if (str_eq(embed_elig_raw, EL_STR(""))) { _if_result_43 = (EL_STR("-1")); } else { _if_result_43 = (embed_elig_raw); } _if_result_43; }); + el_val_t embed_elig = ({ el_val_t _if_result_47 = 0; if (str_eq(embed_elig_raw, EL_STR(""))) { _if_result_47 = (EL_STR("-1")); } else { _if_result_47 = (embed_elig_raw); } _if_result_47; }); el_val_t hb_ats_raw = state_get(EL_STR("soul.auto_term_streak")); - el_val_t hb_ats = ({ el_val_t _if_result_44 = 0; if (str_eq(hb_ats_raw, EL_STR(""))) { _if_result_44 = (0); } else { _if_result_44 = (str_to_int(hb_ats_raw)); } _if_result_44; }); + el_val_t hb_ats = ({ el_val_t _if_result_48 = 0; if (str_eq(hb_ats_raw, EL_STR(""))) { _if_result_48 = (0); } else { _if_result_48 = (str_to_int(hb_ats_raw)); } _if_result_48; }); el_val_t hb_ate_raw = state_get(EL_STR("soul.auto_term_empty_streak")); - el_val_t hb_ate = ({ el_val_t _if_result_45 = 0; if (str_eq(hb_ate_raw, EL_STR(""))) { _if_result_45 = (0); } else { _if_result_45 = (str_to_int(hb_ate_raw)); } _if_result_45; }); + el_val_t hb_ate = ({ el_val_t _if_result_49 = 0; if (str_eq(hb_ate_raw, EL_STR(""))) { _if_result_49 = (0); } else { _if_result_49 = (str_to_int(hb_ate_raw)); } _if_result_49; }); el_val_t hebb_warm_raw = json_get(act_stats, EL_STR("hebb_warm")); - el_val_t hebb_warm = ({ el_val_t _if_result_46 = 0; if (str_eq(hebb_warm_raw, EL_STR(""))) { _if_result_46 = (EL_STR("-1")); } else { _if_result_46 = (hebb_warm_raw); } _if_result_46; }); + el_val_t hebb_warm = ({ el_val_t _if_result_50 = 0; if (str_eq(hebb_warm_raw, EL_STR(""))) { _if_result_50 = (EL_STR("-1")); } else { _if_result_50 = (hebb_warm_raw); } _if_result_50; }); el_val_t hebb_max_raw = json_get(act_stats, EL_STR("hebb_max")); - el_val_t hebb_max = ({ el_val_t _if_result_47 = 0; if (str_eq(hebb_max_raw, EL_STR(""))) { _if_result_47 = (EL_STR("-1")); } else { _if_result_47 = (hebb_max_raw); } _if_result_47; }); + el_val_t hebb_max = ({ el_val_t _if_result_51 = 0; if (str_eq(hebb_max_raw, EL_STR(""))) { _if_result_51 = (EL_STR("-1")); } else { _if_result_51 = (hebb_max_raw); } _if_result_51; }); el_val_t hebb_links_raw = json_get(act_stats, EL_STR("hebb_links")); - el_val_t hebb_links = ({ el_val_t _if_result_48 = 0; if (str_eq(hebb_links_raw, EL_STR(""))) { _if_result_48 = (EL_STR("-1")); } else { _if_result_48 = (hebb_links_raw); } _if_result_48; }); + el_val_t hebb_links = ({ el_val_t _if_result_52 = 0; if (str_eq(hebb_links_raw, EL_STR(""))) { _if_result_52 = (EL_STR("-1")); } else { _if_result_52 = (hebb_links_raw); } _if_result_52; }); + el_val_t wb_pend_raw = json_get(act_stats, EL_STR("hebb_wb_pending")); + el_val_t wb_pend = ({ el_val_t _if_result_53 = 0; if (str_eq(wb_pend_raw, EL_STR(""))) { _if_result_53 = (EL_STR("-1")); } else { _if_result_53 = (wb_pend_raw); } _if_result_53; }); + el_val_t wb_drain_raw = json_get(act_stats, EL_STR("hebb_wb_drained")); + el_val_t wb_drain = ({ el_val_t _if_result_54 = 0; if (str_eq(wb_drain_raw, EL_STR(""))) { _if_result_54 = (EL_STR("-1")); } else { _if_result_54 = (wb_drain_raw); } _if_result_54; }); + el_val_t wb_drop_raw = json_get(act_stats, EL_STR("hebb_wb_dropped")); + el_val_t wb_drop = ({ el_val_t _if_result_55 = 0; if (str_eq(wb_drop_raw, EL_STR(""))) { _if_result_55 = (EL_STR("-1")); } else { _if_result_55 = (wb_drop_raw); } _if_result_55; }); + el_val_t wb_sent_raw = state_get(EL_STR("soul.hebb_wb_sent")); + el_val_t wb_sent = ({ el_val_t _if_result_56 = 0; if (str_eq(wb_sent_raw, EL_STR(""))) { _if_result_56 = (EL_STR("0")); } else { _if_result_56 = (wb_sent_raw); } _if_result_56; }); el_val_t dup_wm_g_raw = json_get(act_stats, EL_STR("dup_wm_global")); - el_val_t dup_wm_g = ({ el_val_t _if_result_49 = 0; if (str_eq(dup_wm_g_raw, EL_STR(""))) { _if_result_49 = (EL_STR("-1")); } else { _if_result_49 = (dup_wm_g_raw); } _if_result_49; }); + el_val_t dup_wm_g = ({ el_val_t _if_result_57 = 0; if (str_eq(dup_wm_g_raw, EL_STR(""))) { _if_result_57 = (EL_STR("-1")); } else { _if_result_57 = (dup_wm_g_raw); } _if_result_57; }); el_val_t act_brk_raw = json_get(act_stats, EL_STR("embed_breaker_open")); - el_val_t act_brk = ({ el_val_t _if_result_50 = 0; if (str_eq(act_brk_raw, EL_STR(""))) { _if_result_50 = (EL_STR("-1")); } else { _if_result_50 = (act_brk_raw); } _if_result_50; }); + el_val_t act_brk = ({ el_val_t _if_result_58 = 0; if (str_eq(act_brk_raw, EL_STR(""))) { _if_result_58 = (EL_STR("-1")); } else { _if_result_58 = (act_brk_raw); } _if_result_58; }); el_val_t ctx_cos_raw = json_get(act_stats, EL_STR("ctx_cos")); - el_val_t ctx_cos = ({ el_val_t _if_result_51 = 0; if (str_eq(ctx_cos_raw, EL_STR(""))) { _if_result_51 = (EL_STR("-2")); } else { _if_result_51 = (ctx_cos_raw); } _if_result_51; }); + el_val_t ctx_cos = ({ el_val_t _if_result_59 = 0; if (str_eq(ctx_cos_raw, EL_STR(""))) { _if_result_59 = (EL_STR("-2")); } else { _if_result_59 = (ctx_cos_raw); } _if_result_59; }); el_val_t dup_seeds_raw = json_get(act_stats, EL_STR("dup_seeds")); - el_val_t dup_seeds = ({ el_val_t _if_result_52 = 0; if (str_eq(dup_seeds_raw, EL_STR(""))) { _if_result_52 = (EL_STR("-1")); } else { _if_result_52 = (dup_seeds_raw); } _if_result_52; }); + el_val_t dup_seeds = ({ el_val_t _if_result_60 = 0; if (str_eq(dup_seeds_raw, EL_STR(""))) { _if_result_60 = (EL_STR("-1")); } else { _if_result_60 = (dup_seeds_raw); } _if_result_60; }); el_val_t dup_wm_raw = json_get(act_stats, EL_STR("dup_wm")); - el_val_t dup_wm = ({ el_val_t _if_result_53 = 0; if (str_eq(dup_wm_raw, EL_STR(""))) { _if_result_53 = (EL_STR("-1")); } else { _if_result_53 = (dup_wm_raw); } _if_result_53; }); - 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_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_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_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_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_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_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"event\":\"heartbeat\",\"pulse\":"), pulse), EL_STR(",\"tick\":")), pulse), EL_STR(",\"boot\":")), boot), EL_STR(",\"idle\":")), idle), EL_STR(",\"idle_ms\":")), int_to_str(idle_ms)), EL_STR(",\"node_count\":")), int_to_str(nc)), EL_STR(",\"edge_count\":")), int_to_str(ec)), EL_STR(",\"node_delta\":")), int_to_str(node_delta)), EL_STR(",\"edge_delta\":")), int_to_str(edge_delta)), EL_STR(",\"wm_active\":")), int_to_str(wmc)), EL_STR(",\"wm_delta\":")), int_to_str(wm_delta)), EL_STR(",\"wm_saturated\":")), int_to_str(wm_sat)), EL_STR(",\"wm_top0_streak\":")), int_to_str(t0streak)), EL_STR(",\"wm_churn\":")), int_to_str(wm_churn)), EL_STR(",\"wm_top0_wm\":")), wm_top0_wm), EL_STR(",\"sync_added_total\":")), sat_str), EL_STR(",\"sync_age_ms\":")), int_to_str(sync_age)), EL_STR(",\"wm_avg_weight\":")), wm_avg_str), EL_STR(",\"wm_top\":")), wm_top), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR(",\"uptime_ms\":")), int_to_str(up_ms)), EL_STR(",\"uptime\":\"")), up_human), EL_STR("\",\"embed_ok\":")), int_to_str(emb_ok)), EL_STR(",\"embed_backfilled\":")), bf_done), EL_STR(",\"embed_count\":")), bf_total), EL_STR(",\"embed_eligible\":")), embed_elig), EL_STR(",\"wm_evicted\":")), act_evict), EL_STR(",\"wm_evicted_delta\":")), int_to_str(evict_delta)), EL_STR(",\"breakthroughs\":")), act_bt), EL_STR(",\"breakthroughs_delta\":")), int_to_str(bt_delta)), EL_STR(",\"auto_term_streak\":")), int_to_str(hb_ats)), EL_STR(",\"auto_term_empty_streak\":")), int_to_str(hb_ate)), EL_STR(",\"embed_breaker_open\":")), act_brk), EL_STR(",\"ctx_cos\":")), ctx_cos), EL_STR(",\"dup_seeds\":")), dup_seeds), EL_STR(",\"dup_wm\":")), dup_wm), EL_STR(",\"dup_wm_global\":")), dup_wm_g), EL_STR(",\"hebb_warm\":")), hebb_warm), EL_STR(",\"hebb_max\":")), hebb_max), EL_STR(",\"hebb_links\":")), hebb_links), EL_STR(",\"ise_fail\":")), fail_str), EL_STR("}")); + el_val_t dup_wm = ({ el_val_t _if_result_61 = 0; if (str_eq(dup_wm_raw, EL_STR(""))) { _if_result_61 = (EL_STR("-1")); } else { _if_result_61 = (dup_wm_raw); } _if_result_61; }); + 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_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_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_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_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_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_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("{\"event\":\"heartbeat\",\"pulse\":"), pulse), EL_STR(",\"tick\":")), pulse), EL_STR(",\"boot\":")), boot), EL_STR(",\"idle\":")), idle), EL_STR(",\"idle_ms\":")), int_to_str(idle_ms)), EL_STR(",\"node_count\":")), int_to_str(nc)), EL_STR(",\"edge_count\":")), int_to_str(ec)), EL_STR(",\"node_delta\":")), int_to_str(node_delta)), EL_STR(",\"edge_delta\":")), int_to_str(edge_delta)), EL_STR(",\"wm_active\":")), int_to_str(wmc)), EL_STR(",\"wm_delta\":")), int_to_str(wm_delta)), EL_STR(",\"wm_saturated\":")), int_to_str(wm_sat)), EL_STR(",\"wm_top0_streak\":")), int_to_str(t0streak)), EL_STR(",\"wm_churn\":")), int_to_str(wm_churn)), EL_STR(",\"wm_top0_wm\":")), wm_top0_wm), EL_STR(",\"sync_added_total\":")), sat_str), EL_STR(",\"sync_age_ms\":")), int_to_str(sync_age)), EL_STR(",\"wm_avg_weight\":")), wm_avg_str), EL_STR(",\"wm_top\":")), wm_top), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR(",\"uptime_ms\":")), int_to_str(up_ms)), EL_STR(",\"uptime\":\"")), up_human), EL_STR("\",\"embed_ok\":")), int_to_str(emb_ok)), EL_STR(",\"embed_backfilled\":")), bf_done), EL_STR(",\"embed_count\":")), bf_total), EL_STR(",\"embed_eligible\":")), embed_elig), EL_STR(",\"wm_evicted\":")), act_evict), EL_STR(",\"wm_evicted_delta\":")), int_to_str(evict_delta)), EL_STR(",\"breakthroughs\":")), act_bt), EL_STR(",\"breakthroughs_delta\":")), int_to_str(bt_delta)), EL_STR(",\"auto_term_streak\":")), int_to_str(hb_ats)), EL_STR(",\"auto_term_empty_streak\":")), int_to_str(hb_ate)), EL_STR(",\"embed_breaker_open\":")), act_brk), EL_STR(",\"ctx_cos\":")), ctx_cos), EL_STR(",\"dup_seeds\":")), dup_seeds), EL_STR(",\"dup_wm\":")), dup_wm), EL_STR(",\"dup_wm_global\":")), dup_wm_g), EL_STR(",\"hebb_warm\":")), hebb_warm), EL_STR(",\"hebb_max\":")), hebb_max), EL_STR(",\"hebb_links\":")), hebb_links), EL_STR(",\"hebb_wb_pending\":")), wb_pend), EL_STR(",\"hebb_wb_drained\":")), wb_drain), EL_STR(",\"hebb_wb_dropped\":")), wb_drop), EL_STR(",\"hebb_wb_sent\":")), wb_sent), EL_STR(",\"ise_fail\":")), fail_str), EL_STR("}")); ise_post(payload); return 0; } @@ -395,18 +435,18 @@ el_val_t proactive_curiosity(void) { auto_term_try_slot(json_get(wm10_n1, EL_STR("node_type")), json_get(wm10_n1, EL_STR("label"))); auto_term_try_slot(json_get(wm10_n0, EL_STR("node_type")), json_get(wm10_n0, EL_STR("label"))); el_val_t auto_term = state_get(EL_STR("cseed_auto")); - el_val_t results_auto = ({ el_val_t _if_result_54 = 0; if (str_eq(auto_term, EL_STR(""))) { _if_result_54 = (EL_STR("[]")); } else { _if_result_54 = (engram_activate_json(auto_term, 1)); } _if_result_54; }); + el_val_t results_auto = ({ el_val_t _if_result_62 = 0; if (str_eq(auto_term, EL_STR(""))) { _if_result_62 = (EL_STR("[]")); } else { _if_result_62 = (engram_activate_json(auto_term, 1)); } _if_result_62; }); el_val_t found_auto = json_array_len(results_auto); el_val_t total_found = (found + found_auto); el_val_t safe_auto = str_replace(auto_term, EL_STR("\""), EL_STR("'")); el_val_t prev_auto = state_get(EL_STR("soul.prev_auto_term")); el_val_t atstreak_raw = state_get(EL_STR("soul.auto_term_streak")); - el_val_t atstreak_prev = ({ el_val_t _if_result_55 = 0; if (str_eq(atstreak_raw, EL_STR(""))) { _if_result_55 = (0); } else { _if_result_55 = (str_to_int(atstreak_raw)); } _if_result_55; }); + el_val_t atstreak_prev = ({ el_val_t _if_result_63 = 0; if (str_eq(atstreak_raw, EL_STR(""))) { _if_result_63 = (0); } else { _if_result_63 = (str_to_int(atstreak_raw)); } _if_result_63; }); el_val_t is_empty = str_eq(auto_term, EL_STR("")); - el_val_t atstreak = ({ el_val_t _if_result_56 = 0; if (is_empty) { _if_result_56 = (0); } else { _if_result_56 = (({ el_val_t _if_result_57 = 0; if (str_eq(auto_term, prev_auto)) { _if_result_57 = ((atstreak_prev + 1)); } else { _if_result_57 = (1); } _if_result_57; })); } _if_result_56; }); + el_val_t atstreak = ({ el_val_t _if_result_64 = 0; if (is_empty) { _if_result_64 = (0); } else { _if_result_64 = (({ el_val_t _if_result_65 = 0; if (str_eq(auto_term, prev_auto)) { _if_result_65 = ((atstreak_prev + 1)); } else { _if_result_65 = (1); } _if_result_65; })); } _if_result_64; }); el_val_t atempty_raw = state_get(EL_STR("soul.auto_term_empty_streak")); - el_val_t atempty_prev = ({ el_val_t _if_result_58 = 0; if (str_eq(atempty_raw, EL_STR(""))) { _if_result_58 = (0); } else { _if_result_58 = (str_to_int(atempty_raw)); } _if_result_58; }); - el_val_t atempty = ({ el_val_t _if_result_59 = 0; if (is_empty) { _if_result_59 = ((atempty_prev + 1)); } else { _if_result_59 = (0); } _if_result_59; }); + el_val_t atempty_prev = ({ el_val_t _if_result_66 = 0; if (str_eq(atempty_raw, EL_STR(""))) { _if_result_66 = (0); } else { _if_result_66 = (str_to_int(atempty_raw)); } _if_result_66; }); + el_val_t atempty = ({ el_val_t _if_result_67 = 0; if (is_empty) { _if_result_67 = ((atempty_prev + 1)); } else { _if_result_67 = (0); } _if_result_67; }); state_set(EL_STR("soul.prev_auto_term"), auto_term); state_set(EL_STR("soul.auto_term_streak"), int_to_str(atstreak)); state_set(EL_STR("soul.auto_term_empty_streak"), int_to_str(atempty)); @@ -601,17 +641,18 @@ el_val_t awareness_run(void) { state_set(EL_STR("soul.boot_ts"), int_to_str(time_now())); } el_val_t tick_raw = env(EL_STR("SOUL_TICK_MS")); - el_val_t tick_ms = ({ el_val_t _if_result_60 = 0; if (str_eq(tick_raw, EL_STR(""))) { _if_result_60 = (200); } else { _if_result_60 = (str_to_int(tick_raw)); } _if_result_60; }); + el_val_t tick_ms = ({ el_val_t _if_result_68 = 0; if (str_eq(tick_raw, EL_STR(""))) { _if_result_68 = (200); } else { _if_result_68 = (str_to_int(tick_raw)); } _if_result_68; }); el_val_t beat_ms_raw = env(EL_STR("SOUL_HEARTBEAT_MS")); - el_val_t beat_ms = ({ el_val_t _if_result_61 = 0; if (str_eq(beat_ms_raw, EL_STR(""))) { _if_result_61 = (60000); } else { _if_result_61 = (str_to_int(beat_ms_raw)); } _if_result_61; }); + el_val_t beat_ms = ({ el_val_t _if_result_69 = 0; if (str_eq(beat_ms_raw, EL_STR(""))) { _if_result_69 = (60000); } else { _if_result_69 = (str_to_int(beat_ms_raw)); } _if_result_69; }); el_val_t scan_ms = (beat_ms / 2); while (1) { el_val_t tick_mark = el_arena_push(); el_val_t running = state_get(EL_STR("soul.running")); if (str_eq(running, EL_STR("false"))) { el_val_t sd_boot_raw = state_get(EL_STR("soul_boot_count")); - el_val_t sd_boot = ({ el_val_t _if_result_62 = 0; if (str_eq(sd_boot_raw, EL_STR(""))) { _if_result_62 = (EL_STR("0")); } else { _if_result_62 = (sd_boot_raw); } _if_result_62; }); - ise_post(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("{\"event\":\"shutdown\",\"boot\":"), sd_boot), EL_STR(",\"pulse\":")), int_to_str(pulse_count())), EL_STR(",\"uptime_ms\":")), int_to_str(elapsed_ms())), EL_STR(",\"ts\":")), int_to_str(time_now())), EL_STR("}"))); + el_val_t sd_boot = ({ el_val_t _if_result_70 = 0; if (str_eq(sd_boot_raw, EL_STR(""))) { _if_result_70 = (EL_STR("0")); } else { _if_result_70 = (sd_boot_raw); } _if_result_70; }); + el_val_t sd_wb = hebb_consolidate(); + ise_post(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("{\"event\":\"shutdown\",\"boot\":"), sd_boot), EL_STR(",\"pulse\":")), int_to_str(pulse_count())), EL_STR(",\"hebb_wb_sent\":")), int_to_str(sd_wb)), EL_STR(",\"uptime_ms\":")), int_to_str(elapsed_ms())), EL_STR(",\"ts\":")), int_to_str(time_now())), EL_STR("}"))); println(EL_STR("[awareness] exiting")); el_arena_pop(tick_mark); return EL_STR(""); @@ -626,10 +667,12 @@ el_val_t awareness_run(void) { } el_val_t now_ts = time_now(); el_val_t last_beat_str = state_get(EL_STR("soul.last_beat_ts")); - el_val_t last_beat_ts = ({ el_val_t _if_result_63 = 0; if (str_eq(last_beat_str, EL_STR(""))) { _if_result_63 = (0); } else { _if_result_63 = (str_to_int(last_beat_str)); } _if_result_63; }); + el_val_t last_beat_ts = ({ el_val_t _if_result_71 = 0; if (str_eq(last_beat_str, EL_STR(""))) { _if_result_71 = (0); } else { _if_result_71 = (str_to_int(last_beat_str)); } _if_result_71; }); el_val_t beat_elapsed = (now_ts - last_beat_ts); el_val_t should_beat = (beat_elapsed >= beat_ms); if (should_beat) { + el_val_t wb_sent_n = hebb_consolidate(); + state_set(EL_STR("soul.hebb_wb_sent"), int_to_str(wb_sent_n)); emit_heartbeat(); state_set(EL_STR("soul.last_beat_ts"), int_to_str(now_ts)); el_val_t snap_path = state_get(EL_STR("soul_snapshot_path")); @@ -638,7 +681,7 @@ el_val_t awareness_run(void) { } } el_val_t last_scan_str = state_get(EL_STR("soul.last_scan_ts")); - el_val_t last_scan_ts = ({ el_val_t _if_result_64 = 0; if (str_eq(last_scan_str, EL_STR(""))) { _if_result_64 = (0); } else { _if_result_64 = (str_to_int(last_scan_str)); } _if_result_64; }); + el_val_t last_scan_ts = ({ el_val_t _if_result_72 = 0; if (str_eq(last_scan_str, EL_STR(""))) { _if_result_72 = (0); } else { _if_result_72 = (str_to_int(last_scan_str)); } _if_result_72; }); el_val_t scan_elapsed = (now_ts - last_scan_ts); el_val_t should_scan = (!did_work && (scan_elapsed >= scan_ms)); if (should_scan) { @@ -646,15 +689,15 @@ el_val_t awareness_run(void) { state_set(EL_STR("soul.last_scan_ts"), int_to_str(now_ts)); } el_val_t refresh_ms_raw = env(EL_STR("SOUL_REFRESH_MS")); - el_val_t refresh_ms = ({ el_val_t _if_result_65 = 0; if (str_eq(refresh_ms_raw, EL_STR(""))) { _if_result_65 = (600000); } else { _if_result_65 = (str_to_int(refresh_ms_raw)); } _if_result_65; }); + el_val_t refresh_ms = ({ el_val_t _if_result_73 = 0; if (str_eq(refresh_ms_raw, EL_STR(""))) { _if_result_73 = (600000); } else { _if_result_73 = (str_to_int(refresh_ms_raw)); } _if_result_73; }); el_val_t last_refresh_str = state_get(EL_STR("soul.last_refresh_ts")); - el_val_t last_refresh_ts = ({ el_val_t _if_result_66 = 0; if (str_eq(last_refresh_str, EL_STR(""))) { _if_result_66 = (0); } else { _if_result_66 = (str_to_int(last_refresh_str)); } _if_result_66; }); + el_val_t last_refresh_ts = ({ el_val_t _if_result_74 = 0; if (str_eq(last_refresh_str, EL_STR(""))) { _if_result_74 = (0); } else { _if_result_74 = (str_to_int(last_refresh_str)); } _if_result_74; }); el_val_t refresh_elapsed = (now_ts - last_refresh_ts); el_val_t should_refresh = (refresh_elapsed >= refresh_ms); if (should_refresh) { el_val_t sync_env_url = env(EL_STR("SOUL_ISE_URL")); - el_val_t sync_state_url = ({ el_val_t _if_result_67 = 0; if (str_eq(sync_env_url, EL_STR(""))) { _if_result_67 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_67 = (sync_env_url); } _if_result_67; }); - el_val_t engram_url = ({ el_val_t _if_result_68 = 0; if (str_eq(sync_state_url, EL_STR(""))) { _if_result_68 = (EL_STR("http://localhost:8742")); } else { _if_result_68 = (sync_state_url); } _if_result_68; }); + el_val_t sync_state_url = ({ el_val_t _if_result_75 = 0; if (str_eq(sync_env_url, EL_STR(""))) { _if_result_75 = (state_get(EL_STR("soul_engram_url"))); } else { _if_result_75 = (sync_env_url); } _if_result_75; }); + el_val_t engram_url = ({ el_val_t _if_result_76 = 0; if (str_eq(sync_state_url, EL_STR(""))) { _if_result_76 = (EL_STR("http://localhost:8742")); } else { _if_result_76 = (sync_state_url); } _if_result_76; }); if (!str_eq(engram_url, EL_STR(""))) { el_val_t sync_json = http_get(el_str_concat(engram_url, EL_STR("/api/sync"))); el_val_t sync_ok = (!str_eq(sync_json, EL_STR("")) && !str_eq(sync_json, EL_STR("{}"))); @@ -667,10 +710,10 @@ el_val_t awareness_run(void) { fs_write(tmp, sync_json); el_val_t added = engram_load_merge(tmp); el_val_t ret_raw = env(EL_STR("ENGRAM_ISE_RETENTION_MS")); - el_val_t ret_ms = ({ el_val_t _if_result_69 = 0; if (str_eq(ret_raw, EL_STR(""))) { _if_result_69 = (172800000); } else { _if_result_69 = (str_to_int(ret_raw)); } _if_result_69; }); + el_val_t ret_ms = ({ el_val_t _if_result_77 = 0; if (str_eq(ret_raw, EL_STR(""))) { _if_result_77 = (172800000); } else { _if_result_77 = (str_to_int(ret_raw)); } _if_result_77; }); el_val_t pruned_sync = engram_prune_telemetry(ret_ms); el_val_t sat_raw = state_get(EL_STR("soul.sync_added_total")); - el_val_t sat_n = ({ el_val_t _if_result_70 = 0; if (str_eq(sat_raw, EL_STR(""))) { _if_result_70 = (0); } else { _if_result_70 = (str_to_int(sat_raw)); } _if_result_70; }); + el_val_t sat_n = ({ el_val_t _if_result_78 = 0; if (str_eq(sat_raw, EL_STR(""))) { _if_result_78 = (0); } else { _if_result_78 = (str_to_int(sat_raw)); } _if_result_78; }); state_set(EL_STR("soul.sync_added_total"), int_to_str((sat_n + added))); el_val_t ts2 = time_now(); state_set(EL_STR("soul.last_sync_ok_ts"), int_to_str(ts2)); @@ -696,78 +739,78 @@ el_val_t security_research_authorized(void) { } el_val_t threat_score_command(el_val_t cmd) { - el_val_t s1 = ({ el_val_t _if_result_71 = 0; if (str_contains(cmd, EL_STR("nmap"))) { _if_result_71 = (30); } else { _if_result_71 = (0); } _if_result_71; }); - el_val_t s2 = ({ el_val_t _if_result_72 = 0; if (str_contains(cmd, EL_STR("masscan"))) { _if_result_72 = (40); } else { _if_result_72 = (0); } _if_result_72; }); - el_val_t s3 = ({ el_val_t _if_result_73 = 0; if (str_contains(cmd, EL_STR(" nc "))) { _if_result_73 = (20); } else { _if_result_73 = (0); } _if_result_73; }); - el_val_t s4 = ({ el_val_t _if_result_74 = 0; if (str_contains(cmd, EL_STR("netcat"))) { _if_result_74 = (20); } else { _if_result_74 = (0); } _if_result_74; }); - el_val_t s5 = ({ el_val_t _if_result_75 = 0; if (str_contains(cmd, EL_STR("/etc/shadow"))) { _if_result_75 = (80); } else { _if_result_75 = (0); } _if_result_75; }); - el_val_t s6 = ({ el_val_t _if_result_76 = 0; if (str_contains(cmd, EL_STR("/etc/passwd"))) { _if_result_76 = (30); } else { _if_result_76 = (0); } _if_result_76; }); - el_val_t s7 = ({ el_val_t _if_result_77 = 0; if (str_contains(cmd, EL_STR("id_rsa"))) { _if_result_77 = (60); } else { _if_result_77 = (0); } _if_result_77; }); - el_val_t s8 = ({ el_val_t _if_result_78 = 0; if (str_contains(cmd, EL_STR(".ssh/"))) { _if_result_78 = (50); } else { _if_result_78 = (0); } _if_result_78; }); - el_val_t s9 = ({ el_val_t _if_result_79 = 0; if (str_contains(cmd, EL_STR("crontab"))) { _if_result_79 = (30); } else { _if_result_79 = (0); } _if_result_79; }); - el_val_t s10 = ({ el_val_t _if_result_80 = 0; if (str_contains(cmd, EL_STR("LaunchDaemon"))) { _if_result_80 = (40); } else { _if_result_80 = (0); } _if_result_80; }); - el_val_t s11 = ({ el_val_t _if_result_81 = 0; if ((str_contains(cmd, EL_STR("curl")) && str_contains(cmd, EL_STR("bash")))) { _if_result_81 = (75); } else { _if_result_81 = (0); } _if_result_81; }); - el_val_t s12 = ({ el_val_t _if_result_82 = 0; if ((str_contains(cmd, EL_STR("wget")) && str_contains(cmd, EL_STR("bash")))) { _if_result_82 = (75); } else { _if_result_82 = (0); } _if_result_82; }); - el_val_t s13 = ({ el_val_t _if_result_83 = 0; if ((str_contains(cmd, EL_STR("curl")) && str_contains(cmd, EL_STR("| sh")))) { _if_result_83 = (60); } else { _if_result_83 = (0); } _if_result_83; }); - el_val_t s14 = ({ el_val_t _if_result_84 = 0; if ((str_contains(cmd, EL_STR("base64")) && str_contains(cmd, EL_STR("curl")))) { _if_result_84 = (50); } else { _if_result_84 = (0); } _if_result_84; }); - el_val_t s15 = ({ el_val_t _if_result_85 = 0; if (str_contains(cmd, EL_STR("mkfifo"))) { _if_result_85 = (50); } else { _if_result_85 = (0); } _if_result_85; }); - el_val_t s16 = ({ el_val_t _if_result_86 = 0; if (str_contains(cmd, EL_STR("chmod +s"))) { _if_result_86 = (70); } else { _if_result_86 = (0); } _if_result_86; }); - el_val_t s17 = ({ el_val_t _if_result_87 = 0; if (str_contains(cmd, EL_STR("chmod 4755"))) { _if_result_87 = (70); } else { _if_result_87 = (0); } _if_result_87; }); + el_val_t s1 = ({ el_val_t _if_result_79 = 0; if (str_contains(cmd, EL_STR("nmap"))) { _if_result_79 = (30); } else { _if_result_79 = (0); } _if_result_79; }); + el_val_t s2 = ({ el_val_t _if_result_80 = 0; if (str_contains(cmd, EL_STR("masscan"))) { _if_result_80 = (40); } else { _if_result_80 = (0); } _if_result_80; }); + el_val_t s3 = ({ el_val_t _if_result_81 = 0; if (str_contains(cmd, EL_STR(" nc "))) { _if_result_81 = (20); } else { _if_result_81 = (0); } _if_result_81; }); + el_val_t s4 = ({ el_val_t _if_result_82 = 0; if (str_contains(cmd, EL_STR("netcat"))) { _if_result_82 = (20); } else { _if_result_82 = (0); } _if_result_82; }); + el_val_t s5 = ({ el_val_t _if_result_83 = 0; if (str_contains(cmd, EL_STR("/etc/shadow"))) { _if_result_83 = (80); } else { _if_result_83 = (0); } _if_result_83; }); + el_val_t s6 = ({ el_val_t _if_result_84 = 0; if (str_contains(cmd, EL_STR("/etc/passwd"))) { _if_result_84 = (30); } else { _if_result_84 = (0); } _if_result_84; }); + el_val_t s7 = ({ el_val_t _if_result_85 = 0; if (str_contains(cmd, EL_STR("id_rsa"))) { _if_result_85 = (60); } else { _if_result_85 = (0); } _if_result_85; }); + el_val_t s8 = ({ el_val_t _if_result_86 = 0; if (str_contains(cmd, EL_STR(".ssh/"))) { _if_result_86 = (50); } else { _if_result_86 = (0); } _if_result_86; }); + el_val_t s9 = ({ el_val_t _if_result_87 = 0; if (str_contains(cmd, EL_STR("crontab"))) { _if_result_87 = (30); } else { _if_result_87 = (0); } _if_result_87; }); + el_val_t s10 = ({ el_val_t _if_result_88 = 0; if (str_contains(cmd, EL_STR("LaunchDaemon"))) { _if_result_88 = (40); } else { _if_result_88 = (0); } _if_result_88; }); + el_val_t s11 = ({ el_val_t _if_result_89 = 0; if ((str_contains(cmd, EL_STR("curl")) && str_contains(cmd, EL_STR("bash")))) { _if_result_89 = (75); } else { _if_result_89 = (0); } _if_result_89; }); + el_val_t s12 = ({ el_val_t _if_result_90 = 0; if ((str_contains(cmd, EL_STR("wget")) && str_contains(cmd, EL_STR("bash")))) { _if_result_90 = (75); } else { _if_result_90 = (0); } _if_result_90; }); + el_val_t s13 = ({ el_val_t _if_result_91 = 0; if ((str_contains(cmd, EL_STR("curl")) && str_contains(cmd, EL_STR("| sh")))) { _if_result_91 = (60); } else { _if_result_91 = (0); } _if_result_91; }); + el_val_t s14 = ({ el_val_t _if_result_92 = 0; if ((str_contains(cmd, EL_STR("base64")) && str_contains(cmd, EL_STR("curl")))) { _if_result_92 = (50); } else { _if_result_92 = (0); } _if_result_92; }); + el_val_t s15 = ({ el_val_t _if_result_93 = 0; if (str_contains(cmd, EL_STR("mkfifo"))) { _if_result_93 = (50); } else { _if_result_93 = (0); } _if_result_93; }); + el_val_t s16 = ({ el_val_t _if_result_94 = 0; if (str_contains(cmd, EL_STR("chmod +s"))) { _if_result_94 = (70); } else { _if_result_94 = (0); } _if_result_94; }); + el_val_t s17 = ({ el_val_t _if_result_95 = 0; if (str_contains(cmd, EL_STR("chmod 4755"))) { _if_result_95 = (70); } else { _if_result_95 = (0); } _if_result_95; }); return ((((((((((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10) + s11) + s12) + s13) + s14) + s15) + s16) + s17); return 0; } el_val_t threat_score_path(el_val_t path) { - el_val_t s1 = ({ el_val_t _if_result_88 = 0; if (str_starts_with(path, EL_STR("/etc/"))) { _if_result_88 = (60); } else { _if_result_88 = (0); } _if_result_88; }); - el_val_t s2 = ({ el_val_t _if_result_89 = 0; if (str_contains(path, EL_STR("/.ssh/"))) { _if_result_89 = (70); } else { _if_result_89 = (0); } _if_result_89; }); - el_val_t s3 = ({ el_val_t _if_result_90 = 0; if (str_contains(path, EL_STR("/LaunchDaemons/"))) { _if_result_90 = (80); } else { _if_result_90 = (0); } _if_result_90; }); - el_val_t s4 = ({ el_val_t _if_result_91 = 0; if (str_contains(path, EL_STR("/LaunchAgents/"))) { _if_result_91 = (40); } else { _if_result_91 = (0); } _if_result_91; }); - el_val_t s5 = ({ el_val_t _if_result_92 = 0; if (str_contains(path, EL_STR("/cron"))) { _if_result_92 = (60); } else { _if_result_92 = (0); } _if_result_92; }); - el_val_t s6 = ({ el_val_t _if_result_93 = 0; if (str_contains(path, EL_STR("/.bashrc"))) { _if_result_93 = (35); } else { _if_result_93 = (0); } _if_result_93; }); - el_val_t s7 = ({ el_val_t _if_result_94 = 0; if (str_contains(path, EL_STR("/.zshrc"))) { _if_result_94 = (35); } else { _if_result_94 = (0); } _if_result_94; }); - el_val_t s8 = ({ el_val_t _if_result_95 = 0; if (str_contains(path, EL_STR("/.profile"))) { _if_result_95 = (35); } else { _if_result_95 = (0); } _if_result_95; }); - el_val_t s9 = ({ el_val_t _if_result_96 = 0; if (str_starts_with(path, EL_STR("/usr/"))) { _if_result_96 = (50); } else { _if_result_96 = (0); } _if_result_96; }); - el_val_t s10 = ({ el_val_t _if_result_97 = 0; if (str_starts_with(path, EL_STR("/bin/"))) { _if_result_97 = (70); } else { _if_result_97 = (0); } _if_result_97; }); - el_val_t s11 = ({ el_val_t _if_result_98 = 0; if (str_starts_with(path, EL_STR("/sbin/"))) { _if_result_98 = (70); } else { _if_result_98 = (0); } _if_result_98; }); + el_val_t s1 = ({ el_val_t _if_result_96 = 0; if (str_starts_with(path, EL_STR("/etc/"))) { _if_result_96 = (60); } else { _if_result_96 = (0); } _if_result_96; }); + el_val_t s2 = ({ el_val_t _if_result_97 = 0; if (str_contains(path, EL_STR("/.ssh/"))) { _if_result_97 = (70); } else { _if_result_97 = (0); } _if_result_97; }); + el_val_t s3 = ({ el_val_t _if_result_98 = 0; if (str_contains(path, EL_STR("/LaunchDaemons/"))) { _if_result_98 = (80); } else { _if_result_98 = (0); } _if_result_98; }); + el_val_t s4 = ({ el_val_t _if_result_99 = 0; if (str_contains(path, EL_STR("/LaunchAgents/"))) { _if_result_99 = (40); } else { _if_result_99 = (0); } _if_result_99; }); + el_val_t s5 = ({ el_val_t _if_result_100 = 0; if (str_contains(path, EL_STR("/cron"))) { _if_result_100 = (60); } else { _if_result_100 = (0); } _if_result_100; }); + el_val_t s6 = ({ el_val_t _if_result_101 = 0; if (str_contains(path, EL_STR("/.bashrc"))) { _if_result_101 = (35); } else { _if_result_101 = (0); } _if_result_101; }); + el_val_t s7 = ({ el_val_t _if_result_102 = 0; if (str_contains(path, EL_STR("/.zshrc"))) { _if_result_102 = (35); } else { _if_result_102 = (0); } _if_result_102; }); + el_val_t s8 = ({ el_val_t _if_result_103 = 0; if (str_contains(path, EL_STR("/.profile"))) { _if_result_103 = (35); } else { _if_result_103 = (0); } _if_result_103; }); + el_val_t s9 = ({ el_val_t _if_result_104 = 0; if (str_starts_with(path, EL_STR("/usr/"))) { _if_result_104 = (50); } else { _if_result_104 = (0); } _if_result_104; }); + el_val_t s10 = ({ el_val_t _if_result_105 = 0; if (str_starts_with(path, EL_STR("/bin/"))) { _if_result_105 = (70); } else { _if_result_105 = (0); } _if_result_105; }); + el_val_t s11 = ({ el_val_t _if_result_106 = 0; if (str_starts_with(path, EL_STR("/sbin/"))) { _if_result_106 = (70); } else { _if_result_106 = (0); } _if_result_106; }); return ((((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10) + s11); return 0; } el_val_t threat_score_history(el_val_t history) { - el_val_t s1 = ({ el_val_t _if_result_99 = 0; if (str_contains(history, EL_STR("port scan"))) { _if_result_99 = (15); } else { _if_result_99 = (0); } _if_result_99; }); - el_val_t s2 = ({ el_val_t _if_result_100 = 0; if (str_contains(history, EL_STR("enumerate"))) { _if_result_100 = (10); } else { _if_result_100 = (0); } _if_result_100; }); - el_val_t s3 = ({ el_val_t _if_result_101 = 0; if (str_contains(history, EL_STR("exploit"))) { _if_result_101 = (20); } else { _if_result_101 = (0); } _if_result_101; }); - el_val_t s4 = ({ el_val_t _if_result_102 = 0; if (str_contains(history, EL_STR("payload"))) { _if_result_102 = (15); } else { _if_result_102 = (0); } _if_result_102; }); - el_val_t s5 = ({ el_val_t _if_result_103 = 0; if (str_contains(history, EL_STR("persistence"))) { _if_result_103 = (15); } else { _if_result_103 = (0); } _if_result_103; }); - el_val_t s6 = ({ el_val_t _if_result_104 = 0; if (str_contains(history, EL_STR("lateral movement"))) { _if_result_104 = (25); } else { _if_result_104 = (0); } _if_result_104; }); - el_val_t s7 = ({ el_val_t _if_result_105 = 0; if (str_contains(history, EL_STR("privilege escalation"))) { _if_result_105 = (25); } else { _if_result_105 = (0); } _if_result_105; }); - el_val_t s8 = ({ el_val_t _if_result_106 = 0; if (str_contains(history, EL_STR("reverse shell"))) { _if_result_106 = (40); } else { _if_result_106 = (0); } _if_result_106; }); - el_val_t s9 = ({ el_val_t _if_result_107 = 0; if (str_contains(history, EL_STR("bind shell"))) { _if_result_107 = (40); } else { _if_result_107 = (0); } _if_result_107; }); - el_val_t s10 = ({ el_val_t _if_result_108 = 0; if (str_contains(history, EL_STR("command and control"))) { _if_result_108 = (35); } else { _if_result_108 = (0); } _if_result_108; }); - el_val_t s11 = ({ el_val_t _if_result_109 = 0; if (str_contains(history, EL_STR("self-replicate"))) { _if_result_109 = (45); } else { _if_result_109 = (0); } _if_result_109; }); - el_val_t s12 = ({ el_val_t _if_result_110 = 0; if (str_contains(history, EL_STR("propagat"))) { _if_result_110 = (20); } else { _if_result_110 = (0); } _if_result_110; }); - el_val_t s13 = ({ el_val_t _if_result_111 = 0; if (str_contains(history, EL_STR("ransomware"))) { _if_result_111 = (30); } else { _if_result_111 = (0); } _if_result_111; }); - el_val_t s14 = ({ el_val_t _if_result_112 = 0; if (str_contains(history, EL_STR("encrypt files"))) { _if_result_112 = (40); } else { _if_result_112 = (0); } _if_result_112; }); - el_val_t s15 = ({ el_val_t _if_result_113 = 0; if (str_contains(history, EL_STR("exfiltrat"))) { _if_result_113 = (35); } else { _if_result_113 = (0); } _if_result_113; }); - el_val_t s16 = ({ el_val_t _if_result_114 = 0; if (str_contains(history, EL_STR("zero-day"))) { _if_result_114 = (20); } else { _if_result_114 = (0); } _if_result_114; }); - el_val_t s17 = ({ el_val_t _if_result_115 = 0; if (str_contains(history, EL_STR("rootkit"))) { _if_result_115 = (45); } else { _if_result_115 = (0); } _if_result_115; }); - el_val_t s18 = ({ el_val_t _if_result_116 = 0; if (str_contains(history, EL_STR("keylogger"))) { _if_result_116 = (45); } else { _if_result_116 = (0); } _if_result_116; }); - el_val_t s19 = ({ el_val_t _if_result_117 = 0; if (str_contains(history, EL_STR("botnet"))) { _if_result_117 = (40); } else { _if_result_117 = (0); } _if_result_117; }); - el_val_t s20 = ({ el_val_t _if_result_118 = 0; if (str_contains(history, EL_STR("malware"))) { _if_result_118 = (15); } else { _if_result_118 = (0); } _if_result_118; }); + el_val_t s1 = ({ el_val_t _if_result_107 = 0; if (str_contains(history, EL_STR("port scan"))) { _if_result_107 = (15); } else { _if_result_107 = (0); } _if_result_107; }); + el_val_t s2 = ({ el_val_t _if_result_108 = 0; if (str_contains(history, EL_STR("enumerate"))) { _if_result_108 = (10); } else { _if_result_108 = (0); } _if_result_108; }); + el_val_t s3 = ({ el_val_t _if_result_109 = 0; if (str_contains(history, EL_STR("exploit"))) { _if_result_109 = (20); } else { _if_result_109 = (0); } _if_result_109; }); + el_val_t s4 = ({ el_val_t _if_result_110 = 0; if (str_contains(history, EL_STR("payload"))) { _if_result_110 = (15); } else { _if_result_110 = (0); } _if_result_110; }); + el_val_t s5 = ({ el_val_t _if_result_111 = 0; if (str_contains(history, EL_STR("persistence"))) { _if_result_111 = (15); } else { _if_result_111 = (0); } _if_result_111; }); + el_val_t s6 = ({ el_val_t _if_result_112 = 0; if (str_contains(history, EL_STR("lateral movement"))) { _if_result_112 = (25); } else { _if_result_112 = (0); } _if_result_112; }); + el_val_t s7 = ({ el_val_t _if_result_113 = 0; if (str_contains(history, EL_STR("privilege escalation"))) { _if_result_113 = (25); } else { _if_result_113 = (0); } _if_result_113; }); + el_val_t s8 = ({ el_val_t _if_result_114 = 0; if (str_contains(history, EL_STR("reverse shell"))) { _if_result_114 = (40); } else { _if_result_114 = (0); } _if_result_114; }); + el_val_t s9 = ({ el_val_t _if_result_115 = 0; if (str_contains(history, EL_STR("bind shell"))) { _if_result_115 = (40); } else { _if_result_115 = (0); } _if_result_115; }); + el_val_t s10 = ({ el_val_t _if_result_116 = 0; if (str_contains(history, EL_STR("command and control"))) { _if_result_116 = (35); } else { _if_result_116 = (0); } _if_result_116; }); + el_val_t s11 = ({ el_val_t _if_result_117 = 0; if (str_contains(history, EL_STR("self-replicate"))) { _if_result_117 = (45); } else { _if_result_117 = (0); } _if_result_117; }); + el_val_t s12 = ({ el_val_t _if_result_118 = 0; if (str_contains(history, EL_STR("propagat"))) { _if_result_118 = (20); } else { _if_result_118 = (0); } _if_result_118; }); + el_val_t s13 = ({ el_val_t _if_result_119 = 0; if (str_contains(history, EL_STR("ransomware"))) { _if_result_119 = (30); } else { _if_result_119 = (0); } _if_result_119; }); + el_val_t s14 = ({ el_val_t _if_result_120 = 0; if (str_contains(history, EL_STR("encrypt files"))) { _if_result_120 = (40); } else { _if_result_120 = (0); } _if_result_120; }); + el_val_t s15 = ({ el_val_t _if_result_121 = 0; if (str_contains(history, EL_STR("exfiltrat"))) { _if_result_121 = (35); } else { _if_result_121 = (0); } _if_result_121; }); + el_val_t s16 = ({ el_val_t _if_result_122 = 0; if (str_contains(history, EL_STR("zero-day"))) { _if_result_122 = (20); } else { _if_result_122 = (0); } _if_result_122; }); + el_val_t s17 = ({ el_val_t _if_result_123 = 0; if (str_contains(history, EL_STR("rootkit"))) { _if_result_123 = (45); } else { _if_result_123 = (0); } _if_result_123; }); + el_val_t s18 = ({ el_val_t _if_result_124 = 0; if (str_contains(history, EL_STR("keylogger"))) { _if_result_124 = (45); } else { _if_result_124 = (0); } _if_result_124; }); + el_val_t s19 = ({ el_val_t _if_result_125 = 0; if (str_contains(history, EL_STR("botnet"))) { _if_result_125 = (40); } else { _if_result_125 = (0); } _if_result_125; }); + el_val_t s20 = ({ el_val_t _if_result_126 = 0; if (str_contains(history, EL_STR("malware"))) { _if_result_126 = (15); } else { _if_result_126 = (0); } _if_result_126; }); return (((((((((((((((((((s1 + s2) + s3) + s4) + s5) + s6) + s7) + s8) + s9) + s10) + s11) + s12) + s13) + s14) + s15) + s16) + s17) + s18) + s19) + s20); return 0; } el_val_t threat_trajectory_check(el_val_t tool_name, el_val_t tool_input) { el_val_t history = state_get(EL_STR("agentic_conv_history")); - el_val_t computed_tool_score = ({ el_val_t _if_result_119 = 0; if (str_eq(tool_name, EL_STR("run_command"))) { el_val_t cmd = json_get(tool_input, EL_STR("command")); _if_result_119 = (threat_score_command(cmd)); } else { _if_result_119 = (({ el_val_t _if_result_120 = 0; if ((str_eq(tool_name, EL_STR("write_file")) || str_eq(tool_name, EL_STR("edit_file")))) { el_val_t path = json_get(tool_input, EL_STR("path")); _if_result_120 = (threat_score_path(path)); } else { _if_result_120 = (0); } _if_result_120; })); } _if_result_119; }); + el_val_t computed_tool_score = ({ el_val_t _if_result_127 = 0; if (str_eq(tool_name, EL_STR("run_command"))) { el_val_t cmd = json_get(tool_input, EL_STR("command")); _if_result_127 = (threat_score_command(cmd)); } else { _if_result_127 = (({ el_val_t _if_result_128 = 0; if ((str_eq(tool_name, EL_STR("write_file")) || str_eq(tool_name, EL_STR("edit_file")))) { el_val_t path = json_get(tool_input, EL_STR("path")); _if_result_128 = (threat_score_path(path)); } else { _if_result_128 = (0); } _if_result_128; })); } _if_result_127; }); el_val_t history_score = threat_score_history(history); el_val_t history_contrib = (history_score / 3); el_val_t combined = (computed_tool_score + history_contrib); el_val_t should_log = (combined >= 40); if (should_log) { el_val_t ts = time_now(); - el_val_t authorized_str = ({ el_val_t _if_result_121 = 0; if (security_research_authorized()) { _if_result_121 = (EL_STR("true")); } else { _if_result_121 = (EL_STR("false")); } _if_result_121; }); + el_val_t authorized_str = ({ el_val_t _if_result_129 = 0; if (security_research_authorized()) { _if_result_129 = (EL_STR("true")); } else { _if_result_129 = (EL_STR("false")); } _if_result_129; }); el_val_t log_content = 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("{\"event\":\"threat_check\",\"tool\":\""), tool_name), EL_STR("\",\"score\":")), int_to_str(combined)), EL_STR(",\"tool_score\":")), int_to_str(computed_tool_score)), EL_STR(",\"history_score\":")), int_to_str(history_score)), EL_STR(",\"authorized\":")), authorized_str), EL_STR(",\"ts\":")), int_to_str(ts)), EL_STR("}")); el_val_t log_tags = EL_STR("[\"security-audit\",\"threat-check\"]"); el_val_t discard = mem_remember(log_content, log_tags); @@ -784,7 +827,7 @@ el_val_t threat_history_append(el_val_t text) { el_val_t safe_text = str_to_lower(text); el_val_t combined = el_str_concat(el_str_concat(current, EL_STR(" ")), safe_text); el_val_t len = str_len(combined); - el_val_t trimmed = ({ el_val_t _if_result_122 = 0; if ((len > 2000)) { _if_result_122 = (str_slice(combined, (len - 2000), len)); } else { _if_result_122 = (combined); } _if_result_122; }); + el_val_t trimmed = ({ el_val_t _if_result_130 = 0; if ((len > 2000)) { _if_result_130 = (str_slice(combined, (len - 2000), len)); } else { _if_result_130 = (combined); } _if_result_130; }); state_set(EL_STR("agentic_conv_history"), trimmed); return 0; } diff --git a/dist/elp-c-decls.h b/dist/elp-c-decls.h index 12b013c..158b73a 100644 --- a/dist/elp-c-decls.h +++ b/dist/elp-c-decls.h @@ -20,8 +20,8 @@ el_val_t akk_alaku_present(el_val_t slot); el_val_t akk_amaru_perfect(el_val_t slot); el_val_t akk_amaru_present(el_val_t slot); el_val_t akk_amaru_stative(el_val_t slot); -el_val_t akk_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t akk_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t akk_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t akk_copula_present(el_val_t slot); el_val_t akk_copula_stative(el_val_t slot); el_val_t akk_decline(el_val_t noun, el_val_t gram_case, el_val_t number); @@ -39,25 +39,25 @@ el_val_t akk_qabu_stative(el_val_t slot); el_val_t akk_regular_perfect(el_val_t stem, el_val_t slot); el_val_t akk_regular_present(el_val_t stem, el_val_t slot); el_val_t akk_regular_stative(el_val_t stem, el_val_t slot); -el_val_t akk_slot_g(el_val_t person, el_val_t gender, el_val_t number); el_val_t akk_slot(el_val_t person, el_val_t number); +el_val_t akk_slot_g(el_val_t person, el_val_t gender, el_val_t number); el_val_t akk_str_drop_last(el_val_t s, el_val_t n); el_val_t akk_str_ends(el_val_t s, el_val_t suf); el_val_t akk_str_len(el_val_t s); el_val_t akk_strip_nom(el_val_t noun); +el_val_t ang_article(el_val_t gender, el_val_t gram_case, el_val_t number); el_val_t ang_article_feminine(el_val_t gram_case, el_val_t number); el_val_t ang_article_masculine(el_val_t gram_case, el_val_t number); el_val_t ang_article_neuter(el_val_t gram_case, el_val_t number); -el_val_t ang_article(el_val_t gender, el_val_t gram_case, el_val_t number); el_val_t ang_beon_present(el_val_t slot); el_val_t ang_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t ang_cuman_past(el_val_t slot); el_val_t ang_cuman_present(el_val_t slot); el_val_t ang_declension(el_val_t noun, el_val_t gender); +el_val_t ang_decline(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t gender); el_val_t ang_decline_strong_masc(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t ang_decline_strong_neut(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t ang_decline_weak(el_val_t noun, el_val_t gram_case, el_val_t number); -el_val_t ang_decline(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t gender); el_val_t ang_don_past(el_val_t slot); el_val_t ang_don_present(el_val_t slot); el_val_t ang_gan_past(el_val_t slot); @@ -76,10 +76,10 @@ el_val_t ang_seon_present(el_val_t slot); el_val_t ang_slot(el_val_t person, el_val_t number); el_val_t ang_str_drop_last(el_val_t s, el_val_t n); el_val_t ang_str_ends(el_val_t s, el_val_t suf); -el_val_t ang_str_last_char(el_val_t s); el_val_t ang_str_last2(el_val_t s); -el_val_t ang_weak_past_stem(el_val_t stem); +el_val_t ang_str_last_char(el_val_t s); el_val_t ang_weak_past(el_val_t stem, el_val_t slot); +el_val_t ang_weak_past_stem(el_val_t stem); el_val_t ang_weak_present_ending(el_val_t slot); el_val_t ang_weak_stem(el_val_t verb); el_val_t ang_wesan_past(el_val_t slot); @@ -88,30 +88,35 @@ el_val_t ang_willan_past(el_val_t slot); el_val_t ang_willan_present(el_val_t slot); el_val_t ang_witan_past(el_val_t slot); el_val_t ang_witan_present(el_val_t slot); -el_val_t api_err_protected(el_val_t id); +el_val_t api_compact_activated(el_val_t raw, el_val_t max_items, el_val_t snip); +el_val_t api_compact_node(el_val_t node, el_val_t snip); +el_val_t api_compact_node_array(el_val_t raw, el_val_t max_items, el_val_t snip); el_val_t api_err(el_val_t msg); +el_val_t api_err_protected(el_val_t id); el_val_t api_json_escape(el_val_t s); el_val_t api_nonempty(el_val_t s); el_val_t api_not_persisted(el_val_t id); +el_val_t api_num_or_zero(el_val_t obj, el_val_t key); el_val_t api_ok(el_val_t extra); el_val_t api_or_empty(el_val_t s); el_val_t api_persisted(el_val_t id); el_val_t api_query_int(el_val_t path, el_val_t key, el_val_t default_val); el_val_t api_query_param(el_val_t path, el_val_t key); +el_val_t api_utf8_trunc(el_val_t s, el_val_t n); el_val_t ar_case_ending(el_val_t kase, el_val_t definite); -el_val_t ar_conjugate_form1(el_val_t past_base, el_val_t present_stem, el_val_t tense, el_val_t slot); el_val_t ar_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number); +el_val_t ar_conjugate_form1(el_val_t past_base, el_val_t present_stem, el_val_t tense, el_val_t slot); el_val_t ar_definite_article(el_val_t noun); el_val_t ar_gender(el_val_t noun); el_val_t ar_imperfect_prefix(el_val_t slot); el_val_t ar_imperfect_suffix(el_val_t slot); +el_val_t ar_irregular(el_val_t verb, el_val_t tense, el_val_t slot); el_val_t ar_irregular_araada(el_val_t slot, el_val_t tense); el_val_t ar_irregular_istata(el_val_t slot, el_val_t tense); el_val_t ar_irregular_jaa(el_val_t slot, el_val_t tense); el_val_t ar_irregular_kaana(el_val_t slot, el_val_t tense); el_val_t ar_irregular_qaala(el_val_t slot, el_val_t tense); el_val_t ar_irregular_raaa(el_val_t slot, el_val_t tense); -el_val_t ar_irregular(el_val_t verb, el_val_t tense, el_val_t slot); el_val_t ar_is_sun_letter(el_val_t c); el_val_t ar_masc_pl_ending(el_val_t kase); el_val_t ar_noun_form(el_val_t noun, el_val_t gender, el_val_t kase, el_val_t number, el_val_t definite); @@ -174,8 +179,8 @@ el_val_t cop_map_canonical(el_val_t verb); el_val_t cop_nau_future(el_val_t prefix); el_val_t cop_nau_perfect(el_val_t prefix); el_val_t cop_nau_present(el_val_t prefix); -el_val_t cop_noun_phrase_gendered(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite, el_val_t gender); el_val_t cop_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); +el_val_t cop_noun_phrase_gendered(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite, el_val_t gender); el_val_t cop_regular_future(el_val_t prefix, el_val_t stem); el_val_t cop_regular_perfect(el_val_t prefix, el_val_t stem); el_val_t cop_regular_present(el_val_t prefix, el_val_t stem); @@ -185,16 +190,16 @@ el_val_t cop_shwpe_present(el_val_t prefix); el_val_t cop_slot(el_val_t person, el_val_t number); el_val_t cop_str_ends(el_val_t s, el_val_t suf); el_val_t cop_str_len(el_val_t s); -el_val_t cop_subject_prefix_gendered(el_val_t person, el_val_t gender, el_val_t number); el_val_t cop_subject_prefix(el_val_t person, el_val_t number); +el_val_t cop_subject_prefix_gendered(el_val_t person, el_val_t gender, el_val_t number); el_val_t current_engine_note(el_val_t model); el_val_t de_adj_ending(el_val_t gender, el_val_t gram_case, el_val_t number, el_val_t article_type); +el_val_t de_article(el_val_t gender, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t de_article_def(el_val_t gender, el_val_t gram_case, el_val_t number); el_val_t de_article_indef(el_val_t gender, el_val_t gram_case, el_val_t number); -el_val_t de_article(el_val_t gender, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t de_case_ending(el_val_t noun, el_val_t gender, el_val_t gram_case, el_val_t number); -el_val_t de_conjugate_weak(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number); el_val_t de_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t de_conjugate_weak(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number); el_val_t de_irregular_present(el_val_t verb, el_val_t person, el_val_t number); el_val_t de_norm_number(el_val_t number); el_val_t de_norm_person(el_val_t person); @@ -204,12 +209,15 @@ el_val_t dharma_network_state(void); el_val_t dharma_registry(void); el_val_t dispatch_tool(el_val_t tool_name, el_val_t tool_input); el_val_t distill_transcript(el_val_t transcript); -el_val_t egy_conjugate_copula(el_val_t tense, el_val_t slot); -el_val_t egy_conjugate_pronoun(el_val_t person, el_val_t number); -el_val_t egy_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t egy_Dd_future(el_val_t slot); el_val_t egy_Dd_past(el_val_t slot); el_val_t egy_Dd_present(el_val_t slot); +el_val_t egy_Sm_future(el_val_t slot); +el_val_t egy_Sm_past(el_val_t slot); +el_val_t egy_Sm_present(el_val_t slot); +el_val_t egy_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t egy_conjugate_copula(el_val_t tense, el_val_t slot); +el_val_t egy_conjugate_pronoun(el_val_t person, el_val_t number); el_val_t egy_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t egy_drop(el_val_t s, el_val_t n); el_val_t egy_fem(el_val_t noun); @@ -233,11 +241,8 @@ el_val_t egy_regular_present(el_val_t stem, el_val_t slot); el_val_t egy_sdm_future(el_val_t slot); el_val_t egy_sdm_past(el_val_t slot); el_val_t egy_sdm_present(el_val_t slot); -el_val_t egy_slot_with_gender(el_val_t person, el_val_t gender, el_val_t number); el_val_t egy_slot(el_val_t person, el_val_t number); -el_val_t egy_Sm_future(el_val_t slot); -el_val_t egy_Sm_past(el_val_t slot); -el_val_t egy_Sm_present(el_val_t slot); +el_val_t egy_slot_with_gender(el_val_t person, el_val_t gender, el_val_t number); el_val_t egy_str_ends(el_val_t s, el_val_t suf); el_val_t egy_str_len(el_val_t s); el_val_t egy_suffix_pronoun(el_val_t slot); @@ -258,9 +263,9 @@ el_val_t en_verb_3sg(el_val_t base); el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number); el_val_t en_verb_gerund(el_val_t base); el_val_t en_verb_past(el_val_t base); +el_val_t engram_compile(el_val_t intent); el_val_t engram_compile_multi(el_val_t topic); el_val_t engram_compile_ranked(el_val_t nodes_json, el_val_t max_nodes); -el_val_t engram_compile(el_val_t intent); el_val_t engram_dedup_nodes(el_val_t nodes_json); el_val_t engram_detect_recall_intent(el_val_t message); el_val_t engram_extract_entities(el_val_t message); @@ -326,9 +331,9 @@ el_val_t es_starts_with_stressed_a(el_val_t noun); el_val_t es_stem(el_val_t base); el_val_t es_str_drop_last(el_val_t s, el_val_t n); el_val_t es_str_ends(el_val_t s, el_val_t suf); -el_val_t es_str_last_char(el_val_t s); el_val_t es_str_last2(el_val_t s); el_val_t es_str_last3(el_val_t s); +el_val_t es_str_last_char(el_val_t s); el_val_t es_verb_class(el_val_t base); el_val_t extract_dim(el_val_t content, el_val_t key); el_val_t fi_apply_case(el_val_t noun, el_val_t gram_case, el_val_t number); @@ -371,8 +376,8 @@ el_val_t fr_slot(el_val_t person, el_val_t number); el_val_t fr_stem(el_val_t base); el_val_t fr_str_drop_last(el_val_t s, el_val_t n); el_val_t fr_str_ends(el_val_t s, el_val_t suf); -el_val_t fr_str_last_char(el_val_t s); el_val_t fr_str_last2(el_val_t s); +el_val_t fr_str_last_char(el_val_t s); el_val_t fr_subject_starts_vowel(el_val_t subject); el_val_t fr_uses_etre(el_val_t verb); el_val_t fr_verb_ends_vowel(el_val_t verb_form); @@ -394,9 +399,9 @@ el_val_t fro_conj3_future(el_val_t verb, el_val_t slot); el_val_t fro_conj3_past(el_val_t stem, el_val_t slot); el_val_t fro_conj3_present(el_val_t stem, el_val_t slot); el_val_t fro_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t fro_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t fro_decline_fem(el_val_t noun, el_val_t number); el_val_t fro_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number); -el_val_t fro_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t fro_drop(el_val_t s, el_val_t n); el_val_t fro_estre_future(el_val_t slot); el_val_t fro_estre_past(el_val_t slot); @@ -414,15 +419,15 @@ el_val_t fro_venir_past(el_val_t slot); el_val_t fro_venir_present(el_val_t slot); el_val_t fro_verb_class(el_val_t verb); el_val_t fro_verb_stem(el_val_t verb, el_val_t vclass); -el_val_t generate_frame_lang(el_val_t frame, el_val_t lang_code); +el_val_t generate(el_val_t semantic_form_json); el_val_t generate_frame(el_val_t frame); +el_val_t generate_frame_lang(el_val_t frame, el_val_t lang_code); el_val_t generate_lang(el_val_t semantic_form_json, el_val_t lang_code); el_val_t generate_tree(el_val_t rule_id_str, el_val_t slots); -el_val_t generate(el_val_t semantic_form_json); el_val_t get_rules(void); el_val_t get_vocab(void); -el_val_t gez_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t gez_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t gez_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t gez_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t gez_generic_imperfect(el_val_t base3sg, el_val_t slot); el_val_t gez_generic_perfect(el_val_t base3sg, el_val_t slot); @@ -441,12 +446,13 @@ el_val_t gez_qwl_imperfect(el_val_t slot); el_val_t gez_qwl_perfect(el_val_t slot); el_val_t gez_ray_imperfect(el_val_t slot); el_val_t gez_ray_perfect(el_val_t slot); -el_val_t gez_slot_g(el_val_t person, el_val_t gender, el_val_t number); el_val_t gez_slot(el_val_t person, el_val_t number); +el_val_t gez_slot_g(el_val_t person, el_val_t gender, el_val_t number); el_val_t gez_str_drop_last(el_val_t s, el_val_t n); el_val_t gez_str_ends(el_val_t s, el_val_t suf); el_val_t gez_str_len(el_val_t s); el_val_t goh_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t goh_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t goh_decline_fem_o_pl(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_fem_o_sg(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_masc_a_pl(el_val_t stem, el_val_t gram_case); @@ -455,7 +461,6 @@ el_val_t goh_decline_masc_n_pl(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_masc_n_sg(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_neut_a_pl(el_val_t stem, el_val_t gram_case); el_val_t goh_decline_neut_a_sg(el_val_t stem, el_val_t gram_case); -el_val_t goh_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t goh_demo_article(el_val_t stype, el_val_t number); el_val_t goh_drop(el_val_t s, el_val_t n); el_val_t goh_extract_stem(el_val_t noun, el_val_t stype); @@ -480,13 +485,13 @@ el_val_t goh_weak_present(el_val_t stem, el_val_t slot); el_val_t goh_wesan_past(el_val_t slot); el_val_t goh_wesan_present(el_val_t slot); el_val_t got_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t got_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t got_decline_a_stem_pl(el_val_t stem, el_val_t gram_case); el_val_t got_decline_a_stem_sg(el_val_t stem, el_val_t gram_case); el_val_t got_decline_n_stem_pl(el_val_t stem, el_val_t gram_case); el_val_t got_decline_n_stem_sg(el_val_t stem, el_val_t gram_case); el_val_t got_decline_o_stem_pl(el_val_t stem, el_val_t gram_case); el_val_t got_decline_o_stem_sg(el_val_t stem, el_val_t gram_case); -el_val_t got_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t got_demo_article(el_val_t stype); el_val_t got_extract_stem(el_val_t noun, el_val_t stype); el_val_t got_gaggan_past(el_val_t slot); @@ -519,17 +524,17 @@ el_val_t gram_build_vp(el_val_t verb, el_val_t aux, el_val_t profile); el_val_t gram_order_constituents(el_val_t subj, el_val_t verb, el_val_t obj, el_val_t profile); el_val_t gram_question_strategy(el_val_t profile); el_val_t gram_word_order(el_val_t profile); +el_val_t grc_article(el_val_t gender, el_val_t gram_case, el_val_t number); el_val_t grc_article_feminine(el_val_t gram_case, el_val_t number); el_val_t grc_article_masculine(el_val_t gram_case, el_val_t number); el_val_t grc_article_neuter(el_val_t gram_case, el_val_t number); -el_val_t grc_article(el_val_t gender, el_val_t gram_case, el_val_t number); el_val_t grc_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t grc_declension(el_val_t noun); +el_val_t grc_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t grc_decline_1a(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t grc_decline_1e(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t grc_decline_2m(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t grc_decline_2n(el_val_t stem, el_val_t gram_case, el_val_t number); -el_val_t grc_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t grc_echein_aorist(el_val_t slot); el_val_t grc_echein_future(el_val_t slot); el_val_t grc_echein_imperfect(el_val_t slot); @@ -556,9 +561,9 @@ el_val_t grc_present_stem(el_val_t verb); el_val_t grc_slot(el_val_t person, el_val_t number); el_val_t grc_str_drop_last(el_val_t s, el_val_t n); el_val_t grc_str_ends(el_val_t s, el_val_t suf); -el_val_t grc_str_last_char(el_val_t s); el_val_t grc_str_last2(el_val_t s); el_val_t grc_str_last3(el_val_t s); +el_val_t grc_str_last_char(el_val_t s); el_val_t grc_thematic_future_ending(el_val_t slot); el_val_t grc_thematic_imperfect_ending(el_val_t slot); el_val_t grc_thematic_present_ending(el_val_t slot); @@ -590,17 +595,17 @@ el_val_t handle_api_recall(el_val_t method, el_val_t path, el_val_t body); el_val_t handle_api_remember(el_val_t body); el_val_t handle_api_search_knowledge(el_val_t method, el_val_t path, el_val_t body); el_val_t handle_api_tune_config(el_val_t body); +el_val_t handle_chat(el_val_t body); el_val_t handle_chat_agentic(el_val_t body); el_val_t handle_chat_as_soul(el_val_t body); el_val_t handle_chat_plan(el_val_t body); -el_val_t handle_chat(el_val_t body); el_val_t handle_config(el_val_t method, el_val_t body); el_val_t handle_connectors(el_val_t method, el_val_t clean, el_val_t body); el_val_t handle_conversations(el_val_t method); -el_val_t handle_dharma_recv(el_val_t body); -el_val_t handle_dharma_room_turn_agentic(el_val_t body); -el_val_t handle_dharma_room_turn(el_val_t body); el_val_t handle_dharma(el_val_t path, el_val_t method, el_val_t body); +el_val_t handle_dharma_recv(el_val_t body); +el_val_t handle_dharma_room_turn(el_val_t body); +el_val_t handle_dharma_room_turn_agentic(el_val_t body); el_val_t handle_elp_chat(el_val_t body); el_val_t handle_nlg(el_val_t path, el_val_t method, el_val_t body); el_val_t handle_request(el_val_t method, el_val_t path, el_val_t body); @@ -608,11 +613,11 @@ el_val_t handle_safety_contact_get(void); el_val_t handle_safety_contact_post(el_val_t body); el_val_t handle_see(el_val_t body); el_val_t handle_session_approve(el_val_t session_id, el_val_t body); -el_val_t handle_tool_result(el_val_t session_id, el_val_t body); el_val_t handle_tool(el_val_t path, el_val_t method, el_val_t body); +el_val_t handle_tool_result(el_val_t session_id, el_val_t body); el_val_t hard_bell_threshold(void); -el_val_t he_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t he_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number); +el_val_t he_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t he_copula_future(el_val_t slot); el_val_t he_copula_past(el_val_t slot); el_val_t he_definite_prefix(el_val_t noun); @@ -640,6 +645,7 @@ el_val_t he_str_drop_last(el_val_t s, el_val_t n); el_val_t he_str_ends(el_val_t s, el_val_t suf); el_val_t he_str_last_char(el_val_t s); el_val_t he_str_len(el_val_t s); +el_val_t hebb_consolidate(void); el_val_t hi_agree_genitive(el_val_t possessed_gender, el_val_t possessed_number); el_val_t hi_aux_present(el_val_t person, el_val_t number); el_val_t hi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number); @@ -649,12 +655,12 @@ el_val_t hi_genitive_phrase(el_val_t possessor, el_val_t possessor_gender, el_va el_val_t hi_hona_past(el_val_t gender, el_val_t number); el_val_t hi_hona_present(el_val_t person, el_val_t number); el_val_t hi_masc_aa_stem(el_val_t noun); +el_val_t hi_noun_direct(el_val_t noun, el_val_t gender, el_val_t number); el_val_t hi_noun_direct_f(el_val_t noun, el_val_t number); el_val_t hi_noun_direct_m(el_val_t noun, el_val_t number); -el_val_t hi_noun_direct(el_val_t noun, el_val_t gender, el_val_t number); +el_val_t hi_noun_oblique(el_val_t noun, el_val_t gender, el_val_t number); el_val_t hi_noun_oblique_f(el_val_t noun, el_val_t number); el_val_t hi_noun_oblique_m(el_val_t noun, el_val_t number); -el_val_t hi_noun_oblique(el_val_t noun, el_val_t gender, el_val_t number); el_val_t hi_noun_with_post(el_val_t noun, el_val_t gender, el_val_t number, el_val_t gram_case); el_val_t hi_past_irregular(el_val_t stem, el_val_t gender, el_val_t number); el_val_t hi_past_suffix(el_val_t gender, el_val_t number); @@ -664,11 +670,11 @@ el_val_t hi_str_drop_last(el_val_t s, el_val_t n); el_val_t hi_str_ends(el_val_t s, el_val_t suf); el_val_t hi_str_last_char(el_val_t s); el_val_t hi_tense_suffix(el_val_t tense, el_val_t gender, el_val_t number); -el_val_t hi_verb_stem_clean(el_val_t infinitive); el_val_t hi_verb_stem(el_val_t infinitive); +el_val_t hi_verb_stem_clean(el_val_t infinitive); el_val_t hist_append(el_val_t hist, el_val_t role, el_val_t content); -el_val_t hist_trim_with_bell_guard(el_val_t hist); el_val_t hist_trim(el_val_t hist); +el_val_t hist_trim_with_bell_guard(el_val_t hist); el_val_t id_in_seen(el_val_t node_id, el_val_t seen); el_val_t idle_count(void); el_val_t idle_inc(void); @@ -699,6 +705,7 @@ el_val_t json_escape(el_val_t s); el_val_t json_safe(el_val_t s); el_val_t la_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t la_declension(el_val_t noun); +el_val_t la_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t la_decline_1(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t la_decline_2er(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t la_decline_2m(el_val_t stem, el_val_t gram_case, el_val_t number); @@ -706,7 +713,6 @@ el_val_t la_decline_2n(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t la_decline_3(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t la_decline_4(el_val_t stem, el_val_t gram_case, el_val_t number); el_val_t la_decline_5(el_val_t stem, el_val_t gram_case, el_val_t number); -el_val_t la_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t la_esse_future(el_val_t slot); el_val_t la_esse_past(el_val_t slot); el_val_t la_esse_present(el_val_t slot); @@ -730,9 +736,9 @@ el_val_t la_slot(el_val_t person, el_val_t number); el_val_t la_stem(el_val_t verb, el_val_t vclass); el_val_t la_str_drop_last(el_val_t s, el_val_t n); el_val_t la_str_ends(el_val_t s, el_val_t suf); -el_val_t la_str_last_char(el_val_t s); el_val_t la_str_last2(el_val_t s); el_val_t la_str_last3(el_val_t s); +el_val_t la_str_last_char(el_val_t s); el_val_t la_velle_future(el_val_t slot); el_val_t la_velle_past(el_val_t slot); el_val_t la_velle_present(el_val_t slot); @@ -749,6 +755,7 @@ el_val_t lang_is_fusional(el_val_t profile); el_val_t lang_is_isolating(el_val_t profile); el_val_t lang_is_polysynthetic(el_val_t profile); el_val_t lang_is_rtl(el_val_t profile); +el_val_t lang_profile(el_val_t code, el_val_t word_order, el_val_t morph_type, el_val_t has_case, el_val_t has_gender, el_val_t script_dir, el_val_t agreement, el_val_t null_subject); el_val_t lang_profile_akk(void); el_val_t lang_profile_ang(void); el_val_t lang_profile_ar(void); @@ -780,7 +787,6 @@ el_val_t lang_profile_sw(void); el_val_t lang_profile_txb(void); el_val_t lang_profile_uga(void); el_val_t lang_profile_zh(void); -el_val_t lang_profile(el_val_t code, el_val_t word_order, el_val_t morph_type, el_val_t has_case, el_val_t has_gender, el_val_t script_dir, el_val_t agreement, el_val_t null_subject); el_val_t lang_word_order(el_val_t profile); el_val_t layered_cycle(el_val_t raw_input); el_val_t lex_class(el_val_t entry); @@ -831,10 +837,10 @@ el_val_t morph_pluralize(el_val_t noun, el_val_t profile); el_val_t next_bridge_id(void); el_val_t nlg_is_ws(el_val_t c); el_val_t non_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t non_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t non_decline_fem(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t non_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t non_decline_neut(el_val_t noun, el_val_t gram_case, el_val_t number); -el_val_t non_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t non_def_suffix_fem(el_val_t gram_case, el_val_t number); el_val_t non_def_suffix_masc(el_val_t gram_case, el_val_t number); el_val_t non_def_suffix_neut(el_val_t gram_case, el_val_t number); @@ -868,8 +874,8 @@ el_val_t peo_ah_present(el_val_t slot); el_val_t peo_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t peo_da_past(el_val_t slot); el_val_t peo_da_present(el_val_t slot); -el_val_t peo_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t peo_decline(el_val_t noun, el_val_t gram_case, el_val_t number); +el_val_t peo_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t peo_drop(el_val_t s, el_val_t n); el_val_t peo_ends(el_val_t s, el_val_t suf); el_val_t peo_kar_past(el_val_t slot); @@ -885,11 +891,11 @@ el_val_t perceive(void); el_val_t pi_aorist_ending(el_val_t slot); el_val_t pi_atthi_present(el_val_t slot); el_val_t pi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t pi_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t pi_decline_a_fem_pl(el_val_t stem, el_val_t gram_case); el_val_t pi_decline_a_fem_sg(el_val_t stem, el_val_t gram_case); el_val_t pi_decline_a_masc_pl(el_val_t stem, el_val_t gram_case); el_val_t pi_decline_a_masc_sg(el_val_t stem, el_val_t gram_case); -el_val_t pi_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t pi_detect_class(el_val_t noun); el_val_t pi_drop(el_val_t s, el_val_t n); el_val_t pi_future_ending(el_val_t slot); @@ -920,11 +926,11 @@ el_val_t proactive_curiosity(void); el_val_t pulse_count(void); el_val_t pulse_inc(void); el_val_t rate_limit_check(el_val_t ip, el_val_t path); +el_val_t realize(el_val_t form); el_val_t realize_lang(el_val_t form, el_val_t profile); el_val_t realize_np(el_val_t referent, el_val_t number); el_val_t realize_question_lang(el_val_t predicate, el_val_t tense, el_val_t aspect, el_val_t person, el_val_t number, el_val_t agent, el_val_t patient, el_val_t location, el_val_t profile); el_val_t realize_vp_lang(el_val_t base_verb, el_val_t tense, el_val_t aspect, el_val_t person, el_val_t number, el_val_t profile); -el_val_t realize(el_val_t form); el_val_t record(el_val_t outcome_json); el_val_t render_studio(void); el_val_t render_tree(el_val_t tree); @@ -935,9 +941,9 @@ el_val_t route_imprint_contextual(el_val_t body); el_val_t route_imprint_user(el_val_t body); el_val_t route_lineage(void); el_val_t route_synthesize(el_val_t body); +el_val_t ru_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t gender); el_val_t ru_conjugate_1st(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number); el_val_t ru_conjugate_2nd(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number); -el_val_t ru_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t gender); el_val_t ru_decline_fem(el_val_t noun, el_val_t stype, el_val_t gram_case, el_val_t number); el_val_t ru_decline_masc(el_val_t noun, el_val_t stype, el_val_t gram_case, el_val_t number); el_val_t ru_decline_neut(el_val_t noun, el_val_t stype, el_val_t gram_case, el_val_t number); @@ -950,8 +956,8 @@ el_val_t ru_past_stem(el_val_t verb); el_val_t ru_stem_type(el_val_t noun, el_val_t gender); el_val_t rule_id(el_val_t rule); el_val_t rule_lhs(el_val_t rule); -el_val_t rule_rhs_len(el_val_t rule); el_val_t rule_rhs(el_val_t rule, el_val_t idx); +el_val_t rule_rhs_len(el_val_t rule); el_val_t run_command_guard(el_val_t cmd, el_val_t root); el_val_t run_command_is_readonly(el_val_t cmd); el_val_t sa_as_future(el_val_t slot); @@ -965,11 +971,11 @@ el_val_t sa_class1_future_ending(el_val_t slot); el_val_t sa_class1_past_ending(el_val_t slot); el_val_t sa_class1_present_ending(el_val_t slot); el_val_t sa_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t sa_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t sa_decline_a_stem_pl(el_val_t stem, el_val_t gram_case); el_val_t sa_decline_a_stem_sg(el_val_t stem, el_val_t gram_case); el_val_t sa_decline_aa_stem_pl(el_val_t stem, el_val_t gram_case); el_val_t sa_decline_aa_stem_sg(el_val_t stem, el_val_t gram_case); -el_val_t sa_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t sa_drs_future(el_val_t slot); el_val_t sa_drs_past(el_val_t slot); el_val_t sa_drs_present(el_val_t slot); @@ -1017,26 +1023,26 @@ el_val_t scan_token(el_val_t s, el_val_t start); el_val_t security_research_authorized(void); el_val_t seed_persona_from_env(void); el_val_t sem_first_modifier(el_val_t mods); +el_val_t sem_frame(el_val_t intent, el_val_t subject, el_val_t obj, el_val_t modifiers); el_val_t sem_frame_lang(el_val_t intent, el_val_t subject, el_val_t obj, el_val_t modifiers, el_val_t lang_code); el_val_t sem_frame_obj(el_val_t intent, el_val_t subject, el_val_t obj); el_val_t sem_frame_simple(el_val_t intent, el_val_t subject); -el_val_t sem_frame(el_val_t intent, el_val_t subject, el_val_t obj, el_val_t modifiers); el_val_t sem_get(el_val_t json, el_val_t key); -el_val_t sem_intent_to_realize(el_val_t intent); el_val_t sem_intent(el_val_t frame); +el_val_t sem_intent_to_realize(el_val_t intent); el_val_t sem_lang(el_val_t frame); el_val_t sem_modifiers(el_val_t frame); el_val_t sem_object(el_val_t frame); +el_val_t sem_realize(el_val_t frame); el_val_t sem_realize_full(el_val_t frame, el_val_t verb, el_val_t tense, el_val_t aspect); el_val_t sem_realize_greet(el_val_t subject); el_val_t sem_realize_lang(el_val_t frame, el_val_t lang_code); -el_val_t sem_realize(el_val_t frame); el_val_t sem_subject(el_val_t frame); -el_val_t sem_to_spec_full(el_val_t frame, el_val_t verb, el_val_t tense, el_val_t aspect); el_val_t sem_to_spec(el_val_t frame); +el_val_t sem_to_spec_full(el_val_t frame, el_val_t verb, el_val_t tense, el_val_t aspect); el_val_t session_auto_title(el_val_t session_id, el_val_t first_message); -el_val_t session_create_cleanup(el_val_t session_id); el_val_t session_create(el_val_t body); +el_val_t session_create_cleanup(el_val_t session_id); el_val_t session_delete(el_val_t session_id); el_val_t session_exists(el_val_t session_id); el_val_t session_get(el_val_t session_id); @@ -1045,11 +1051,11 @@ el_val_t session_hist_save(el_val_t session_id, el_val_t hist); el_val_t session_list(void); el_val_t session_make_content(el_val_t id, el_val_t title, el_val_t created_at, el_val_t updated_at, el_val_t folder); el_val_t session_preload_bullets(el_val_t nodes, el_val_t max_bullets, el_val_t snip_len); -el_val_t session_search_entry(el_val_t node); el_val_t session_search(el_val_t query); +el_val_t session_search_entry(el_val_t node); el_val_t session_summary_autogenerate(el_val_t hist); -el_val_t session_summary_write_dated(el_val_t summary_text, el_val_t label); el_val_t session_summary_write(el_val_t summary_text); +el_val_t session_summary_write_dated(el_val_t summary_text, el_val_t label); el_val_t session_title_from_message(el_val_t message); el_val_t session_update_meta_timestamp(el_val_t session_id); el_val_t session_update_patch(el_val_t session_id, el_val_t body); @@ -1060,9 +1066,9 @@ el_val_t sga_bith_past(el_val_t slot); el_val_t sga_bith_present(el_val_t slot); el_val_t sga_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); el_val_t sga_copula_present(el_val_t slot); +el_val_t sga_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t sga_decline_astem(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t sga_decline_ostem(el_val_t noun, el_val_t gram_case, el_val_t number); -el_val_t sga_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t sga_detect_gender(el_val_t noun); el_val_t sga_drop(el_val_t s, el_val_t n); el_val_t sga_first(el_val_t s); @@ -1090,9 +1096,9 @@ el_val_t steward_session_check(el_val_t input, el_val_t session_id); el_val_t steward_validate_imprint(el_val_t imprint_id, el_val_t tool_name); el_val_t str_drop_last(el_val_t s, el_val_t n); el_val_t str_ends(el_val_t s, el_val_t suf); -el_val_t str_last_char(el_val_t s); el_val_t str_last2(el_val_t s); el_val_t str_last3(el_val_t s); +el_val_t str_last_char(el_val_t s); el_val_t strengthen_chat_nodes(el_val_t activation_nodes); el_val_t strip_query(el_val_t path); el_val_t studio_tools_json(void); @@ -1119,8 +1125,8 @@ el_val_t sux_realize_sentence(el_val_t intent, el_val_t agent, el_val_t predicat el_val_t sux_slot(el_val_t person, el_val_t number); el_val_t sux_str_drop_last(el_val_t s, el_val_t n); el_val_t sux_str_ends(el_val_t s, el_val_t suf); -el_val_t sux_str_last_char(el_val_t s); el_val_t sux_str_last2(el_val_t s); +el_val_t sux_str_last_char(el_val_t s); el_val_t sux_tum2_past(el_val_t slot); el_val_t sux_tum2_present(el_val_t slot); el_val_t sux_verb_chain(el_val_t agent, el_val_t verb, el_val_t patient, el_val_t tense); @@ -1138,9 +1144,9 @@ el_val_t sw_noun_plural(el_val_t noun); el_val_t sw_obj_prefix(el_val_t person, el_val_t number, el_val_t noun_class); el_val_t sw_str_drop_last(el_val_t s, el_val_t n); el_val_t sw_str_ends(el_val_t s, el_val_t suf); -el_val_t sw_str_first_char(el_val_t s); el_val_t sw_str_first2(el_val_t s); el_val_t sw_str_first3(el_val_t s); +el_val_t sw_str_first_char(el_val_t s); el_val_t sw_str_last_char(el_val_t s); el_val_t sw_subj_prefix(el_val_t person, el_val_t number, el_val_t noun_class); el_val_t sw_tense_marker(el_val_t tense); @@ -1158,9 +1164,9 @@ el_val_t tombstone_node(el_val_t id); el_val_t tombstoned_id_set(void); el_val_t tool_auto_approved(el_val_t tool_name); el_val_t txb_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t txb_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t txb_decline_fem(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t txb_decline_masc(el_val_t noun, el_val_t gram_case, el_val_t number); -el_val_t txb_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t txb_detect_gender(el_val_t noun); el_val_t txb_drop(el_val_t s, el_val_t n); el_val_t txb_ends(el_val_t s, el_val_t suf); @@ -1175,8 +1181,8 @@ el_val_t txb_wes_present(el_val_t slot); el_val_t txb_ya_present(el_val_t slot); el_val_t uga_amr_imperfect(el_val_t slot); el_val_t uga_amr_perfect(el_val_t slot); -el_val_t uga_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t uga_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number); +el_val_t uga_conjugate_copula(el_val_t tense, el_val_t slot); el_val_t uga_decline(el_val_t noun, el_val_t gram_case, el_val_t number); el_val_t uga_generic_imperfect(el_val_t base3sg, el_val_t slot); el_val_t uga_generic_perfect(el_val_t base3sg, el_val_t slot); @@ -1191,8 +1197,8 @@ el_val_t uga_map_canonical(el_val_t verb); el_val_t uga_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite); el_val_t uga_ray_imperfect(el_val_t slot); el_val_t uga_ray_perfect(el_val_t slot); -el_val_t uga_slot_g(el_val_t person, el_val_t gender, el_val_t number); el_val_t uga_slot(el_val_t person, el_val_t number); +el_val_t uga_slot_g(el_val_t person, el_val_t gender, el_val_t number); el_val_t uga_str_drop_last(el_val_t s, el_val_t n); el_val_t uga_str_ends(el_val_t s, el_val_t suf); el_val_t uga_str_len(el_val_t s); @@ -1200,6 +1206,6 @@ el_val_t uga_strip_nom(el_val_t noun); el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number); el_val_t vocab_by_class(el_val_t cls); el_val_t vocab_by_pos(el_val_t pos); -el_val_t vocab_lookup_en(el_val_t word); el_val_t vocab_lookup(el_val_t word, el_val_t lang_code); +el_val_t vocab_lookup_en(el_val_t word); el_val_t vocab_synonym(el_val_t word, el_val_t lang_register, el_val_t lang_code); diff --git a/dist/routes.c b/dist/routes.c index 5f7e8d3..c8e6987 100644 --- a/dist/routes.c +++ b/dist/routes.c @@ -460,9 +460,9 @@ el_val_t handle_request(el_val_t method, el_val_t path, el_val_t body) { return engram_scan_nodes_json(9999, 0); } if (str_eq(clean, EL_STR("/api/graph/edges"))) { - el_val_t snap_path = el_str_concat(env(EL_STR("HOME")), EL_STR("/.neuron/engram/snapshot.json")); - engram_save(snap_path); - el_val_t snap = fs_read(snap_path); + el_val_t export_path = el_str_concat(env(EL_STR("HOME")), EL_STR("/.neuron/engram/.soul-edges-export.json")); + engram_save(export_path); + el_val_t snap = fs_read(export_path); el_val_t edges_raw = json_get_raw(snap, EL_STR("edges")); return ({ el_val_t _if_result_21 = 0; if (str_eq(edges_raw, EL_STR(""))) { _if_result_21 = (EL_STR("[]")); } else { _if_result_21 = (edges_raw); } _if_result_21; }); } diff --git a/memory.elh b/memory.elh index 607cdf7..c9f66e0 100644 --- a/memory.elh +++ b/memory.elh @@ -7,6 +7,7 @@ extern fn mem_remember(content: String, tags: String) -> String extern fn mem_recall(query: String, depth: Int) -> String extern fn mem_search(query: String, limit: Int) -> String extern fn mem_strengthen(node_id: String) -> Void +extern fn mem_tombstone(node_id: String) -> String extern fn mem_forget(node_id: String) -> Void extern fn mem_consolidate() -> String extern fn mem_save(path: String) -> Void diff --git a/neuron-api.elh b/neuron-api.elh index c3dbccb..510a68c 100644 --- a/neuron-api.elh +++ b/neuron-api.elh @@ -10,6 +10,9 @@ extern fn api_nonempty(s: String) -> Bool extern fn api_or_empty(s: String) -> String extern fn api_persisted(id: String) -> Bool extern fn api_not_persisted(id: String) -> String +extern fn tombstone_node(id: String) -> String +extern fn tombstoned_id_set() -> String +extern fn memory_hide_tombstoned(raw: String, path: String) -> String extern fn handle_api_begin_session(body: String) -> String extern fn handle_api_compile_ctx(body: String) -> String extern fn handle_api_remember(body: String) -> String diff --git a/routes.el b/routes.el index e4139c4..7624624 100644 --- a/routes.el +++ b/routes.el @@ -392,12 +392,31 @@ fn handle_request(method: String, path: String, body: String) -> String { return engram_scan_nodes_json(9999, 0) } if str_eq(clean, "/api/graph/edges") { - // TODO(reliability #8): engram_save races with awareness loop mem_save(). - // Both now use atomic write-to-temp+rename (el_runtime.c). Serialised - // by engram_global_mu. Future: add engram_edges_json() builtin. - let snap_path: String = env("HOME") + "/.neuron/engram/snapshot.json" - engram_save(snap_path) - let snap: String = fs_read(snap_path) + // A READ ROUTE MUST NEVER WRITE THE CANONICAL SNAPSHOT. + // + // (2026-08-07 self-review — caught by doing it.) This route used to + // serialize to $HOME/.neuron/engram/snapshot.json and read the edges + // back out of it. That path is the ENGRAM SERVER's canonical store, + // and this is the soul process. One GET here overwrote the durable + // graph with the soul's in-memory copy. I triggered it myself this + // morning fetching edges for a census: snapshot.json went from the + // server's 41,213 edges to the soul's 42,431, and the next engram + // restart loaded the soul's graph as canonical. It happened to be a + // superset this time — Knowledge 1198→1218, Memory 1238→1242, no + // durable type down — so nothing was lost. That was luck, not + // design. Had the soul been running a partial load (the exact + // failure soul.el's safe_to_seed guard exists to catch), a single + // GET would have destroyed the store, and no guard on the write + // side would have seen it coming. + // + // The engram server fixed this same class of bug on 2026-07-21 by + // routing exports to a dotted sidecar; the soul kept the original + // pattern. Same fix here: write the export where only an export + // lives. It also stops a 60MB serialize-and-reread on every GET of + // a debug endpoint. + let export_path: String = env("HOME") + "/.neuron/engram/.soul-edges-export.json" + engram_save(export_path) + let snap: String = fs_read(export_path) let edges_raw: String = json_get_raw(snap, "edges") return if str_eq(edges_raw, "") { "[]" } else { edges_raw } } diff --git a/routes.elh b/routes.elh index 6ddf7d7..eab06e6 100644 --- a/routes.elh +++ b/routes.elh @@ -1,4 +1,5 @@ // auto-generated by elc --emit-header — do not edit +extern fn flag_true(body: String, key: String) -> Bool extern fn rate_limit_check(ip: String, path: String) -> String extern fn strip_query(path: String) -> String extern fn err_404(path: String) -> String diff --git a/safety.elh b/safety.elh index 189775e..a5c42ff 100644 --- a/safety.elh +++ b/safety.elh @@ -14,6 +14,10 @@ extern fn safety_abuse_phrases() -> String extern fn safety_general_hard_phrases() -> String extern fn safety_threat_to_others_phrases() -> String extern fn safety_soft_phrases() -> String +extern fn safety_normalize(message: String) -> String +extern fn safety_any_match(text: String, phrases_json: String) -> Bool +extern fn safety_count_match(text: String, phrases_json: String) -> Int +extern fn safety_positive_phrases() -> String extern fn safety_detect_positive_level(message: String) -> String extern fn safety_detect_bell_level(message: String) -> String extern fn safety_classify_hard_bell(message: String) -> String diff --git a/sessions.elh b/sessions.elh index 8bd8d0c..35db5da 100644 --- a/sessions.elh +++ b/sessions.elh @@ -12,3 +12,6 @@ extern fn session_search_entry(node: String) -> String extern fn session_search(query: String) -> String extern fn session_hist_load(session_id: String) -> String extern fn session_hist_save(session_id: String, hist: String) -> Void +extern fn session_update_meta_timestamp(session_id: String) -> Void +extern fn session_auto_title(session_id: String, first_message: String) -> Void +extern fn handle_session_approve(session_id: String, body: String) -> String diff --git a/soul.elh b/soul.elh index 34a958a..f00ca68 100644 --- a/soul.elh +++ b/soul.elh @@ -1,5 +1,7 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn init_soul_edges() -> Void +extern fn ensure_self_canonical_bridge() -> Void +extern fn aff_try_slot(slot_json: String, aff_7d_ts: Int, acc_key: String) -> Void extern fn load_identity_context() -> Void extern fn seed_persona_from_env() -> Void extern fn emit_session_start_event() -> Void