From 92799176bf445e1be0b40cd0861317450a3e72e7 Mon Sep 17 00:00:00 2001 From: zhi Date: Tue, 3 Mar 2026 18:28:44 +0000 Subject: [PATCH] fix(install): fix uninstall order to satisfy config validation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove from plugins.allow BEFORE deleting plugins.entries.dirigent - OpenClaw validates that allow[] entries must exist in entries{} - New order: allow → entry → paths → provider --- scripts/install-dirigent-openclaw.mjs | 37 +++++++++++++++------------ 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/scripts/install-dirigent-openclaw.mjs b/scripts/install-dirigent-openclaw.mjs index 64ea4ba..d5fb9c5 100755 --- a/scripts/install-dirigent-openclaw.mjs +++ b/scripts/install-dirigent-openclaw.mjs @@ -279,19 +279,25 @@ else { const delta = rec.delta || { added: {}, replaced: {}, removed: {} }; try { - // ── Handle ADDED entries: remove them ───────────────────────────────── + // ── IMPORTANT: Order matters for OpenClaw config validation ──────────── + // 1. First remove from allow (before deleting entry, otherwise validation fails) + if (delta.added[PATH_PLUGINS_ALLOW] !== undefined) { + const allowList = getJson(PATH_PLUGINS_ALLOW) || []; + const idx = allowList.indexOf("dirigent"); + if (idx !== -1) { + allowList.splice(idx, 1); + setJson(PATH_PLUGINS_ALLOW, allowList); + console.log("[dirigent] removed 'dirigent' from plugins.allow"); + } + } + + // 2. Then remove entry if (delta.added[PATH_PLUGIN_ENTRY] !== undefined || delta.replaced[PATH_PLUGIN_ENTRY] !== undefined) { unsetPath(PATH_PLUGIN_ENTRY); console.log("[dirigent] removed plugins.entries.dirigent"); } - if (delta.added[PATH_PROVIDER_ENTRY] !== undefined) { - const providers = getJson(PATH_PROVIDERS) || {}; - delete providers[NO_REPLY_PROVIDER_ID]; - setJson(PATH_PROVIDERS, providers); - console.log(`[dirigent] removed models.providers.${NO_REPLY_PROVIDER_ID}`); - } - + // 3. Then remove plugin path (after entry is gone) if (delta.added[PATH_PLUGINS_LOAD] !== undefined) { const plugins = getJson("plugins") || {}; const paths = plugins.load?.paths || []; @@ -304,15 +310,12 @@ else { } } - // ── Handle plugins.allow ────────────────────────────────────────────── - if (delta.added[PATH_PLUGINS_ALLOW] !== undefined) { - const allowList = getJson(PATH_PLUGINS_ALLOW) || []; - const idx = allowList.indexOf("dirigent"); - if (idx !== -1) { - allowList.splice(idx, 1); - setJson(PATH_PLUGINS_ALLOW, allowList); - console.log("[dirigent] removed 'dirigent' from plugins.allow"); - } + // 4. Finally remove provider + if (delta.added[PATH_PROVIDER_ENTRY] !== undefined) { + const providers = getJson(PATH_PROVIDERS) || {}; + delete providers[NO_REPLY_PROVIDER_ID]; + setJson(PATH_PROVIDERS, providers); + console.log(`[dirigent] removed models.providers.${NO_REPLY_PROVIDER_ID}`); } // ── Handle REPLACED provider: restore old value ───────────────────────