Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 343fcd20bc |
+27
-2
@@ -267,6 +267,27 @@ fn recall_or_list(query: String, limit: Int) -> String {
|
||||
return http_post_json(neuron_url() + "/recall", body)
|
||||
}
|
||||
|
||||
// Create a real typed node via /api/neuron/node/create (handle_api_node_create) so it is a proper
|
||||
// BacklogItem/Artifact/etc. — listable by type via /api/neuron/list/<type> — instead of a generic
|
||||
// memory blob. Maps title->label, content/description->content, project/priority->tags.
|
||||
fn create_node_typed(args: String, node_type: String, tier: String) -> String {
|
||||
let content: String = pick_content(args)
|
||||
if str_eq(content, "") {
|
||||
return mcp_text_result("error: content/title is required for " + node_type)
|
||||
}
|
||||
let title: String = json_get_string(args, "title")
|
||||
let label: String = if str_eq(title, "") { node_type } else { title }
|
||||
let project: String = json_get_string(args, "project")
|
||||
let priority: String = json_get_string(args, "priority")
|
||||
let proj_tag: String = if str_eq(project, "") { "" } else { ",\"project:" + project + "\"" }
|
||||
let prio_tag: String = if str_eq(priority, "") { "" } else { ",\"priority:" + priority + "\"" }
|
||||
let tags: String = "[\"" + node_type + "\"" + proj_tag + prio_tag + "]"
|
||||
let body: String = "{\"node_type\":\"" + node_type + "\",\"content\":\"" + json_escape(content)
|
||||
+ "\",\"label\":\"" + json_escape(label) + "\",\"tier\":\"" + tier + "\",\"tags\":" + tags + "}"
|
||||
let resp: String = http_post_json(neuron_url() + "/node/create", body)
|
||||
return mcp_json_result(resp)
|
||||
}
|
||||
|
||||
fn search_with_query(args: String, default_limit: Int) -> String {
|
||||
let query: String = json_get_string(args, "query")
|
||||
if str_eq(query, "") { let query = pick_content(args) }
|
||||
@@ -631,8 +652,12 @@ fn dispatch_tool_call(tool_name: String, args: String) -> String {
|
||||
}
|
||||
|
||||
// ── Backlog + work ──────────────────────────────────────────────────────
|
||||
if str_eq(tool_name, "planWork") { return create_typed_node(args, "BacklogItem", "0.65") }
|
||||
if str_eq(tool_name, "reviewBacklog") { return search_with_query(args, 50) }
|
||||
// planWork: create a REAL typed BacklogItem via /api/neuron/node/create (the old path fell through
|
||||
// create_typed_node to a generic /memory write, dropping title/project/priority and never making a
|
||||
// BacklogItem). reviewBacklog: LIST BacklogItem nodes (was a lexical /recall that never filtered by
|
||||
// type). Both depend on the /api/neuron/list/<type> slice fix (neuron PR #58) to round-trip.
|
||||
if str_eq(tool_name, "planWork") { return create_node_typed(args, "BacklogItem", "Working") }
|
||||
if str_eq(tool_name, "reviewBacklog") { return list_typed("BacklogItem", 50, args) }
|
||||
if str_eq(tool_name, "trackWork") { return evolve_by_supersede(args, "Memory") }
|
||||
if str_eq(tool_name, "listWork") { return list_typed("WorkContext", 50, args) }
|
||||
if str_eq(tool_name, "beginWork") { return create_typed_node(args, "Memory", "0.70") }
|
||||
|
||||
@@ -335,12 +335,6 @@ fn handle_connectors(method: String, clean: String, body: String) -> String {
|
||||
if str_eq(clean, "/api/connectors/oauth/start") {
|
||||
return connectd_post("/mcp/oauth/start", body)
|
||||
}
|
||||
// Call a connector tool directly (pre-chat), e.g. WhatsApp get_pairing_qr / get_login_status for
|
||||
// the pairing UI. Body: {"name":"mcp__<server>__<tool>","input":{...}}. Keeps the app on the
|
||||
// app->soul->connectd path (the UI never hits connectd directly) and works for remote/hosted apps.
|
||||
if str_eq(clean, "/api/connectors/call") {
|
||||
return connectd_post("/mcp/call", body)
|
||||
}
|
||||
return "{\"ok\":false,\"error\":\"unknown connectors route\"}"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user