fix: avoid persisted-auth channel startup probes

This commit is contained in:
Peter Steinberger
2026-04-26 07:09:14 +01:00
parent 1ed8c41f33
commit 7c6c0a8d54
5 changed files with 51 additions and 1 deletions

View File

@@ -73,6 +73,7 @@ Docs: https://docs.openclaw.ai
### Fixes
- Gateway/plugins: stop persisted WhatsApp auth state from activating bundled channel runtime-dependency repair during startup when `channels.whatsapp` is absent, avoiding npm/git stalls on packaged Linux installs. Fixes #71994. Thanks @xiao398008.
- CLI/model runs: keep `openclaw infer model run` on explicit OpenRouter models from loading the full provider catalog or inheriting chat-agent silent-reply policy, restoring non-empty one-shot probe output. Fixes #68791. Thanks @limpredator.
- Installer/macOS: rerun Homebrew install steps without the gum spinner when raw-mode ioctl failures occur, and avoid claiming `node@24` was installed when the Homebrew keg binary is missing. Fixes #70411. Thanks @1fanwang and @dad-io.
- Installer: load nvm before Node.js detection so `curl | bash` installs respect nvm-managed Node instead of stale system Node. Fixes #49556. Thanks @heavenlxj.

View File

@@ -85,6 +85,8 @@ Packaged installs keep bundled plugin runtime dependencies out of the read-only
package tree. On startup and during `openclaw doctor --fix`, OpenClaw repairs
runtime dependencies only for bundled plugins that are active in config, active
through legacy channel config, or enabled by their bundled manifest default.
Persisted channel auth state alone does not trigger Gateway startup
runtime-dependency repair.
Explicit disablement wins. A disabled plugin or channel does not get its
runtime dependencies repaired just because it exists in the package. External

View File

@@ -65,6 +65,8 @@ Packaged OpenClaw installs do not eagerly install every bundled plugin's
runtime dependency tree. When a bundled OpenClaw-owned plugin is active from
plugin config, legacy channel config, or a default-enabled manifest, startup
repairs only that plugin's declared runtime dependencies before importing it.
Persisted channel auth state alone does not activate a bundled channel for
Gateway startup runtime-dependency repair.
Explicit disablement still wins: `plugins.entries.<id>.enabled: false`,
`plugins.deny`, `plugins.enabled: false`, and `channels.<id>.enabled: false`
prevent automatic bundled runtime-dependency repair for that plugin/channel.

View File

@@ -544,6 +544,51 @@ describe("resolveGatewayStartupPluginIds", () => {
});
});
it("does not treat persisted auth alone as gateway startup intent", () => {
listPotentialConfiguredChannelIds.mockImplementation(
(
_config: OpenClawConfig,
_env: NodeJS.ProcessEnv,
options?: { includePersistedAuthState?: boolean },
) => (options?.includePersistedAuthState === false ? [] : ["demo-channel"]),
);
expectStartupPluginIdsCase({
config: {} as OpenClawConfig,
env: {
OPENCLAW_STATE_DIR: "/tmp/openclaw-with-persisted-demo-channel",
} as NodeJS.ProcessEnv,
expected: ["browser"],
});
});
it("does not treat persisted auth alone as deferred channel startup intent", () => {
loadPluginManifestRegistry
.mockReset()
.mockReturnValue(createManifestRegistryFixtureWithWorkspaceDemoChannel());
listPotentialConfiguredChannelIds.mockImplementation(
(
_config: OpenClawConfig,
_env: NodeJS.ProcessEnv,
options?: { includePersistedAuthState?: boolean },
) => (options?.includePersistedAuthState === false ? [] : ["demo-channel"]),
);
expect(
resolveConfiguredDeferredChannelPluginIds({
config: {
plugins: {
allow: ["workspace-demo-channel-plugin"],
},
} as OpenClawConfig,
workspaceDir: "/tmp",
env: {
OPENCLAW_STATE_DIR: "/tmp/openclaw-with-persisted-demo-channel",
} as NodeJS.ProcessEnv,
}),
).toEqual([]);
});
it("does not treat explicitly disabled stale channel config as deferred startup intent", () => {
loadPluginManifestRegistry
.mockReset()

View File

@@ -41,7 +41,7 @@ function listDisabledChannelIds(config: OpenClawConfig): Set<string> {
function listPotentialEnabledChannelIds(config: OpenClawConfig, env: NodeJS.ProcessEnv): string[] {
const disabled = listDisabledChannelIds(config);
return listPotentialConfiguredChannelIds(config, env)
return listPotentialConfiguredChannelIds(config, env, { includePersistedAuthState: false })
.map((id) => normalizeOptionalLowercaseString(id) ?? "")
.filter((id) => id && !disabled.has(id));
}