fix(installer): write providers map by object key to avoid quoted provider id and restore providers atomically on uninstall

This commit is contained in:
2026-02-26 06:26:52 +00:00
parent 875cd66d34
commit 8d34bf257b

View File

@@ -34,7 +34,7 @@ const RECORD_PATH = path.join(STATE_DIR, `whispergate-${ts}.json`);
const PATH_PLUGINS_LOAD = "plugins.load.paths"; const PATH_PLUGINS_LOAD = "plugins.load.paths";
const PATH_PLUGIN_ENTRY = "plugins.entries.whispergate"; const PATH_PLUGIN_ENTRY = "plugins.entries.whispergate";
const PROVIDER_PATH = `models.providers["${NO_REPLY_PROVIDER_ID}"]`; const PATH_PROVIDERS = "models.providers";
function runOpenclaw(args, { allowFail = false } = {}) { function runOpenclaw(args, { allowFail = false } = {}) {
try { try {
@@ -127,7 +127,7 @@ if (mode === "install") {
const before = { const before = {
[PATH_PLUGINS_LOAD]: getJson(PATH_PLUGINS_LOAD), [PATH_PLUGINS_LOAD]: getJson(PATH_PLUGINS_LOAD),
[PATH_PLUGIN_ENTRY]: getJson(PATH_PLUGIN_ENTRY), [PATH_PLUGIN_ENTRY]: getJson(PATH_PLUGIN_ENTRY),
[PROVIDER_PATH]: getJson(PROVIDER_PATH), [PATH_PROVIDERS]: getJson(PATH_PROVIDERS),
}; };
try { try {
@@ -154,7 +154,9 @@ if (mode === "install") {
}; };
setJson("plugins", plugins); setJson("plugins", plugins);
setJson(PROVIDER_PATH, { const providersNow = getJson(PATH_PROVIDERS).value || {};
const providers = typeof providersNow === "object" ? providersNow : {};
providers[NO_REPLY_PROVIDER_ID] = {
baseUrl: NO_REPLY_BASE_URL, baseUrl: NO_REPLY_BASE_URL,
apiKey: NO_REPLY_API_KEY, apiKey: NO_REPLY_API_KEY,
api: "openai-completions", api: "openai-completions",
@@ -169,7 +171,8 @@ if (mode === "install") {
maxTokens: 4096, maxTokens: 4096,
}, },
], ],
}); };
setJson(PATH_PROVIDERS, providers);
runOpenclaw(["gateway", "restart"]); runOpenclaw(["gateway", "restart"]);
validateNoReplyModelAvailable(); validateNoReplyModelAvailable();
@@ -177,7 +180,7 @@ if (mode === "install") {
const after = { const after = {
[PATH_PLUGINS_LOAD]: getJson(PATH_PLUGINS_LOAD), [PATH_PLUGINS_LOAD]: getJson(PATH_PLUGINS_LOAD),
[PATH_PLUGIN_ENTRY]: getJson(PATH_PLUGIN_ENTRY), [PATH_PLUGIN_ENTRY]: getJson(PATH_PLUGIN_ENTRY),
[PROVIDER_PATH]: getJson(PROVIDER_PATH), [PATH_PROVIDERS]: getJson(PATH_PROVIDERS),
}; };
writeRecord("install", before, after); writeRecord("install", before, after);
console.log("[whispergate] install ok"); console.log("[whispergate] install ok");
@@ -215,16 +218,13 @@ if (mode === "install") {
setJson("plugins", plugins); setJson("plugins", plugins);
for (const k of Object.keys(target)) { if (target[PATH_PROVIDERS]?.exists) setJson(PATH_PROVIDERS, target[PATH_PROVIDERS].value);
if (!k.startsWith("models.providers[")) continue; else unsetPath(PATH_PROVIDERS);
if (target[k]?.exists) setJson(k, target[k].value);
else unsetPath(k);
}
const after = { const after = {
[PATH_PLUGINS_LOAD]: getJson(PATH_PLUGINS_LOAD), [PATH_PLUGINS_LOAD]: getJson(PATH_PLUGINS_LOAD),
[PATH_PLUGIN_ENTRY]: getJson(PATH_PLUGIN_ENTRY), [PATH_PLUGIN_ENTRY]: getJson(PATH_PLUGIN_ENTRY),
[PROVIDER_PATH]: getJson(PROVIDER_PATH), [PATH_PROVIDERS]: getJson(PATH_PROVIDERS),
}; };
writeRecord("uninstall", before, after); writeRecord("uninstall", before, after);
console.log("[whispergate] uninstall ok"); console.log("[whispergate] uninstall ok");