惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
J
Java Code Geeks
C
Check Point Blog
Last Week in AI
Last Week in AI
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
L
LangChain Blog
有赞技术团队
有赞技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 司徒正美
IT之家
IT之家
Martin Fowler
Martin Fowler
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
U
Unit 42
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
fix: keep agent provider status on plugin index · opencla...
shakkernerd · 2026-04-26 · via Recent Commits to openclaw:main

@@ -1,22 +1,22 @@

11

import { isChannelVisibleInConfiguredLists } from "../channels/plugins/exposure.js";

22

import { resolveChannelDefaultAccountId } from "../channels/plugins/helpers.js";

3-

import {

4-

getChannelPlugin,

5-

listChannelPlugins,

6-

normalizeChannelId,

7-

} from "../channels/plugins/index.js";

3+

import { getChannelPlugin, normalizeChannelId } from "../channels/plugins/index.js";

4+

import { listReadOnlyChannelPluginsForConfig } from "../channels/plugins/read-only.js";

5+

import type { ChannelPlugin } from "../channels/plugins/types.plugin.js";

86

import type { ChannelId } from "../channels/plugins/types.public.js";

97

import type { AgentBinding } from "../config/types.js";

108

import type { OpenClawConfig } from "../config/types.openclaw.js";

119

import { DEFAULT_ACCOUNT_ID } from "../routing/session-key.js";

12101311

type ProviderAccountStatus = {

1412

provider: ChannelId;

13+

providerLabel?: string;

1514

accountId: string;

1615

name?: string;

1716

state: "linked" | "not linked" | "configured" | "not configured" | "enabled" | "disabled";

1817

enabled?: boolean;

1918

configured?: boolean;

19+

visibleInConfiguredLists?: boolean;

2020

};

21212222

function providerAccountKey(provider: ChannelId, accountId?: string) {

@@ -33,10 +33,12 @@ function isUnresolvedSecretRefResolutionError(error: unknown): boolean {

33333434

function formatChannelAccountLabel(params: {

3535

provider: ChannelId;

36+

providerLabel?: string;

3637

accountId: string;

3738

name?: string;

3839

}): string {

39-

const label = getChannelPlugin(params.provider)?.meta.label ?? params.provider;

40+

const label =

41+

params.providerLabel ?? getChannelPlugin(params.provider)?.meta.label ?? params.provider;

4042

const account = params.name?.trim()

4143

? `${params.accountId} (${params.name.trim()})`

4244

: params.accountId;

@@ -52,7 +54,7 @@ function formatProviderState(entry: ProviderAccountStatus): string {

5254

}

53555456

async function resolveReadOnlyAccount(params: {

55-

plugin: ReturnType<typeof listChannelPlugins>[number];

57+

plugin: ChannelPlugin;

5658

cfg: OpenClawConfig;

5759

accountId: string;

5860

}): Promise<unknown> {

@@ -67,7 +69,9 @@ export async function buildProviderStatusIndex(

6769

): Promise<Map<string, ProviderAccountStatus>> {

6870

const map = new Map<string, ProviderAccountStatus>();

697170-

for (const plugin of listChannelPlugins()) {

72+

for (const plugin of listReadOnlyChannelPluginsForConfig(cfg, {

73+

includeSetupRuntimeFallback: false,

74+

})) {

7175

const accountIds = plugin.config.listAccountIds(cfg);

7276

for (const accountId of accountIds) {

7377

let account: unknown;

@@ -116,11 +120,13 @@ export async function buildProviderStatusIndex(

116120

const name = snapshot?.name ?? (account as { name?: string }).name;

117121

map.set(providerAccountKey(plugin.id, accountId), {

118122

provider: plugin.id,

123+

providerLabel: plugin.meta.label,

119124

accountId,

120125

name,

121126

state,

122127

enabled,

123128

configured,

129+

visibleInConfiguredLists: isChannelVisibleInConfiguredLists(plugin.meta),

124130

});

125131

}

126132

}

@@ -137,6 +143,13 @@ function resolveDefaultAccountId(cfg: OpenClawConfig, provider: ChannelId): stri

137143

}

138144139145

function shouldShowProviderEntry(entry: ProviderAccountStatus, cfg: OpenClawConfig): boolean {

146+

if (entry.visibleInConfiguredLists !== undefined) {

147+

if (!entry.visibleInConfiguredLists) {

148+

const providerConfig = (cfg as Record<string, unknown>)[entry.provider];

149+

return Boolean(entry.configured) || Boolean(providerConfig);

150+

}

151+

return Boolean(entry.configured);

152+

}

140153

const plugin = getChannelPlugin(entry.provider);

141154

if (!plugin) {

142155

return Boolean(entry.configured);

@@ -151,6 +164,7 @@ function shouldShowProviderEntry(entry: ProviderAccountStatus, cfg: OpenClawConf

151164

function formatProviderEntry(entry: ProviderAccountStatus): string {

152165

const label = formatChannelAccountLabel({

153166

provider: entry.provider,

167+

providerLabel: entry.providerLabel,

154168

accountId: entry.accountId,

155169

name: entry.name,

156170

});