Add agentic tool access for Neuron in DHARMA rooms

Adds handle_dharma_room_turn_agentic to chat.el — same full tool loop
as handle_chat_agentic but reads transcript directly (not message), and
returns {response, cgi_id, tools_used} to match the dharma room shape.

Registers dharma_room_turn_agentic as a new event type in routes.el so
the studio can dispatch @neuron turns through this dedicated path.
This commit is contained in:
Will Anderson
2026-05-03 21:47:42 -05:00
parent 30298af3d1
commit bc025d52e7
9 changed files with 216 additions and 7 deletions
Vendored
+28 -6
View File
@@ -45,6 +45,7 @@ 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 handle_dharma_room_turn_agentic(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);
@@ -77,12 +78,15 @@ 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 engram_url_raw;
el_val_t engram_api_key_raw;
el_val_t snapshot_raw;
el_val_t snapshot;
el_val_t axon_raw;
el_val_t axon_base;
el_val_t studio_dir_raw;
el_val_t studio_dir;
el_val_t using_http_engram;
el_val_t identity_raw;
el_val_t soul_identity;
el_val_t is_genesis;
@@ -165,6 +169,8 @@ int main(int _argc, char** _argv) {
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_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; });
engram_url_raw = env(EL_STR("ENGRAM_URL"));
engram_api_key_raw = env(EL_STR("ENGRAM_API_KEY"));
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"));
@@ -172,24 +178,40 @@ int main(int _argc, char** _argv) {
studio_dir_raw = env(EL_STR("SOUL_STUDIO_DIR"));
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())));
using_http_engram = !str_eq(engram_url_raw, EL_STR(""));
if (using_http_engram) {
println(el_str_concat(EL_STR("[soul] engram -> HTTP "), engram_url_raw));
el_val_t nodes_json = http_get(el_str_concat(engram_url_raw, EL_STR("/api/nodes?limit=10000")));
el_val_t edges_json = http_get(el_str_concat(engram_url_raw, EL_STR("/api/edges")));
el_val_t nodes_part = ({ el_val_t _if_result_6 = 0; if (str_eq(nodes_json, EL_STR(""))) { _if_result_6 = (EL_STR("[]")); } else { _if_result_6 = (nodes_json); } _if_result_6; });
el_val_t edges_part = ({ el_val_t _if_result_7 = 0; if (str_eq(edges_json, EL_STR(""))) { _if_result_7 = (EL_STR("[]")); } else { _if_result_7 = (edges_json); } _if_result_7; });
el_val_t snapshot_data = el_str_concat(el_str_concat(el_str_concat(el_str_concat(EL_STR("{\"nodes\":"), nodes_part), EL_STR(",\"edges\":")), edges_part), EL_STR("}"));
el_val_t tmp_path = el_str_concat(el_str_concat(EL_STR("/tmp/soul-engram-"), soul_cgi_id), EL_STR(".json"));
fs_write(tmp_path, snapshot_data);
engram_load(tmp_path);
println(el_str_concat(el_str_concat(el_str_concat(EL_STR("[soul] loaded from HTTP Engram - nodes="), int_to_str(engram_node_count())), EL_STR(" edges=")), int_to_str(engram_edge_count())));
} else {
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_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; });
soul_identity = ({ el_val_t _if_result_8 = 0; if (str_eq(identity_raw, EL_STR(""))) { _if_result_8 = (el_str_concat(el_str_concat(EL_STR("You are "), soul_cgi_id), EL_STR(", a CGI."))); } else { _if_result_8 = (identity_raw); } _if_result_8; });
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_engram_url"), engram_url_raw);
state_set(EL_STR("soul_engram_api_key"), engram_api_key_raw);
state_set(EL_STR("soul.running"), EL_STR("true"));
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")));
state_set(EL_STR("soul_snapshot_path"), snapshot);
engram_save(snapshot);
}
engram_save(snapshot);
println(el_str_concat(EL_STR("[soul] serving on port "), int_to_str(port)));
http_serve(port, EL_STR("handle_request"));
return 0;