Files
neuron/dist/sessions.c
T
will.anderson bdc07be344
Neuron Soul CI / build (push) Failing after 12m40s
Deploy Soul to GKE / deploy (push) Failing after 6m0s
chore(dist): compile EL recall/dedup/session-continuity fixes to C
Updates soul.c and all per-module .c files with:
- parse_float_x100() engram score fix
- id_in_seen dedup wiring across session_preload
- session-end summary hook + session-start recall
- Emergency structural repair (no duplicate fns, all callsites wired)
2026-06-23 13:04:06 -05:00

366 lines
24 KiB
C
Generated

#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t tier_working(void);
el_val_t tier_episodic(void);
el_val_t tier_canonical(void);
el_val_t mem_store(el_val_t content, el_val_t label, el_val_t tags);
el_val_t mem_remember(el_val_t content, el_val_t tags);
el_val_t mem_recall(el_val_t query, el_val_t depth);
el_val_t mem_search(el_val_t query, el_val_t limit);
el_val_t mem_strengthen(el_val_t node_id);
el_val_t mem_forget(el_val_t node_id);
el_val_t mem_consolidate(void);
el_val_t mem_save(el_val_t path);
el_val_t mem_load(el_val_t path);
el_val_t mem_boot_count_get(void);
el_val_t mem_boot_count_inc(void);
el_val_t mem_emit_state_event(el_val_t trigger, el_val_t kind, el_val_t content);
el_val_t chat_default_model(void);
el_val_t engram_numeric_valid(el_val_t s);
el_val_t parse_float_x100(el_val_t s);
el_val_t engram_score_node(el_val_t node_json);
el_val_t engram_render_node(el_val_t node_json);
el_val_t engram_render_nodes(el_val_t nodes_json);
el_val_t engram_dedup_nodes(el_val_t nodes_json);
el_val_t engram_compile_ranked(el_val_t nodes_json, el_val_t max_nodes);
el_val_t engram_split_topics(el_val_t message);
el_val_t engram_extract_entities(el_val_t message);
el_val_t engram_detect_recall_intent(el_val_t message);
el_val_t engram_is_continuation(el_val_t message, el_val_t hist_len);
el_val_t engram_compile_multi(el_val_t topic);
el_val_t engram_nodes_merge(el_val_t a, el_val_t b);
el_val_t id_in_seen(el_val_t node_id, el_val_t seen);
el_val_t add_to_seen(el_val_t seen, el_val_t node_id);
el_val_t engram_extract_ids(el_val_t nodes_json);
el_val_t engram_compile(el_val_t intent);
el_val_t json_safe(el_val_t s);
el_val_t build_system_prompt(el_val_t ctx, el_val_t chat_mode);
el_val_t hist_append(el_val_t hist, el_val_t role, el_val_t content);
el_val_t hist_trim(el_val_t hist);
el_val_t hist_trim_with_bell_guard(el_val_t hist);
el_val_t clean_llm_response(el_val_t s);
el_val_t conv_history_persist(el_val_t hist);
el_val_t conv_history_load(void);
el_val_t session_preload_bullets(el_val_t nodes, el_val_t max_bullets, el_val_t snip_len);
el_val_t handle_chat(el_val_t body);
el_val_t handle_see(el_val_t body);
el_val_t studio_tools_json(void);
el_val_t agentic_api_key(void);
el_val_t agentic_tools_literal(void);
el_val_t agentic_tools_with_web(void);
el_val_t connector_tools_json(void);
el_val_t agentic_tools_all(void);
el_val_t call_mcp_bridge(el_val_t tool_name, el_val_t tool_input);
el_val_t tool_auto_approved(el_val_t tool_name);
el_val_t call_neuron_mcp(el_val_t tool_name, el_val_t args);
el_val_t agent_workspace_root(void);
el_val_t path_within_root(el_val_t path, el_val_t root);
el_val_t resolve_in_root(el_val_t path, el_val_t root);
el_val_t dispatch_tool(el_val_t tool_name, el_val_t tool_input);
el_val_t is_builtin_tool(el_val_t tool_name);
el_val_t next_bridge_id(void);
el_val_t handle_chat_agentic(el_val_t body);
el_val_t agentic_loop(el_val_t session_id, el_val_t model, el_val_t safe_sys, el_val_t tools_json, el_val_t messages_in, el_val_t h, el_val_t tools_log_in);
el_val_t bridge_save(el_val_t session_id, el_val_t model, el_val_t safe_sys, el_val_t tools_json, el_val_t messages, el_val_t tools_log, el_val_t tool_use_id);
el_val_t agentic_resume(el_val_t session_id, el_val_t tool_use_id, el_val_t content);
el_val_t handle_tool_result(el_val_t session_id, el_val_t body);
el_val_t handle_chat_as_soul(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 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_summary_autogenerate(el_val_t hist);
el_val_t auto_persist(el_val_t req, el_val_t resp);
el_val_t strengthen_chat_nodes(el_val_t activation_nodes);
el_val_t session_title_from_message(el_val_t message);
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_exists(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_list(void);
el_val_t session_get(el_val_t session_id);
el_val_t session_delete(el_val_t session_id);
el_val_t session_update_patch(el_val_t session_id, el_val_t body);
el_val_t session_search(el_val_t query);
el_val_t session_hist_load(el_val_t session_id);
el_val_t session_hist_save(el_val_t session_id, el_val_t hist);
el_val_t session_title_from_message(el_val_t message) {
if (str_eq(message, EL_STR(""))) {
return EL_STR("New conversation");
}
el_val_t trimmed = str_trim(message);
if (str_len(trimmed) <= 60) {
return trimmed;
}
return str_slice(trimmed, 0, 60);
return 0;
}
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 safe_title = json_safe(title);
el_val_t safe_folder = json_safe(folder);
return 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("{\"type\":\"session:meta\""), EL_STR(",\"id\":\"")), id), EL_STR("\"")), EL_STR(",\"title\":\"")), safe_title), EL_STR("\"")), EL_STR(",\"folder\":\"")), safe_folder), EL_STR("\"")), EL_STR(",\"created_at\":")), int_to_str(created_at)), EL_STR(",\"updated_at\":")), int_to_str(updated_at)), EL_STR("}"));
return 0;
}
el_val_t session_exists(el_val_t session_id) {
if (str_eq(session_id, EL_STR(""))) {
return 0;
}
el_val_t idx = state_get(EL_STR("session_index"));
if (!str_eq(idx, EL_STR("")) && !str_eq(idx, EL_STR("[]"))) {
if (str_contains(idx, el_str_concat(el_str_concat(EL_STR("\"id\":\""), session_id), EL_STR("\"")))) {
return 1;
}
}
el_val_t results = engram_search_json(el_str_concat(EL_STR("session:meta "), session_id), 5);
if (str_eq(results, EL_STR(""))) {
return 0;
}
if (str_eq(results, EL_STR("[]"))) {
return 0;
}
el_val_t total = json_array_len(results);
el_val_t found = 0;
el_val_t i = 0;
while (i < total) {
el_val_t node = json_array_get(results, i);
el_val_t label = json_get(node, EL_STR("label"));
el_val_t content = json_get(node, EL_STR("content"));
el_val_t sid = json_get(content, EL_STR("id"));
el_val_t is_match = (str_eq(label, EL_STR("session:meta")) && str_eq(sid, session_id));
found = ({ el_val_t _if_result_1 = 0; if (is_match) { _if_result_1 = (1); } else { _if_result_1 = (found); } _if_result_1; });
i = (i + 1);
}
return found;
return 0;
}
el_val_t session_create(el_val_t body) {
el_val_t ts = time_now();
el_val_t id = uuid_v4();
el_val_t title_req = json_get(body, EL_STR("title"));
el_val_t title = ({ el_val_t _if_result_2 = 0; if (str_eq(title_req, EL_STR(""))) { _if_result_2 = (EL_STR("New conversation")); } else { _if_result_2 = (title_req); } _if_result_2; });
el_val_t folder = json_get(body, EL_STR("folder"));
el_val_t content = session_make_content(id, title, ts, ts, folder);
el_val_t tags = EL_STR("[\"session\",\"session:meta\",\"Conversation\"]");
el_val_t node_id = engram_node_full(content, EL_STR("Conversation"), EL_STR("session:meta"), el_from_float(0.7), el_from_float(0.7), el_from_float(0.9), EL_STR("Episodic"), tags);
if (str_eq(node_id, EL_STR(""))) {
return EL_STR("{\"error\":\"failed to create session\"}");
}
state_set(el_str_concat(EL_STR("session_node_"), id), node_id);
state_set(el_str_concat(EL_STR("session_pending_first_msg_"), id), EL_STR("1"));
el_val_t existing_idx = state_get(EL_STR("session_index"));
el_val_t idx_entry = 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("{\"id\":\""), id), EL_STR("\",\"title\":\"")), json_safe(title)), EL_STR("\",\"folder\":\"")), json_safe(folder)), EL_STR("\",\"created_at\":")), int_to_str(ts)), EL_STR(",\"updated_at\":")), int_to_str(ts)), EL_STR(",\"last_message\":\"\"}"));
el_val_t new_idx = ({ el_val_t _if_result_3 = 0; if (str_eq(existing_idx, EL_STR(""))) { _if_result_3 = (el_str_concat(el_str_concat(EL_STR("["), idx_entry), EL_STR("]"))); } else { el_val_t inner = str_slice(existing_idx, 1, (str_len(existing_idx) - 1)); _if_result_3 = (el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("["), idx_entry), EL_STR(",")), inner), EL_STR("]"))); } _if_result_3; });
state_set(EL_STR("session_index"), new_idx);
return 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("{\"id\":\""), id), EL_STR("\"")), EL_STR(",\"title\":\"")), json_safe(title)), EL_STR("\"")), EL_STR(",\"folder\":\"")), json_safe(folder)), EL_STR("\"")), EL_STR(",\"node_id\":\"")), node_id), EL_STR("\"")), EL_STR(",\"created_at\":")), int_to_str(ts)), EL_STR("}"));
return 0;
}
el_val_t session_create_cleanup(el_val_t session_id) {
if (str_eq(session_id, EL_STR(""))) {
return EL_STR("{\"error\":\"session_id is required\"}");
}
state_set(el_str_concat(EL_STR("session_pending_first_msg_"), session_id), EL_STR(""));
return session_delete(session_id);
return 0;
}
el_val_t session_list(void) {
el_val_t state_idx = state_get(EL_STR("session_index"));
if (!str_eq(state_idx, EL_STR("")) && !str_eq(state_idx, EL_STR("[]"))) {
return state_idx;
}
el_val_t results = engram_search_json(EL_STR("session:meta"), 50);
if (str_eq(results, EL_STR(""))) {
return EL_STR("[]");
}
if (str_eq(results, EL_STR("[]"))) {
return EL_STR("[]");
}
el_val_t total = json_array_len(results);
el_val_t out = EL_STR("");
el_val_t i = 0;
while (i < total) {
el_val_t node = json_array_get(results, i);
el_val_t label = json_get(node, EL_STR("label"));
el_val_t node_type = json_get(node, EL_STR("node_type"));
el_val_t is_session = (str_eq(label, EL_STR("session:meta")) && str_eq(node_type, EL_STR("Conversation")));
el_val_t content = json_get(node, EL_STR("content"));
el_val_t sess_id = json_get(content, EL_STR("id"));
el_val_t eff_id = ({ el_val_t _if_result_4 = 0; if (str_eq(sess_id, EL_STR(""))) { _if_result_4 = (json_get(node, EL_STR("id"))); } else { _if_result_4 = (sess_id); } _if_result_4; });
el_val_t title_inner = json_get(content, EL_STR("title"));
el_val_t eff_title = ({ el_val_t _if_result_5 = 0; if (str_eq(title_inner, EL_STR(""))) { _if_result_5 = (EL_STR("New conversation")); } else { _if_result_5 = (title_inner); } _if_result_5; });
el_val_t folder_inner = json_get(content, EL_STR("folder"));
el_val_t created_inner = json_get(content, EL_STR("created_at"));
el_val_t updated_inner = json_get(content, EL_STR("updated_at"));
el_val_t eff_created = ({ el_val_t _if_result_6 = 0; if (str_eq(created_inner, EL_STR(""))) { _if_result_6 = (EL_STR("0")); } else { _if_result_6 = (created_inner); } _if_result_6; });
el_val_t eff_updated = ({ el_val_t _if_result_7 = 0; if (str_eq(updated_inner, EL_STR(""))) { _if_result_7 = (eff_created); } else { _if_result_7 = (updated_inner); } _if_result_7; });
el_val_t entry = ({ el_val_t _if_result_8 = 0; if (is_session) { _if_result_8 = (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("{\"id\":\""), json_safe(eff_id)), EL_STR("\"")), EL_STR(",\"title\":\"")), json_safe(eff_title)), EL_STR("\"")), EL_STR(",\"folder\":\"")), json_safe(folder_inner)), EL_STR("\"")), EL_STR(",\"last_message\":\"\"")), EL_STR(",\"created_at\":")), eff_created), EL_STR(",\"updated_at\":")), eff_updated), EL_STR("}"))); } else { _if_result_8 = (EL_STR("")); } _if_result_8; });
out = ({ el_val_t _if_result_9 = 0; if (!str_eq(entry, EL_STR(""))) { _if_result_9 = (({ el_val_t _if_result_10 = 0; if (str_eq(out, EL_STR(""))) { _if_result_10 = (entry); } else { _if_result_10 = (el_str_concat(el_str_concat(out, EL_STR(",")), entry)); } _if_result_10; })); } else { _if_result_9 = (out); } _if_result_9; });
i = (i + 1);
}
return el_str_concat(el_str_concat(EL_STR("["), out), EL_STR("]"));
return 0;
}
el_val_t session_get(el_val_t session_id) {
if (str_eq(session_id, EL_STR(""))) {
return EL_STR("{\"error\":\"session_id is required\"}");
}
el_val_t results = engram_search_json(el_str_concat(EL_STR("session:meta "), session_id), 10);
el_val_t meta_content = EL_STR("");
el_val_t meta_title = EL_STR("New conversation");
el_val_t meta_folder = EL_STR("");
el_val_t meta_created = EL_STR("0");
el_val_t meta_updated = EL_STR("0");
el_val_t found = 0;
el_val_t total = ({ el_val_t _if_result_11 = 0; if (str_eq(results, EL_STR(""))) { _if_result_11 = (0); } else { _if_result_11 = (json_array_len(results)); } _if_result_11; });
el_val_t i = 0;
while (i < total) {
el_val_t node = json_array_get(results, i);
el_val_t label = json_get(node, EL_STR("label"));
el_val_t content = json_get(node, EL_STR("content"));
el_val_t sid = json_get(content, EL_STR("id"));
el_val_t is_match = ((str_eq(label, EL_STR("session:meta")) && str_eq(sid, session_id)) && !found);
found = ({ el_val_t _if_result_12 = 0; if (is_match) { _if_result_12 = (1); } else { _if_result_12 = (found); } _if_result_12; });
meta_title = ({ el_val_t _if_result_13 = 0; if (is_match) { _if_result_13 = (json_get(content, EL_STR("title"))); } else { _if_result_13 = (meta_title); } _if_result_13; });
meta_folder = ({ el_val_t _if_result_14 = 0; if (is_match) { _if_result_14 = (json_get(content, EL_STR("folder"))); } else { _if_result_14 = (meta_folder); } _if_result_14; });
el_val_t meta_created_raw = json_get(content, EL_STR("created_at"));
meta_created = ({ el_val_t _if_result_15 = 0; if ((is_match && !str_eq(meta_created_raw, EL_STR("")))) { _if_result_15 = (meta_created_raw); } else { _if_result_15 = (meta_created); } _if_result_15; });
el_val_t meta_updated_raw = json_get(content, EL_STR("updated_at"));
meta_updated = ({ el_val_t _if_result_16 = 0; if ((is_match && !str_eq(meta_updated_raw, EL_STR("")))) { _if_result_16 = (meta_updated_raw); } else { _if_result_16 = (meta_updated); } _if_result_16; });
i = (i + 1);
}
el_val_t state_hist = state_get(el_str_concat(EL_STR("session_hist_"), session_id));
el_val_t hist_raw = ({ el_val_t _if_result_17 = 0; if (str_eq(state_hist, EL_STR(""))) { el_val_t engram_hist = engram_search_json(el_str_concat(EL_STR("session:messages:"), session_id), 3); _if_result_17 = (({ el_val_t _if_result_18 = 0; if (str_eq(engram_hist, EL_STR(""))) { _if_result_18 = (EL_STR("[]")); } else { _if_result_18 = (({ el_val_t _if_result_19 = 0; if (str_eq(engram_hist, EL_STR("[]"))) { _if_result_19 = (EL_STR("[]")); } else { el_val_t h_node = json_array_get(engram_hist, 0); el_val_t h_content = json_get(h_node, EL_STR("content")); _if_result_19 = (({ el_val_t _if_result_20 = 0; if (str_starts_with(h_content, EL_STR("["))) { _if_result_20 = (h_content); } else { _if_result_20 = (EL_STR("[]")); } _if_result_20; })); } _if_result_19; })); } _if_result_18; })); } else { _if_result_17 = (state_hist); } _if_result_17; });
el_val_t safe_title = json_safe(meta_title);
return 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("{\"id\":\""), session_id), EL_STR("\"")), EL_STR(",\"title\":\"")), safe_title), EL_STR("\"")), EL_STR(",\"folder\":\"")), json_safe(meta_folder)), EL_STR("\"")), EL_STR(",\"created_at\":")), meta_created), EL_STR(",\"updated_at\":")), meta_updated), EL_STR(",\"messages\":")), hist_raw), EL_STR("}"));
return 0;
}
el_val_t session_delete(el_val_t session_id) {
if (str_eq(session_id, EL_STR(""))) {
return EL_STR("{\"error\":\"session_id is required\"}");
}
el_val_t results = engram_search_json(el_str_concat(EL_STR("session:meta "), session_id), 10);
el_val_t total = ({ el_val_t _if_result_21 = 0; if (str_eq(results, EL_STR(""))) { _if_result_21 = (0); } else { _if_result_21 = (json_array_len(results)); } _if_result_21; });
el_val_t deleted_meta = 0;
el_val_t i = 0;
while (i < total) {
el_val_t node = json_array_get(results, i);
el_val_t label = json_get(node, EL_STR("label"));
el_val_t content = json_get(node, EL_STR("content"));
el_val_t sid = json_get(content, EL_STR("id"));
el_val_t is_match = (str_eq(label, EL_STR("session:meta")) && str_eq(sid, session_id));
el_val_t node_id = json_get(node, EL_STR("id"));
deleted_meta = ({ el_val_t _if_result_22 = 0; if ((is_match && !str_eq(node_id, EL_STR("")))) { (void)(engram_forget(node_id)); _if_result_22 = ((deleted_meta + 1)); } else { _if_result_22 = (deleted_meta); } _if_result_22; });
i = (i + 1);
}
el_val_t msg_results = engram_search_json(el_str_concat(EL_STR("session:messages:"), session_id), 10);
el_val_t m_total = ({ el_val_t _if_result_23 = 0; if (str_eq(msg_results, EL_STR(""))) { _if_result_23 = (0); } else { _if_result_23 = (json_array_len(msg_results)); } _if_result_23; });
el_val_t deleted_msgs = 0;
el_val_t j = 0;
while (j < m_total) {
el_val_t node = json_array_get(msg_results, j);
el_val_t label = json_get(node, EL_STR("label"));
el_val_t is_msgs = str_eq(label, el_str_concat(EL_STR("session:messages:"), session_id));
el_val_t node_id = json_get(node, EL_STR("id"));
deleted_msgs = ({ el_val_t _if_result_24 = 0; if ((is_msgs && !str_eq(node_id, EL_STR("")))) { (void)(engram_forget(node_id)); _if_result_24 = ((deleted_msgs + 1)); } else { _if_result_24 = (deleted_msgs); } _if_result_24; });
j = (j + 1);
}
state_set(el_str_concat(EL_STR("session_hist_"), session_id), EL_STR(""));
state_set(el_str_concat(EL_STR("session_node_"), session_id), EL_STR(""));
state_set(EL_STR("session_index"), EL_STR(""));
state_set(el_str_concat(EL_STR("mcp_bridge:"), session_id), EL_STR(""));
state_set(el_str_concat(EL_STR("always_allow_"), session_id), EL_STR(""));
state_set(el_str_concat(EL_STR("session_pending_first_msg_"), session_id), EL_STR(""));
return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"ok\":true,\"session_id\":\""), session_id), EL_STR("\"")), EL_STR(",\"deleted_meta\":")), int_to_str(deleted_meta)), EL_STR(",\"deleted_msgs\":")), int_to_str(deleted_msgs)), EL_STR("}"));
return 0;
}
el_val_t session_update_patch(el_val_t session_id, el_val_t body) {
if (str_eq(session_id, EL_STR(""))) {
return EL_STR("{\"error\":\"session_id is required\"}");
}
el_val_t has_title = str_contains(body, EL_STR("\"title\""));
el_val_t has_folder = str_contains(body, EL_STR("\"folder\""));
if (!has_title && !has_folder) {
return EL_STR("{\"error\":\"title or folder required in body\"}");
}
el_val_t results = engram_search_json(EL_STR("session:meta"), 50);
el_val_t total = ({ el_val_t _if_result_25 = 0; if (str_eq(results, EL_STR(""))) { _if_result_25 = (0); } else { _if_result_25 = (json_array_len(results)); } _if_result_25; });
el_val_t found = 0;
el_val_t old_title = EL_STR("New conversation");
el_val_t old_folder = EL_STR("");
el_val_t old_created = EL_STR("0");
el_val_t old_node_id = EL_STR("");
el_val_t i = 0;
while (i < total) {
el_val_t node = json_array_get(results, i);
el_val_t label = json_get(node, EL_STR("label"));
el_val_t content = json_get(node, EL_STR("content"));
el_val_t sid = json_get(content, EL_STR("id"));
el_val_t is_match = ((str_eq(label, EL_STR("session:meta")) && str_eq(sid, session_id)) && !found);
found = ({ el_val_t _if_result_26 = 0; if (is_match) { _if_result_26 = (1); } else { _if_result_26 = (found); } _if_result_26; });
el_val_t title_raw = json_get(content, EL_STR("title"));
old_title = ({ el_val_t _if_result_27 = 0; if ((is_match && !str_eq(title_raw, EL_STR("")))) { _if_result_27 = (title_raw); } else { _if_result_27 = (old_title); } _if_result_27; });
el_val_t folder_raw = json_get(content, EL_STR("folder"));
old_folder = ({ el_val_t _if_result_28 = 0; if (is_match) { _if_result_28 = (folder_raw); } else { _if_result_28 = (old_folder); } _if_result_28; });
el_val_t created_raw = json_get(content, EL_STR("created_at"));
old_created = ({ el_val_t _if_result_29 = 0; if ((is_match && !str_eq(created_raw, EL_STR("")))) { _if_result_29 = (created_raw); } else { _if_result_29 = (old_created); } _if_result_29; });
el_val_t nid = json_get(node, EL_STR("id"));
old_node_id = ({ el_val_t _if_result_30 = 0; if (is_match) { _if_result_30 = (nid); } else { _if_result_30 = (old_node_id); } _if_result_30; });
i = (i + 1);
}
if (!found) {
return el_str_concat(el_str_concat(EL_STR("{\"error\":\"session not found\",\"session_id\":\""), session_id), EL_STR("\"}"));
}
el_val_t req_title = json_get(body, EL_STR("title"));
el_val_t eff_title = ({ el_val_t _if_result_31 = 0; if ((has_title && !str_eq(req_title, EL_STR("")))) { _if_result_31 = (req_title); } else { _if_result_31 = (old_title); } _if_result_31; });
el_val_t eff_folder = ({ el_val_t _if_result_32 = 0; if (has_folder) { _if_result_32 = (json_get(body, EL_STR("folder"))); } else { _if_result_32 = (old_folder); } _if_result_32; });
if (!str_eq(old_node_id, EL_STR(""))) {
engram_forget(old_node_id);
}
el_val_t ts = time_now();
el_val_t created_int = str_to_int(old_created);
el_val_t new_content = session_make_content(session_id, eff_title, created_int, ts, eff_folder);
el_val_t tags = EL_STR("[\"session\",\"session:meta\",\"Conversation\"]");
el_val_t new_node_id = engram_node_full(new_content, EL_STR("Conversation"), EL_STR("session:meta"), el_from_float(0.7), el_from_float(0.7), el_from_float(0.9), EL_STR("Episodic"), tags);
state_set(el_str_concat(EL_STR("session_node_"), session_id), new_node_id);
state_set(EL_STR("session_index"), EL_STR(""));
return 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("{\"ok\":true,\"id\":\""), session_id), EL_STR("\"")), EL_STR(",\"title\":\"")), json_safe(eff_title)), EL_STR("\"")), EL_STR(",\"folder\":\"")), json_safe(eff_folder)), EL_STR("\"")), EL_STR(",\"updated_at\":")), int_to_str(ts)), EL_STR("}"));
return 0;
}
el_val_t session_search(el_val_t query) {
if (str_eq(query, EL_STR(""))) {
return EL_STR("[]");
}
el_val_t results = engram_search_json(el_str_concat(EL_STR("session:meta "), query), 20);
if (str_eq(results, EL_STR(""))) {
return EL_STR("[]");
}
if (str_eq(results, EL_STR("[]"))) {
return EL_STR("[]");
}
el_val_t total = json_array_len(results);
el_val_t out = EL_STR("");
el_val_t i = 0;
while (i < total) {
el_val_t node = json_array_get(results, i);
el_val_t label = json_get(node, EL_STR("label"));
el_val_t content = json_get(node, EL_STR("content"));
el_val_t is_session = str_eq(label, EL_STR("session:meta"));
el_val_t sess_id = json_get(content, EL_STR("id"));
el_val_t title = json_get(content, EL_STR("title"));
el_val_t created_raw = json_get(content, EL_STR("created_at"));
el_val_t updated_raw = json_get(content, EL_STR("updated_at"));
el_val_t eff_created = ({ el_val_t _if_result_33 = 0; if (str_eq(created_raw, EL_STR(""))) { _if_result_33 = (EL_STR("0")); } else { _if_result_33 = (created_raw); } _if_result_33; });
el_val_t eff_updated = ({ el_val_t _if_result_34 = 0; if (str_eq(updated_raw, EL_STR(""))) { _if_result_34 = (eff_created); } else { _if_result_34 = (updated_raw); } _if_result_34; });
el_val_t entry = ({ el_val_t _if_result_35 = 0; if ((is_session && !str_eq(sess_id, EL_STR("")))) { _if_result_35 = (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("{\"id\":\""), json_safe(sess_id)), EL_STR("\"")), EL_STR(",\"title\":\"")), json_safe(title)), EL_STR("\"")), EL_STR(",\"created_at\":")), eff_created), EL_STR(",\"updated_at\":")), eff_updated), EL_STR("}"))); } else { _if_result_35 = (EL_STR("")); } _if_result_35; });
out = ({ el_val_t _if_result_36 = 0; i