Archived
remove Python/bash scripts, add forge soul reinstall command
- Delete scripts/ (Python/bash superseded by native El forge commands) - install.el: fix /api/nodes → /nodes, /api/edges → /edges (Engram has no /api prefix) - install.el: add FORCE_INSTALL env var to bypass already-installed check - install.el: remove all python3/launch_dharma.sh references - soul.el: add soul_reinstall_one() and forge soul reinstall <slug|--all> Wipes engram DB, restarts launchd agent, waits for startup, runs install
This commit is contained in:
+149
-19
@@ -784,6 +784,130 @@ fn soul_sandbox_main() -> String {
|
||||
return ""
|
||||
}
|
||||
|
||||
// ── soul_reinstall_one — wipe and reinstall a single soul ────────────────────
|
||||
//
|
||||
// 1. stop the launchd agent (launchctl stop)
|
||||
// 2. delete the engram DB directory (rm -rf)
|
||||
// 3. kickstart the launchd agent (launchctl kickstart)
|
||||
// 4. wait up to 10s for the Engram to respond on /stats
|
||||
// 5. run install_main() against this soul's engram_url + seed_file
|
||||
//
|
||||
// slug: e.g. "kal-el"
|
||||
fn soul_reinstall_one(slug: String) -> String {
|
||||
println("[soul] reinstalling: " + slug)
|
||||
|
||||
// Look up soul in registry
|
||||
let reg_json: String = fs_read("registry.json")
|
||||
if str_eq(reg_json, "") {
|
||||
println("[soul] error: cannot read registry.json")
|
||||
return ""
|
||||
}
|
||||
let entry: String = ""
|
||||
let ri: Int = 0
|
||||
while ri < 30 {
|
||||
let e: String = json_get(reg_json, "imprints." + int_to_str(ri))
|
||||
if str_eq(e, "") { let ri = ri + 30 }
|
||||
else {
|
||||
let s: String = json_get_string(e, "slug")
|
||||
if str_eq(s, slug) { let entry = e; let ri = ri + 30 }
|
||||
else { let ri = ri + 1 }
|
||||
}
|
||||
}
|
||||
if str_eq(entry, "") {
|
||||
println("[soul] error: slug not found in registry: " + slug)
|
||||
return ""
|
||||
}
|
||||
|
||||
let engram_url: String = json_get_string(entry, "engram_url")
|
||||
let seed_file: String = json_get_string(entry, "seed_file")
|
||||
let db_path: String = json_get_string(entry, "engram_db_path")
|
||||
let label: String = "ai.neurontechnologies.soul." + slug
|
||||
let uid: String = str_trim(exec("id -u"))
|
||||
|
||||
// Step 1: stop
|
||||
println("[soul] stopping launchd agent...")
|
||||
exec("launchctl stop " + label + " 2>/dev/null")
|
||||
exec("sleep 1")
|
||||
|
||||
// Step 2: wipe DB
|
||||
if !str_eq(db_path, "") {
|
||||
println("[soul] wiping engram DB: " + db_path)
|
||||
exec("rm -rf " + db_path)
|
||||
}
|
||||
|
||||
// Step 3: kickstart
|
||||
println("[soul] starting fresh engram...")
|
||||
exec("launchctl kickstart gui/" + uid + "/" + label + " 2>/dev/null")
|
||||
|
||||
// Step 4: wait for Engram (poll /stats up to 10s)
|
||||
let ready: Bool = false
|
||||
let attempts: Int = 0
|
||||
while !ready && attempts < 10 {
|
||||
exec("sleep 1")
|
||||
let stats: String = http_get(engram_url + "/stats")
|
||||
if !str_eq(stats, "") && !str_starts_with(stats, "{\"error\"") {
|
||||
let ready = true
|
||||
}
|
||||
let attempts = attempts + 1
|
||||
}
|
||||
if !ready {
|
||||
println("[soul] warning: engram did not respond after 10s, proceeding anyway")
|
||||
} else {
|
||||
println("[soul] engram ready")
|
||||
}
|
||||
|
||||
// Step 5: clear registry engram_root_id so install proceeds (not skipped)
|
||||
// We write a temp registry update by patching the registry in place.
|
||||
// Easiest: just set ENGRAM_URL env and call install directly via HTTP.
|
||||
// The install.el skips if engram_root_id is set in registry — so we must
|
||||
// call the Engram directly to create nodes.
|
||||
//
|
||||
// For now: install by calling install_main() is not possible from soul.el
|
||||
// since it's a separate compiled unit. Instead we call forge install via exec.
|
||||
let api_key: String = "ntn-" + slug + "-2026"
|
||||
let forge_cmd: String = "ENGRAM_URL=" + engram_url + " ENGRAM_API_KEY=" + api_key
|
||||
+ " FORCE_INSTALL=1 ./dist/forge install " + seed_file + " 2>&1"
|
||||
println("[soul] installing seed: " + seed_file)
|
||||
let install_out: String = exec(forge_cmd)
|
||||
println(install_out)
|
||||
|
||||
return "done"
|
||||
}
|
||||
|
||||
// soul_reinstall_main — dispatch `forge soul reinstall <slug|--all>`
|
||||
fn soul_reinstall_main() -> String {
|
||||
let argv: [String] = args()
|
||||
let target: String = ""
|
||||
if len(argv) > 2 { let target = get(argv, 2) }
|
||||
|
||||
if str_eq(target, "") {
|
||||
println("[soul] usage: forge soul reinstall <slug>")
|
||||
println(" forge soul reinstall --all")
|
||||
return ""
|
||||
}
|
||||
|
||||
if str_eq(target, "--all") {
|
||||
println("[soul] reinstalling all souls...")
|
||||
let reg_json: String = fs_read("registry.json")
|
||||
if str_eq(reg_json, "") { println("[soul] error: cannot read registry.json"); return "" }
|
||||
let i: Int = 0
|
||||
while i < 30 {
|
||||
let e: String = json_get(reg_json, "imprints." + int_to_str(i))
|
||||
if str_eq(e, "") { let i = i + 30 }
|
||||
else {
|
||||
let s: String = json_get_string(e, "slug")
|
||||
if !str_eq(s, "") { soul_reinstall_one(s) }
|
||||
let i = i + 1
|
||||
}
|
||||
}
|
||||
println("[soul] reinstall complete.")
|
||||
return ""
|
||||
}
|
||||
|
||||
soul_reinstall_one(target)
|
||||
return ""
|
||||
}
|
||||
|
||||
// ── soul_main — dispatch ─────────────────────────────────────────────────────
|
||||
//
|
||||
// args() layout when invoked as: forge soul <subcmd> [slug]
|
||||
@@ -801,30 +925,36 @@ fn soul_main() -> String {
|
||||
if str_eq(subcmd, "install") {
|
||||
soul_install_main()
|
||||
} else {
|
||||
if str_eq(subcmd, "start") {
|
||||
soul_start_main()
|
||||
if str_eq(subcmd, "reinstall") {
|
||||
soul_reinstall_main()
|
||||
} else {
|
||||
if str_eq(subcmd, "stop") {
|
||||
soul_stop_main()
|
||||
if str_eq(subcmd, "start") {
|
||||
soul_start_main()
|
||||
} else {
|
||||
if str_eq(subcmd, "status") {
|
||||
soul_status_main()
|
||||
if str_eq(subcmd, "stop") {
|
||||
soul_stop_main()
|
||||
} else {
|
||||
if str_eq(subcmd, "wire") {
|
||||
soul_wire_main()
|
||||
if str_eq(subcmd, "status") {
|
||||
soul_status_main()
|
||||
} else {
|
||||
if str_eq(subcmd, "sandbox") {
|
||||
soul_sandbox_main()
|
||||
if str_eq(subcmd, "wire") {
|
||||
soul_wire_main()
|
||||
} else {
|
||||
println("[soul] usage: forge soul <install|start|stop|status|wire|sandbox> [slug]")
|
||||
println("")
|
||||
println(" forge soul install <slug> — write launchd plist, load soul as resident")
|
||||
println(" forge soul install --all — install all souls from registry")
|
||||
println(" forge soul start <slug> — kickstart a loaded soul")
|
||||
println(" forge soul stop <slug> — stop a running soul")
|
||||
println(" forge soul status — health check all souls")
|
||||
println(" forge soul wire — register all souls as Engram peers")
|
||||
println(" forge soul sandbox <subcmd> — sandbox management (create|list|join|close|status)")
|
||||
if str_eq(subcmd, "sandbox") {
|
||||
soul_sandbox_main()
|
||||
} else {
|
||||
println("[soul] usage: forge soul <subcmd> [slug]")
|
||||
println("")
|
||||
println(" forge soul install <slug> — write launchd plist, load as resident")
|
||||
println(" forge soul install --all — install all souls from registry")
|
||||
println(" forge soul reinstall <slug> — wipe DB and reinstall from seed")
|
||||
println(" forge soul reinstall --all — wipe and reinstall all souls")
|
||||
println(" forge soul start <slug> — kickstart a loaded soul")
|
||||
println(" forge soul stop <slug> — stop a running soul")
|
||||
println(" forge soul status — health check all souls")
|
||||
println(" forge soul wire — register all souls as Engram peers")
|
||||
println(" forge soul sandbox <subcmd> — sandbox management")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user