





















@@ -1,6 +1,6 @@
11import { isChannelVisibleInConfiguredLists } from "../channels/plugins/exposure.js";
22import { resolveChannelDefaultAccountId } from "../channels/plugins/helpers.js";
3-import { getChannelPlugin, normalizeChannelId } from "../channels/plugins/index.js";
3+import { normalizeChannelId } from "../channels/plugins/index.js";
44import { listReadOnlyChannelPluginsForConfig } from "../channels/plugins/read-only.js";
55import type { ChannelPlugin } from "../channels/plugins/types.plugin.js";
66import type { ChannelId } from "../channels/plugins/types.public.js";
@@ -19,10 +19,37 @@ type ProviderAccountStatus = {
1919visibleInConfiguredLists?: boolean;
2020};
212122+export type ProviderSummaryMetadata = {
23+label: string;
24+defaultAccountId: string;
25+visibleInConfiguredLists: boolean;
26+};
27+2228function providerAccountKey(provider: ChannelId, accountId?: string) {
2329return `${provider}:${accountId ?? DEFAULT_ACCOUNT_ID}`;
2430}
253132+export function buildProviderSummaryMetadataIndex(
33+cfg: OpenClawConfig,
34+): Map<ChannelId, ProviderSummaryMetadata> {
35+return new Map(
36+listReadOnlyChannelPluginsForConfig(cfg, {
37+includeSetupRuntimeFallback: false,
38+}).map((plugin) => [
39+plugin.id,
40+{
41+label: plugin.meta.label,
42+defaultAccountId: resolveChannelDefaultAccountId({
43+ plugin,
44+ cfg,
45+accountIds: plugin.config.listAccountIds(cfg),
46+}),
47+visibleInConfiguredLists: isChannelVisibleInConfiguredLists(plugin.meta),
48+},
49+]),
50+);
51+}
52+2653function isUnresolvedSecretRefResolutionError(error: unknown): boolean {
2754return (
2855error instanceof Error &&
@@ -37,8 +64,7 @@ function formatChannelAccountLabel(params: {
3764accountId: string;
3865name?: string;
3966}): string {
40-const label =
41-params.providerLabel ?? getChannelPlugin(params.provider)?.meta.label ?? params.provider;
67+const label = params.providerLabel ?? params.provider;
4268const account = params.name?.trim()
4369 ? `${params.accountId} (${params.name.trim()})`
4470 : params.accountId;
@@ -134,31 +160,26 @@ export async function buildProviderStatusIndex(
134160return map;
135161}
136162137-function resolveDefaultAccountId(cfg: OpenClawConfig, provider: ChannelId): string {
138-const plugin = getChannelPlugin(provider);
139-if (!plugin) {
140-return DEFAULT_ACCOUNT_ID;
141-}
142-return resolveChannelDefaultAccountId({ plugin, cfg });
163+function resolveDefaultAccountId(
164+provider: ChannelId,
165+metadataByProvider: ReadonlyMap<ChannelId, ProviderSummaryMetadata>,
166+): string {
167+return metadataByProvider.get(provider)?.defaultAccountId ?? DEFAULT_ACCOUNT_ID;
143168}
144169145-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-}
153-const plugin = getChannelPlugin(entry.provider);
154-if (!plugin) {
155-return Boolean(entry.configured);
156-}
157-if (!isChannelVisibleInConfiguredLists(plugin.meta)) {
158-const providerConfig = (cfg as Record<string, unknown>)[plugin.id];
159-return Boolean(entry.configured) || Boolean(providerConfig);
170+function shouldShowProviderEntry(params: {
171+entry: ProviderAccountStatus;
172+cfg: OpenClawConfig;
173+metadataByProvider: ReadonlyMap<ChannelId, ProviderSummaryMetadata>;
174+}): boolean {
175+const visibleInConfiguredLists =
176+params.entry.visibleInConfiguredLists ??
177+params.metadataByProvider.get(params.entry.provider)?.visibleInConfiguredLists;
178+if (visibleInConfiguredLists === false) {
179+const providerConfig = (params.cfg as Record<string, unknown>)[params.entry.provider];
180+return Boolean(params.entry.configured) || Boolean(providerConfig);
160181}
161-return Boolean(entry.configured);
182+return Boolean(params.entry.configured);
162183}
163184164185function formatProviderEntry(entry: ProviderAccountStatus): string {
@@ -171,7 +192,11 @@ function formatProviderEntry(entry: ProviderAccountStatus): string {
171192return `${label}: ${formatProviderState(entry)}`;
172193}
173194174-export function summarizeBindings(cfg: OpenClawConfig, bindings: AgentBinding[]): string[] {
195+export function summarizeBindings(
196+cfg: OpenClawConfig,
197+bindings: AgentBinding[],
198+metadataByProvider = buildProviderSummaryMetadataIndex(cfg),
199+): string[] {
175200if (bindings.length === 0) {
176201return [];
177202}
@@ -181,11 +206,13 @@ export function summarizeBindings(cfg: OpenClawConfig, bindings: AgentBinding[])
181206if (!channel) {
182207continue;
183208}
184-const accountId = binding.match.accountId ?? resolveDefaultAccountId(cfg, channel);
209+const accountId =
210+binding.match.accountId ?? resolveDefaultAccountId(channel, metadataByProvider);
185211const key = providerAccountKey(channel, accountId);
186212if (!seen.has(key)) {
187213const label = formatChannelAccountLabel({
188214provider: channel,
215+providerLabel: metadataByProvider.get(channel)?.label,
189216 accountId,
190217});
191218seen.set(key, label);
@@ -199,17 +226,21 @@ export function listProvidersForAgent(params: {
199226cfg: OpenClawConfig;
200227bindings: AgentBinding[];
201228providerStatus: Map<string, ProviderAccountStatus>;
229+providerMetadata?: ReadonlyMap<ChannelId, ProviderSummaryMetadata>;
202230}): string[] {
203231const allProviderEntries = [...params.providerStatus.values()];
204232const providerLines: string[] = [];
233+const metadataByProvider =
234+params.providerMetadata ?? buildProviderSummaryMetadataIndex(params.cfg);
205235if (params.bindings.length > 0) {
206236const seen = new Set<string>();
207237for (const binding of params.bindings) {
208238const channel = normalizeChannelId(binding.match.channel);
209239if (!channel) {
210240continue;
211241}
212-const accountId = binding.match.accountId ?? resolveDefaultAccountId(params.cfg, channel);
242+const accountId =
243+binding.match.accountId ?? resolveDefaultAccountId(channel, metadataByProvider);
213244const key = providerAccountKey(channel, accountId);
214245if (seen.has(key)) {
215246continue;
@@ -220,7 +251,11 @@ export function listProvidersForAgent(params: {
220251providerLines.push(formatProviderEntry(status));
221252} else {
222253providerLines.push(
223-`${formatChannelAccountLabel({ provider: channel, accountId })}: unknown`,
254+`${formatChannelAccountLabel({
255+ provider: channel,
256+ providerLabel: metadataByProvider.get(channel)?.label,
257+ accountId,
258+ })}: unknown`,
224259);
225260}
226261}
@@ -229,7 +264,7 @@ export function listProvidersForAgent(params: {
229264230265if (params.summaryIsDefault) {
231266for (const entry of allProviderEntries) {
232-if (shouldShowProviderEntry(entry, params.cfg)) {
267+if (shouldShowProviderEntry({ entry, cfg: params.cfg, metadataByProvider })) {
233268providerLines.push(formatProviderEntry(entry));
234269}
235270}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。