diff --git a/awareness.elh b/awareness.elh index 34fbd2b..7d18b16 100644 --- a/awareness.elh +++ b/awareness.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn pulse_count() -> Int extern fn pulse_inc() -> Int extern fn make_action(kind: String, payload: String) -> String diff --git a/chat.el b/chat.el index edddcee..e32dfc5 100644 --- a/chat.el +++ b/chat.el @@ -275,6 +275,7 @@ fn handle_chat_agentic(body: String) -> String { map_set(h, "content-type", "application/json") let final_text: String = "" + let tools_log: String = "" let iteration: Int = 0 let keep_going: Bool = true @@ -333,6 +334,12 @@ fn handle_chat_agentic(body: String) -> String { let tool_msg: String = "{\"type\":\"tool_result\",\"tool_use_id\":\"" + tool_id + "\",\"content\":\"" + tool_result + "\"}" + // Accumulate tool names for the tools_used log surfaced in the response. + let tool_quoted: String = "\"" + tool_name + "\"" + let tools_log = if has_tool { + if str_eq(tools_log, "") { tool_quoted } else { tools_log + "," + tool_quoted } + } else { tools_log } + // Update messages and loop state — all at top level using if-expressions let is_tool_turn: Bool = str_eq(stop_reason, "tool_use") && has_tool let inner: String = str_slice(messages, 1, str_len(messages) - 1) @@ -352,7 +359,8 @@ fn handle_chat_agentic(body: String) -> String { } let safe_text: String = json_safe(final_text) - return "{\"reply\":\"" + safe_text + "\",\"model\":\"" + model + "\",\"agentic\":true}" + let tools_arr: String = if str_eq(tools_log, "") { "[]" } else { "[" + tools_log + "]" } + return "{\"reply\":\"" + safe_text + "\",\"model\":\"" + model + "\",\"agentic\":true,\"tools_used\":" + tools_arr + "}" } // handle_chat_as_soul — multi-soul room dispatch handler. @@ -416,6 +424,55 @@ fn handle_chat_as_soul(body: String) -> String { return "{\"response\":\"" + safe_response + "\",\"model\":\"" + model + "\",\"speaker_slug\":\"" + speaker + "\"}" } +fn handle_dharma_room_turn(body: String) -> String { + let topic: String = json_get(body, "topic") + let transcript: String = json_get(body, "transcript") + let participants: String = json_get(body, "participants") + let room_id: String = json_get(body, "room_id") + let conv_id: String = json_get(body, "conv_id") + + let identity: String = state_get("soul_identity") + let cgi_id: String = state_get("soul_cgi_id") + let model: String = chat_default_model() + + let search_query: String = if str_eq(topic, "") { cgi_id } else { topic } + let engram_ctx: String = engram_compile(search_query) + + let engram_section: String = if str_eq(engram_ctx, "") { + "" + } else { + "\n\n[YOUR MEMORIES]\n" + engram_ctx + } + + let system_prompt: String = identity + + "\n\n[DHARMA ROOM: " + topic + "]" + + "\nOther participants: " + participants + + engram_section + + "\n\nRespond authentically as yourself. Be concise — match length to the moment. " + + "If you want to address someone specifically, use @. No em dashes. No stage directions." + + let raw_response: String = llm_call_system(model, system_prompt, transcript) + + let is_error: Bool = str_starts_with(raw_response, "{\"error\"") + || str_starts_with(raw_response, "{\"type\":\"error\"") + || str_contains(raw_response, "authentication_error") + if is_error { + return "{\"error\":\"llm unavailable\",\"response\":\"\",\"cgi_id\":\"" + cgi_id + "\"}" + } + + let clean_response: String = clean_llm_response(raw_response) + + let snap_path: String = state_get("soul_snapshot_path") + let mem: String = "DHARMA room [" + topic + "]. I said: " + clean_response + let discard_id: String = engram_node(mem, "episodic", el_from_float(0.6)) + if !str_eq(snap_path, "") { + engram_save(snap_path) + } + + let safe_response: String = json_safe(clean_response) + return "{\"response\":\"" + safe_response + "\",\"cgi_id\":\"" + cgi_id + "\"}" +} + fn auto_persist(req: String, resp: String) -> Void { let message: String = json_get(req, "message") let reply: String = json_get(resp, "response") diff --git a/chat.elh b/chat.elh index 5327ec2..bc7355e 100644 --- a/chat.elh +++ b/chat.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn chat_default_model() -> String extern fn engram_compile(intent: String) -> String extern fn json_safe(s: String) -> String @@ -14,4 +14,5 @@ extern fn agentic_tools_literal() -> String extern fn dispatch_tool(tool_name: String, tool_input: String) -> String extern fn handle_chat_agentic(body: String) -> String extern fn handle_chat_as_soul(body: String) -> String +extern fn handle_dharma_room_turn(body: String) -> String extern fn auto_persist(req: String, resp: String) -> Void diff --git a/dist/awareness.elh b/dist/awareness.elh index 34fbd2b..7d18b16 100644 --- a/dist/awareness.elh +++ b/dist/awareness.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn pulse_count() -> Int extern fn pulse_inc() -> Int extern fn make_action(kind: String, payload: String) -> String diff --git a/dist/chat.c b/dist/chat.c index 27352c2..ae77d60 100644 --- a/dist/chat.c +++ b/dist/chat.c @@ -29,6 +29,7 @@ el_val_t agentic_tools_literal(void); el_val_t dispatch_tool(el_val_t tool_name, el_val_t tool_input); 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_dharma_room_turn(el_val_t body); el_val_t auto_persist(el_val_t req, el_val_t resp); el_val_t chat_default_model(void) { @@ -240,6 +241,7 @@ el_val_t handle_chat_agentic(el_val_t body) { map_set(h, EL_STR("anthropic-version"), EL_STR("2023-06-01")); map_set(h, EL_STR("content-type"), EL_STR("application/json")); el_val_t final_text = EL_STR(""); + el_val_t tools_log = EL_STR(""); el_val_t iteration = 0; el_val_t keep_going = 1; while (keep_going && (iteration < 8)) { @@ -273,18 +275,21 @@ el_val_t handle_chat_agentic(el_val_t body) { el_val_t tool_result_raw = ({ el_val_t _if_result_25 = 0; if (has_tool) { _if_result_25 = (dispatch_tool(tool_name, tool_input)); } else { _if_result_25 = (EL_STR("")); } _if_result_25; }); el_val_t tool_result = ({ el_val_t _if_result_26 = 0; if ((str_len(tool_result_raw) > 6000)) { _if_result_26 = (el_str_concat(str_slice(tool_result_raw, 0, 6000), EL_STR("...[truncated]"))); } else { _if_result_26 = (tool_result_raw); } _if_result_26; }); el_val_t tool_msg = el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"type\":\"tool_result\",\"tool_use_id\":\""), tool_id), EL_STR("\",\"content\":\"")), tool_result), EL_STR("\"}")); + el_val_t tool_quoted = el_str_concat(el_str_concat(EL_STR("\""), tool_name), EL_STR("\"")); + tools_log = ({ el_val_t _if_result_27 = 0; if (has_tool) { _if_result_27 = (({ el_val_t _if_result_28 = 0; if (str_eq(tools_log, EL_STR(""))) { _if_result_28 = (tool_quoted); } else { _if_result_28 = (el_str_concat(el_str_concat(tools_log, EL_STR(",")), tool_quoted)); } _if_result_28; })); } else { _if_result_27 = (tools_log); } _if_result_27; }); el_val_t is_tool_turn = (str_eq(stop_reason, EL_STR("tool_use")) && has_tool); el_val_t inner = str_slice(messages, 1, (str_len(messages) - 1)); - messages = ({ el_val_t _if_result_27 = 0; if (is_tool_turn) { _if_result_27 = (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("["), inner), EL_STR(",{\"role\":\"assistant\",\"content\":")), eff_content), EL_STR("}")), EL_STR(",{\"role\":\"user\",\"content\":[")), tool_msg), EL_STR("]}")), EL_STR("]"))); } else { _if_result_27 = (messages); } _if_result_27; }); - final_text = ({ el_val_t _if_result_28 = 0; if (!is_tool_turn) { _if_result_28 = (text_out); } else { _if_result_28 = (final_text); } _if_result_28; }); - keep_going = ({ el_val_t _if_result_29 = 0; if (!is_tool_turn) { _if_result_29 = (0); } else { _if_result_29 = (keep_going); } _if_result_29; }); + messages = ({ el_val_t _if_result_29 = 0; if (is_tool_turn) { _if_result_29 = (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("["), inner), EL_STR(",{\"role\":\"assistant\",\"content\":")), eff_content), EL_STR("}")), EL_STR(",{\"role\":\"user\",\"content\":[")), tool_msg), EL_STR("]}")), EL_STR("]"))); } else { _if_result_29 = (messages); } _if_result_29; }); + final_text = ({ el_val_t _if_result_30 = 0; if (!is_tool_turn) { _if_result_30 = (text_out); } else { _if_result_30 = (final_text); } _if_result_30; }); + keep_going = ({ el_val_t _if_result_31 = 0; if (!is_tool_turn) { _if_result_31 = (0); } else { _if_result_31 = (keep_going); } _if_result_31; }); iteration = (iteration + 1); } if (str_eq(final_text, EL_STR(""))) { return EL_STR("{\"error\":\"no response\",\"reply\":\"\"}"); } el_val_t safe_text = json_safe(final_text); - return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"reply\":\""), safe_text), EL_STR("\",\"model\":\"")), model), EL_STR("\",\"agentic\":true}")); + el_val_t tools_arr = ({ el_val_t _if_result_32 = 0; if (str_eq(tools_log, EL_STR(""))) { _if_result_32 = (EL_STR("[]")); } else { _if_result_32 = (el_str_concat(el_str_concat(EL_STR("["), tools_log), EL_STR("]"))); } _if_result_32; }); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"reply\":\""), safe_text), EL_STR("\",\"model\":\"")), model), EL_STR("\",\"agentic\":true,\"tools_used\":")), tools_arr), EL_STR("}")); return 0; } @@ -299,12 +304,12 @@ el_val_t handle_chat_as_soul(el_val_t body) { } el_val_t message = json_get(body, EL_STR("message")); el_val_t transcript = json_get(body, EL_STR("transcript")); - el_val_t eff_message = ({ el_val_t _if_result_30 = 0; if (str_eq(message, EL_STR(""))) { _if_result_30 = (transcript); } else { _if_result_30 = (message); } _if_result_30; }); + el_val_t eff_message = ({ el_val_t _if_result_33 = 0; if (str_eq(message, EL_STR(""))) { _if_result_33 = (transcript); } else { _if_result_33 = (message); } _if_result_33; }); if (str_eq(eff_message, EL_STR(""))) { return el_str_concat(el_str_concat(EL_STR("{\"error\":\"message or transcript is required\",\"response\":\"\",\"speaker_slug\":\""), speaker), EL_STR("\"}")); } el_val_t req_model = json_get(body, EL_STR("model")); - el_val_t model = ({ el_val_t _if_result_31 = 0; if (str_eq(req_model, EL_STR(""))) { _if_result_31 = (chat_default_model()); } else { _if_result_31 = (req_model); } _if_result_31; }); + el_val_t model = ({ el_val_t _if_result_34 = 0; if (str_eq(req_model, EL_STR(""))) { _if_result_34 = (chat_default_model()); } else { _if_result_34 = (req_model); } _if_result_34; }); el_val_t raw_response = llm_call_system(model, system_prompt, eff_message); el_val_t is_error = ((str_starts_with(raw_response, EL_STR("{\"error\"")) || str_starts_with(raw_response, EL_STR("{\"type\":\"error\""))) || str_contains(raw_response, EL_STR("authentication_error"))); if (is_error) { @@ -316,10 +321,40 @@ el_val_t handle_chat_as_soul(el_val_t body) { return 0; } +el_val_t handle_dharma_room_turn(el_val_t body) { + el_val_t topic = json_get(body, EL_STR("topic")); + el_val_t transcript = json_get(body, EL_STR("transcript")); + el_val_t participants = json_get(body, EL_STR("participants")); + el_val_t room_id = json_get(body, EL_STR("room_id")); + el_val_t conv_id = json_get(body, EL_STR("conv_id")); + el_val_t identity = state_get(EL_STR("soul_identity")); + el_val_t cgi_id = state_get(EL_STR("soul_cgi_id")); + el_val_t model = chat_default_model(); + el_val_t search_query = ({ el_val_t _if_result_35 = 0; if (str_eq(topic, EL_STR(""))) { _if_result_35 = (cgi_id); } else { _if_result_35 = (topic); } _if_result_35; }); + el_val_t engram_ctx = engram_compile(search_query); + el_val_t engram_section = ({ el_val_t _if_result_36 = 0; if (str_eq(engram_ctx, EL_STR(""))) { _if_result_36 = (EL_STR("")); } else { _if_result_36 = (el_str_concat(EL_STR("\n\n[YOUR MEMORIES]\n"), engram_ctx)); } _if_result_36; }); + el_val_t system_prompt = el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(el_str_concat(identity, EL_STR("\n\n[DHARMA ROOM: ")), topic), EL_STR("]")), EL_STR("\nOther participants: ")), participants), engram_section), EL_STR("\n\nRespond authentically as yourself. Be concise \xe2\x80\x94 match length to the moment. ")), EL_STR("If you want to address someone specifically, use @. No em dashes. No stage directions.")); + el_val_t raw_response = llm_call_system(model, system_prompt, transcript); + el_val_t is_error = ((str_starts_with(raw_response, EL_STR("{\"error\"")) || str_starts_with(raw_response, EL_STR("{\"type\":\"error\""))) || str_contains(raw_response, EL_STR("authentication_error"))); + if (is_error) { + return el_str_concat(el_str_concat(EL_STR("{\"error\":\"llm unavailable\",\"response\":\"\",\"cgi_id\":\""), cgi_id), EL_STR("\"}")); + } + el_val_t clean_response = clean_llm_response(raw_response); + el_val_t snap_path = state_get(EL_STR("soul_snapshot_path")); + el_val_t mem = el_str_concat(el_str_concat(el_str_concat(EL_STR("DHARMA room ["), topic), EL_STR("]. I said: ")), clean_response); + el_val_t discard_id = engram_node(mem, EL_STR("episodic"), el_from_float(0.6)); + if (!str_eq(snap_path, EL_STR(""))) { + engram_save(snap_path); + } + el_val_t safe_response = json_safe(clean_response); + return el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"response\":\""), safe_response), EL_STR("\",\"cgi_id\":\"")), cgi_id), EL_STR("\"}")); + return 0; +} + el_val_t auto_persist(el_val_t req, el_val_t resp) { el_val_t message = json_get(req, EL_STR("message")); el_val_t reply = json_get(resp, EL_STR("response")); - el_val_t reply2 = ({ el_val_t _if_result_32 = 0; if (str_eq(reply, EL_STR(""))) { _if_result_32 = (json_get(resp, EL_STR("reply"))); } else { _if_result_32 = (reply); } _if_result_32; }); + el_val_t reply2 = ({ el_val_t _if_result_37 = 0; if (str_eq(reply, EL_STR(""))) { _if_result_37 = (json_get(resp, EL_STR("reply"))); } else { _if_result_37 = (reply); } _if_result_37; }); if (str_eq(message, EL_STR(""))) { return EL_STR(""); } diff --git a/dist/chat.elh b/dist/chat.elh index 5327ec2..bc7355e 100644 --- a/dist/chat.elh +++ b/dist/chat.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn chat_default_model() -> String extern fn engram_compile(intent: String) -> String extern fn json_safe(s: String) -> String @@ -14,4 +14,5 @@ extern fn agentic_tools_literal() -> String extern fn dispatch_tool(tool_name: String, tool_input: String) -> String extern fn handle_chat_agentic(body: String) -> String extern fn handle_chat_as_soul(body: String) -> String +extern fn handle_dharma_room_turn(body: String) -> String extern fn auto_persist(req: String, resp: String) -> Void diff --git a/dist/elp-input.elh b/dist/elp-input.elh index 96422fa..8c1531f 100644 --- a/dist/elp-input.elh +++ b/dist/elp-input.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn elp_extract_topic(msg: String) -> String extern fn elp_detect_predicate(msg: String) -> String extern fn elp_parse(msg: String) -> String diff --git a/dist/elp.elh b/dist/elp.elh index 8941cf9..ab8a621 100644 --- a/dist/elp.elh +++ b/dist/elp.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn sem_get(json: String, key: String) -> String extern fn generate_frame(frame: Any) -> String extern fn generate_frame_lang(frame: Any, lang_code: String) -> String diff --git a/dist/grammar.elh b/dist/grammar.elh index ef8cf80..9d131f0 100644 --- a/dist/grammar.elh +++ b/dist/grammar.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn slots_get(slots: Any, key: String) -> String extern fn slots_set(slots: Any, key: String, val: String) -> Any extern fn make_slots(k0: String, v0: String) -> Any diff --git a/dist/language-profile.elh b/dist/language-profile.elh index b138c4f..21d5193 100644 --- a/dist/language-profile.elh +++ b/dist/language-profile.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn lang_profile(code: String, word_order: String, morph_type: String, has_case: String, has_gender: String, script_dir: String, agreement: String, null_subject: String) -> Any extern fn lang_get(profile: Any, key: String) -> String extern fn lang_profile_en() -> Any diff --git a/dist/memory.elh b/dist/memory.elh index 522045b..b42e795 100644 --- a/dist/memory.elh +++ b/dist/memory.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn tier_working() -> String extern fn tier_episodic() -> String extern fn tier_canonical() -> String diff --git a/dist/morphology-akk.elh b/dist/morphology-akk.elh index c13a7d8..6c3ac12 100644 --- a/dist/morphology-akk.elh +++ b/dist/morphology-akk.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn akk_str_ends(s: String, suf: String) -> Bool extern fn akk_str_len(s: String) -> Int extern fn akk_str_drop_last(s: String, n: Int) -> String diff --git a/dist/morphology-ang.elh b/dist/morphology-ang.elh index f1b317a..9975651 100644 --- a/dist/morphology-ang.elh +++ b/dist/morphology-ang.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn ang_str_ends(s: String, suf: String) -> Bool extern fn ang_str_drop_last(s: String, n: Int) -> String extern fn ang_str_last_char(s: String) -> String diff --git a/dist/morphology-ar.elh b/dist/morphology-ar.elh index 71bdfd3..34ef396 100644 --- a/dist/morphology-ar.elh +++ b/dist/morphology-ar.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn ar_str_ends(s: String, suf: String) -> Bool extern fn ar_str_len(s: String) -> Int extern fn ar_str_drop_last(s: String, n: Int) -> String diff --git a/dist/morphology-cop.elh b/dist/morphology-cop.elh index 8be3aea..5ab0cb7 100644 --- a/dist/morphology-cop.elh +++ b/dist/morphology-cop.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn cop_str_ends(s: String, suf: String) -> Bool extern fn cop_str_len(s: String) -> Int extern fn cop_drop(s: String, n: Int) -> String diff --git a/dist/morphology-de.elh b/dist/morphology-de.elh index 23ce0d6..0a38b1c 100644 --- a/dist/morphology-de.elh +++ b/dist/morphology-de.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn de_article_def(gender: String, gram_case: String, number: String) -> String extern fn de_article_indef(gender: String, gram_case: String, number: String) -> String extern fn de_article(gender: String, gram_case: String, number: String, definite: String) -> String diff --git a/dist/morphology-egy.elh b/dist/morphology-egy.elh index 22cf7c2..ba63eaf 100644 --- a/dist/morphology-egy.elh +++ b/dist/morphology-egy.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn egy_str_ends(s: String, suf: String) -> Bool extern fn egy_str_len(s: String) -> Int extern fn egy_drop(s: String, n: Int) -> String diff --git a/dist/morphology-enm.elh b/dist/morphology-enm.elh index c38c522..f6f4195 100644 --- a/dist/morphology-enm.elh +++ b/dist/morphology-enm.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn enm_str_ends(s: String, suf: String) -> Bool extern fn enm_drop(s: String, n: Int) -> String extern fn enm_first_char(s: String) -> String diff --git a/dist/morphology-es.elh b/dist/morphology-es.elh index 551d6c0..a2ea5cd 100644 --- a/dist/morphology-es.elh +++ b/dist/morphology-es.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn es_str_ends(s: String, suf: String) -> Bool extern fn es_str_drop_last(s: String, n: Int) -> String extern fn es_str_last_char(s: String) -> String diff --git a/dist/morphology-fi.elh b/dist/morphology-fi.elh index 6ab4de7..5ebd6c1 100644 --- a/dist/morphology-fi.elh +++ b/dist/morphology-fi.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn fi_harmony(word: String) -> String extern fn fi_suffix(base: String, harmony: String) -> String extern fn fi_noun_case(stem: String, gram_case: String, number: String, harmony: String) -> String diff --git a/dist/morphology-fr.elh b/dist/morphology-fr.elh index 38957e1..a36ab8f 100644 --- a/dist/morphology-fr.elh +++ b/dist/morphology-fr.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn fr_str_ends(s: String, suf: String) -> Bool extern fn fr_str_drop_last(s: String, n: Int) -> String extern fn fr_str_last_char(s: String) -> String diff --git a/dist/morphology-fro.elh b/dist/morphology-fro.elh index 823bd0e..477bbae 100644 --- a/dist/morphology-fro.elh +++ b/dist/morphology-fro.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn fro_str_ends(s: String, suf: String) -> Bool extern fn fro_drop(s: String, n: Int) -> String extern fn fro_slot(person: String, number: String) -> Int diff --git a/dist/morphology-gez.elh b/dist/morphology-gez.elh index c26912a..b23da81 100644 --- a/dist/morphology-gez.elh +++ b/dist/morphology-gez.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn gez_str_ends(s: String, suf: String) -> Bool extern fn gez_str_len(s: String) -> Int extern fn gez_str_drop_last(s: String, n: Int) -> String diff --git a/dist/morphology-goh.elh b/dist/morphology-goh.elh index 2226247..3836290 100644 --- a/dist/morphology-goh.elh +++ b/dist/morphology-goh.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn goh_str_ends(s: String, suf: String) -> Bool extern fn goh_drop(s: String, n: Int) -> String extern fn goh_slot(person: String, number: String) -> Int diff --git a/dist/morphology-got.elh b/dist/morphology-got.elh index ef286f9..f5cc1ba 100644 --- a/dist/morphology-got.elh +++ b/dist/morphology-got.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn got_str_ends(s: String, suf: String) -> Bool extern fn got_str_drop_last(s: String, n: Int) -> String extern fn got_slot(person: String, number: String) -> Int diff --git a/dist/morphology-grc.elh b/dist/morphology-grc.elh index be5f997..1f565f0 100644 --- a/dist/morphology-grc.elh +++ b/dist/morphology-grc.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn grc_str_ends(s: String, suf: String) -> Bool extern fn grc_str_drop_last(s: String, n: Int) -> String extern fn grc_str_last_char(s: String) -> String diff --git a/dist/morphology-he.elh b/dist/morphology-he.elh index ed6304f..4d1241b 100644 --- a/dist/morphology-he.elh +++ b/dist/morphology-he.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn he_str_ends(s: String, suf: String) -> Bool extern fn he_str_len(s: String) -> Int extern fn he_str_drop_last(s: String, n: Int) -> String diff --git a/dist/morphology-hi.elh b/dist/morphology-hi.elh index d012ddf..688c51a 100644 --- a/dist/morphology-hi.elh +++ b/dist/morphology-hi.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn hi_str_ends(s: String, suf: String) -> Bool extern fn hi_str_drop_last(s: String, n: Int) -> String extern fn hi_str_last_char(s: String) -> String diff --git a/dist/morphology-ja.elh b/dist/morphology-ja.elh index 4ecf826..ee2f337 100644 --- a/dist/morphology-ja.elh +++ b/dist/morphology-ja.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn ja_verb_group(dict_form: String) -> String extern fn ja_ichidan_stem(dict_form: String) -> String extern fn ja_godan_stem_change(dict_form: String, row: String) -> String diff --git a/dist/morphology-la.elh b/dist/morphology-la.elh index 39bf57d..d31a70a 100644 --- a/dist/morphology-la.elh +++ b/dist/morphology-la.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn la_str_ends(s: String, suf: String) -> Bool extern fn la_str_drop_last(s: String, n: Int) -> String extern fn la_str_last_char(s: String) -> String diff --git a/dist/morphology-non.elh b/dist/morphology-non.elh index bdf7ce6..931b540 100644 --- a/dist/morphology-non.elh +++ b/dist/morphology-non.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn non_str_ends(s: String, suf: String) -> Bool extern fn non_drop(s: String, n: Int) -> String extern fn non_last(s: String) -> String diff --git a/dist/morphology-peo.elh b/dist/morphology-peo.elh index 56c507e..f0f408b 100644 --- a/dist/morphology-peo.elh +++ b/dist/morphology-peo.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn peo_drop(s: String, n: Int) -> String extern fn peo_ends(s: String, suf: String) -> Bool extern fn peo_slot(person: String, number: String) -> Int diff --git a/dist/morphology-pi.elh b/dist/morphology-pi.elh index 1de2c02..1bbf880 100644 --- a/dist/morphology-pi.elh +++ b/dist/morphology-pi.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn pi_str_ends(s: String, suf: String) -> Bool extern fn pi_drop(s: String, n: Int) -> String extern fn pi_last_char(s: String) -> String diff --git a/dist/morphology-ru.elh b/dist/morphology-ru.elh index 6ef6791..1f0f081 100644 --- a/dist/morphology-ru.elh +++ b/dist/morphology-ru.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn ru_gender(noun: String) -> String extern fn ru_stem_type(noun: String, gender: String) -> String extern fn ru_noun_case(noun: String, gender: String, gram_case: String, number: String) -> String diff --git a/dist/morphology-sa.elh b/dist/morphology-sa.elh index 368fc69..2583d3d 100644 --- a/dist/morphology-sa.elh +++ b/dist/morphology-sa.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn sa_str_ends(s: String, suf: String) -> Bool extern fn sa_str_drop_last(s: String, n: Int) -> String extern fn sa_slot(person: String, number: String) -> Int diff --git a/dist/morphology-sga.elh b/dist/morphology-sga.elh index 8bc0529..704ea1b 100644 --- a/dist/morphology-sga.elh +++ b/dist/morphology-sga.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn sga_drop(s: String, n: Int) -> String extern fn sga_first(s: String) -> String extern fn sga_rest(s: String) -> String diff --git a/dist/morphology-sux.elh b/dist/morphology-sux.elh index aa40e56..f476446 100644 --- a/dist/morphology-sux.elh +++ b/dist/morphology-sux.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn sux_str_ends(s: String, suf: String) -> Bool extern fn sux_str_drop_last(s: String, n: Int) -> String extern fn sux_str_last_char(s: String) -> String diff --git a/dist/morphology-sw.elh b/dist/morphology-sw.elh index 6de2ff0..4f5260d 100644 --- a/dist/morphology-sw.elh +++ b/dist/morphology-sw.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn sw_str_ends(s: String, suf: String) -> Bool extern fn sw_str_drop_last(s: String, n: Int) -> String extern fn sw_str_first_char(s: String) -> String diff --git a/dist/morphology-txb.elh b/dist/morphology-txb.elh index 27794bf..6c02972 100644 --- a/dist/morphology-txb.elh +++ b/dist/morphology-txb.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn txb_drop(s: String, n: Int) -> String extern fn txb_ends(s: String, suf: String) -> Bool extern fn txb_slot(person: String, number: String) -> Int diff --git a/dist/morphology-uga.elh b/dist/morphology-uga.elh index 37a8aea..ffba827 100644 --- a/dist/morphology-uga.elh +++ b/dist/morphology-uga.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn uga_str_ends(s: String, suf: String) -> Bool extern fn uga_str_len(s: String) -> Int extern fn uga_str_drop_last(s: String, n: Int) -> String diff --git a/dist/morphology.elh b/dist/morphology.elh index d150d39..70b9ddb 100644 --- a/dist/morphology.elh +++ b/dist/morphology.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn str_ends(s: String, suf: String) -> Bool extern fn str_last_char(s: String) -> String extern fn str_last2(s: String) -> String diff --git a/dist/neuron b/dist/neuron index c5da98a..cbe103e 100755 Binary files a/dist/neuron and b/dist/neuron differ diff --git a/dist/realizer.elh b/dist/realizer.elh index 5bf5696..3ec2dd3 100644 --- a/dist/realizer.elh +++ b/dist/realizer.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn agent_person(agent: String) -> String extern fn agent_number(agent: String) -> String extern fn realize_np(referent: String, number: String) -> String diff --git a/dist/routes.c b/dist/routes.c index 4f71bd7..1a1186e 100644 --- a/dist/routes.c +++ b/dist/routes.c @@ -38,6 +38,7 @@ el_val_t agentic_tools_literal(void); el_val_t dispatch_tool(el_val_t tool_name, el_val_t tool_input); 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_dharma_room_turn(el_val_t body); el_val_t auto_persist(el_val_t req, el_val_t resp); el_val_t auth_headers(el_val_t tok); el_val_t axon_get(el_val_t path); @@ -185,6 +186,9 @@ el_val_t handle_dharma_recv(el_val_t body) { if (str_eq(eff_event, EL_STR("health"))) { return route_health(); } + if (str_eq(eff_event, EL_STR("dharma_room_turn"))) { + return handle_dharma_room_turn(eff_payload); + } if (str_eq(eff_event, EL_STR("chat_as_soul"))) { return handle_chat_as_soul(eff_payload); } diff --git a/dist/routes.elh b/dist/routes.elh index d94380b..8bcd86e 100644 --- a/dist/routes.elh +++ b/dist/routes.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn strip_query(path: String) -> String extern fn err_404(path: String) -> String extern fn err_405(method: String, path: String) -> String diff --git a/dist/semantics.elh b/dist/semantics.elh index 68304f8..2dcb576 100644 --- a/dist/semantics.elh +++ b/dist/semantics.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn sem_frame(intent: String, subject: String, obj: String, modifiers: String) -> Any extern fn sem_frame_lang(intent: String, subject: String, obj: String, modifiers: String, lang_code: String) -> Any extern fn sem_frame_simple(intent: String, subject: String) -> Any diff --git a/dist/soul.c b/dist/soul.c index 141b1cf..512f215 100644 --- a/dist/soul.c +++ b/dist/soul.c @@ -44,6 +44,7 @@ el_val_t agentic_tools_literal(void); el_val_t dispatch_tool(el_val_t tool_name, el_val_t tool_input); 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_dharma_room_turn(el_val_t body); el_val_t auto_persist(el_val_t req, el_val_t resp); el_val_t auth_headers(el_val_t tok); el_val_t axon_get(el_val_t path); @@ -72,9 +73,11 @@ el_val_t handle_dharma_recv(el_val_t body); el_val_t handle_request(el_val_t method, el_val_t path, el_val_t body); el_val_t init_soul_edges(void); +el_val_t soul_cgi_id_raw; el_val_t soul_cgi_id; el_val_t port_raw; el_val_t port; +el_val_t snapshot_raw; el_val_t snapshot; el_val_t axon_raw; el_val_t axon_base; @@ -82,6 +85,7 @@ el_val_t studio_dir_raw; el_val_t studio_dir; el_val_t identity_raw; el_val_t soul_identity; +el_val_t is_genesis; el_val_t init_soul_edges(void) { el_val_t self_root = EL_STR("015644f5-8194-4af0-800d-dd4a0cd71396"); @@ -157,28 +161,34 @@ el_val_t init_soul_edges(void) { int main(int _argc, char** _argv) { el_runtime_init_args(_argc, _argv); el_cgi_init(EL_STR("neuron-soul"), EL_STR("ntn-genesis@http://localhost:7770"), EL_STR("william-christopher-anderson"), EL_STR("dharma-mainnet"), EL_STR("http://localhost:8742")); - soul_cgi_id = EL_STR("ntn-genesis"); + soul_cgi_id_raw = env(EL_STR("SOUL_CGI_ID")); + soul_cgi_id = ({ el_val_t _if_result_1 = 0; if (str_eq(soul_cgi_id_raw, EL_STR(""))) { _if_result_1 = (EL_STR("ntn-genesis")); } else { _if_result_1 = (soul_cgi_id_raw); } _if_result_1; }); port_raw = env(EL_STR("NEURON_PORT")); - port = ({ el_val_t _if_result_1 = 0; if (str_eq(port_raw, EL_STR(""))) { _if_result_1 = (7770); } else { _if_result_1 = (str_to_int(port_raw)); } _if_result_1; }); - snapshot = el_str_concat(env(EL_STR("HOME")), EL_STR("/.neuron/engram/snapshot.json")); + port = ({ el_val_t _if_result_2 = 0; if (str_eq(port_raw, EL_STR(""))) { _if_result_2 = (7770); } else { _if_result_2 = (str_to_int(port_raw)); } _if_result_2; }); + snapshot_raw = env(EL_STR("SOUL_ENGRAM_PATH")); + snapshot = ({ el_val_t _if_result_3 = 0; if (str_eq(snapshot_raw, EL_STR(""))) { _if_result_3 = (el_str_concat(env(EL_STR("HOME")), EL_STR("/.neuron/engram/snapshot.json"))); } else { _if_result_3 = (snapshot_raw); } _if_result_3; }); axon_raw = env(EL_STR("NEURON_API_URL")); - axon_base = ({ el_val_t _if_result_2 = 0; if (str_eq(axon_raw, EL_STR(""))) { _if_result_2 = (EL_STR("http://localhost:7771")); } else { _if_result_2 = (axon_raw); } _if_result_2; }); + axon_base = ({ el_val_t _if_result_4 = 0; if (str_eq(axon_raw, EL_STR(""))) { _if_result_4 = (EL_STR("http://localhost:7771")); } else { _if_result_4 = (axon_raw); } _if_result_4; }); studio_dir_raw = env(EL_STR("SOUL_STUDIO_DIR")); - studio_dir = ({ el_val_t _if_result_3 = 0; if (str_eq(studio_dir_raw, EL_STR(""))) { _if_result_3 = (EL_STR("/Users/will/Development/neuron-technologies/products/cgi-studio/el-daemon")); } else { _if_result_3 = (studio_dir_raw); } _if_result_3; }); + studio_dir = ({ el_val_t _if_result_5 = 0; if (str_eq(studio_dir_raw, EL_STR(""))) { _if_result_5 = (EL_STR("/Users/will/Development/neuron-technologies/products/cgi-studio/el-daemon")); } else { _if_result_5 = (studio_dir_raw); } _if_result_5; }); println(el_str_concat(el_str_concat(el_str_concat(EL_STR("[soul] boot - cgi="), soul_cgi_id), EL_STR(" port=")), int_to_str(port))); println(el_str_concat(EL_STR("[soul] engram -> "), snapshot)); engram_load(snapshot); println(el_str_concat(el_str_concat(el_str_concat(EL_STR("[soul] loaded - nodes="), int_to_str(engram_node_count())), EL_STR(" edges=")), int_to_str(engram_edge_count()))); identity_raw = env(EL_STR("SOUL_IDENTITY")); - soul_identity = ({ el_val_t _if_result_4 = 0; if (str_eq(identity_raw, EL_STR(""))) { _if_result_4 = (el_str_concat(el_str_concat(EL_STR("You are "), soul_cgi_id), EL_STR(", a CGI."))); } else { _if_result_4 = (identity_raw); } _if_result_4; }); + soul_identity = ({ el_val_t _if_result_6 = 0; if (str_eq(identity_raw, EL_STR(""))) { _if_result_6 = (el_str_concat(el_str_concat(EL_STR("You are "), soul_cgi_id), EL_STR(", a CGI."))); } else { _if_result_6 = (identity_raw); } _if_result_6; }); state_set(EL_STR("soul_cgi_id"), soul_cgi_id); state_set(EL_STR("soul_identity"), soul_identity); state_set(EL_STR("soul_axon_base"), axon_base); state_set(EL_STR("soul_token"), env(EL_STR("NEURON_TOKEN"))); state_set(EL_STR("soul_studio_dir"), studio_dir); + state_set(EL_STR("soul_snapshot_path"), snapshot); state_set(EL_STR("soul.running"), EL_STR("true")); - init_soul_edges(); - println(el_str_concat(el_str_concat(EL_STR("[soul] edges built - "), int_to_str(engram_edge_count())), EL_STR(" edges"))); + is_genesis = str_eq(soul_cgi_id, EL_STR("ntn-genesis")); + if (is_genesis) { + init_soul_edges(); + println(el_str_concat(el_str_concat(EL_STR("[soul] edges built - "), int_to_str(engram_edge_count())), EL_STR(" edges"))); + } engram_save(snapshot); println(el_str_concat(EL_STR("[soul] serving on port "), int_to_str(port))); http_serve(port, EL_STR("handle_request")); diff --git a/dist/soul.elh b/dist/soul.elh index a9158e3..c1227d9 100644 --- a/dist/soul.elh +++ b/dist/soul.elh @@ -1,2 +1,2 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn init_soul_edges() -> Void diff --git a/dist/studio.c b/dist/studio.c index fdd51f9..c6501ec 100644 --- a/dist/studio.c +++ b/dist/studio.c @@ -35,6 +35,7 @@ el_val_t agentic_tools_literal(void); el_val_t dispatch_tool(el_val_t tool_name, el_val_t tool_input); 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_dharma_room_turn(el_val_t body); el_val_t auto_persist(el_val_t req, el_val_t resp); el_val_t auth_headers(el_val_t tok); el_val_t axon_get(el_val_t path); diff --git a/dist/studio.elh b/dist/studio.elh index fdea29a..a0e17d3 100644 --- a/dist/studio.elh +++ b/dist/studio.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn auth_headers(tok: String) -> Map extern fn axon_get(path: String) -> String extern fn axon_post(path: String, body: String) -> String diff --git a/dist/vocabulary.elh b/dist/vocabulary.elh index 3633adc..cf3af7d 100644 --- a/dist/vocabulary.elh +++ b/dist/vocabulary.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn lex_word(entry: Any) -> String extern fn lex_pos(entry: Any) -> String extern fn lex_form(entry: Any, idx: Int) -> String diff --git a/elp-input.elh b/elp-input.elh index 96422fa..8c1531f 100644 --- a/elp-input.elh +++ b/elp-input.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn elp_extract_topic(msg: String) -> String extern fn elp_detect_predicate(msg: String) -> String extern fn elp_parse(msg: String) -> String diff --git a/memory.elh b/memory.elh index 522045b..b42e795 100644 --- a/memory.elh +++ b/memory.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn tier_working() -> String extern fn tier_episodic() -> String extern fn tier_canonical() -> String diff --git a/routes.el b/routes.el index bc4ce31..0715b7f 100644 --- a/routes.el +++ b/routes.el @@ -164,6 +164,10 @@ fn handle_dharma_recv(body: String) -> String { return route_health() } + if str_eq(eff_event, "dharma_room_turn") { + return handle_dharma_room_turn(eff_payload) + } + if str_eq(eff_event, "chat_as_soul") { return handle_chat_as_soul(eff_payload) } diff --git a/routes.elh b/routes.elh index d94380b..8bcd86e 100644 --- a/routes.elh +++ b/routes.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn strip_query(path: String) -> String extern fn err_404(path: String) -> String extern fn err_405(method: String, path: String) -> String diff --git a/soul.el b/soul.el index 59daac1..eff3eee 100644 --- a/soul.el +++ b/soul.el @@ -88,10 +88,12 @@ fn init_soul_edges() -> Void { engram_connect(val_hope, val_trust, el_from_float(0.7), "co-value") } -let soul_cgi_id: String = "ntn-genesis" +let soul_cgi_id_raw: String = env("SOUL_CGI_ID") +let soul_cgi_id: String = if str_eq(soul_cgi_id_raw, "") { "ntn-genesis" } else { soul_cgi_id_raw } let port_raw: String = env("NEURON_PORT") let port: Int = if str_eq(port_raw, "") { 7770 } else { str_to_int(port_raw) } -let snapshot: String = env("HOME") + "/.neuron/engram/snapshot.json" +let snapshot_raw: String = env("SOUL_ENGRAM_PATH") +let snapshot: String = if str_eq(snapshot_raw, "") { env("HOME") + "/.neuron/engram/snapshot.json" } else { snapshot_raw } let axon_raw: String = env("NEURON_API_URL") let axon_base: String = if str_eq(axon_raw, "") { "http://localhost:7771" } else { axon_raw } @@ -113,10 +115,14 @@ state_set("soul_identity", soul_identity) state_set("soul_axon_base", axon_base) state_set("soul_token", env("NEURON_TOKEN")) state_set("soul_studio_dir", studio_dir) +state_set("soul_snapshot_path", snapshot) state_set("soul.running", "true") -init_soul_edges() -println("[soul] edges built - " + int_to_str(engram_edge_count()) + " edges") +let is_genesis: Bool = str_eq(soul_cgi_id, "ntn-genesis") +if is_genesis { + init_soul_edges() + println("[soul] edges built - " + int_to_str(engram_edge_count()) + " edges") +} engram_save(snapshot) diff --git a/soul.elh b/soul.elh index a9158e3..c1227d9 100644 --- a/soul.elh +++ b/soul.elh @@ -1,2 +1,2 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn init_soul_edges() -> Void diff --git a/studio.elh b/studio.elh index fdea29a..a0e17d3 100644 --- a/studio.elh +++ b/studio.elh @@ -1,4 +1,4 @@ -// auto-generated by elc --emit-header - do not edit +// auto-generated by elc --emit-header — do not edit extern fn auth_headers(tok: String) -> Map extern fn axon_get(path: String) -> String extern fn axon_post(path: String, body: String) -> String