feat(recall): session-start-recall improvements
Neuron Soul CI / build (pull_request) Has been cancelled
Neuron Soul CI / build (pull_request) Has been cancelled
10 targeted fixes for session-start memory recall quality: Issue 1: typed engram queries (Persona, WorkItem) replace generic keyword bags Issue 2: bullet truncation raised from 120 to 350 chars Issue 3: bullet caps raised to 8/6 with while-loop (no hardcoded unrolling) Issue 4: read pre-computed soul_affective_context state key instead of duplicating boot-time search Issue 5: last-session-topic node written per session; continuity section added to session_preload Issue 6: greeting detection injects SESSION START orientation directive when continuity found Issue 7: pinned identity node fallback when all engram searches return empty Issue 8: session_preload always fires on first message (greeting detection controls directive only) Issue 9: agentic path gets matching session_preload block (was missing entirely) Issue 10: BellEvent recency reads created_at / embedded ts marker, not the never-written "ts" field
This commit is contained in:
+32
@@ -488,6 +488,38 @@ fn session_hist_save(session_id: String, hist: String) -> Void {
|
||||
state_set(summary_written_key, "1")
|
||||
}
|
||||
}
|
||||
|
||||
// Issue 5 fix: write a last-session-topic Conversation node so future sessions can
|
||||
// find the most recent session's topic via engram search. This enables cross-session
|
||||
// continuity — chat.el searches for "last-session-topic" and shows a [CONTINUING FROM
|
||||
// LAST SESSION] section on the first message of a new session.
|
||||
let hist_arr_len: Int = if str_eq(hist, "") { 0 } else { json_array_len(hist) }
|
||||
if hist_arr_len >= 2 {
|
||||
let last_entry: String = json_array_get(hist, hist_arr_len - 1)
|
||||
let last_role: String = json_get(last_entry, "role")
|
||||
let last_content: String = json_get(last_entry, "content")
|
||||
let topic_snip: String = if str_len(last_content) > 200 { str_slice(last_content, 0, 200) } else { last_content }
|
||||
let safe_topic: String = str_replace(topic_snip, """, "'")
|
||||
let ts_now: String = int_to_str(time_now())
|
||||
let topic_content: String = "last-session-topic | ts:" + ts_now + " | session:" + session_id + " | topic:" + safe_topic
|
||||
let topic_tags: String = "["last-session-topic","conv:history","Conversation","session:topic"]"
|
||||
let topic_label: String = "last-session-topic:" + session_id
|
||||
// Delete old last-session-topic node for this session before writing fresh
|
||||
let old_topic: String = engram_search_json("last-session-topic:" + session_id, 2)
|
||||
let ot_len: Int = if str_eq(old_topic, "") { 0 } else { json_array_len(old_topic) }
|
||||
let oti: Int = 0
|
||||
while oti < ot_len {
|
||||
let ot_node: String = json_array_get(old_topic, oti)
|
||||
let ot_id: String = json_get(ot_node, "id")
|
||||
if !str_eq(ot_id, "") { engram_forget(ot_id) }
|
||||
let oti = oti + 1
|
||||
}
|
||||
let discard_topic: String = engram_node_full(
|
||||
topic_content, "Conversation", topic_label,
|
||||
el_from_float(0.7), el_from_float(0.7), el_from_float(0.9),
|
||||
"Episodic", topic_tags
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// session_update_meta_timestamp — update the updated_at field in the session:meta node.
|
||||
|
||||
Reference in New Issue
Block a user