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

推荐订阅源

L
LangChain Blog
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Blog — PlanetScale
Blog — PlanetScale
Microsoft Security Blog
Microsoft Security Blog
D
Docker
WordPress大学
WordPress大学
罗磊的独立博客
J
Java Code Geeks
博客园 - 【当耐特】
博客园 - 司徒正美
雷峰网
雷峰网
H
Help Net Security
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
T
Tailwind CSS Blog
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence
Recent Announcements
Recent Announcements
B
Blog

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
feat: use indexed manifests for static model catalog rows...
shakkernerd · 2026-04-26 · via Recent Commits to openclaw:main

@@ -1,17 +1,33 @@

11

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

2-

import { planManifestModelCatalogRows } from "../../model-catalog/index.js";

2+

import {

3+

normalizeModelCatalogProviderId,

4+

planManifestModelCatalogRows,

5+

} from "../../model-catalog/index.js";

36

import type { NormalizedModelCatalogRow } from "../../model-catalog/index.js";

4-

import { loadPluginManifestRegistry } from "../../plugins/manifest-registry.js";

7+

import { loadPluginManifestRegistryForInstalledIndex } from "../../plugins/manifest-registry-installed.js";

8+

import {

9+

getPluginRecord,

10+

isPluginEnabled,

11+

loadPluginRegistrySnapshot,

12+

resolvePluginContributionOwners,

13+

type PluginRegistrySnapshot,

14+

} from "../../plugins/plugin-registry.js";

5156-

export function loadStaticManifestCatalogRowsForList(params: {

16+

function loadStaticManifestCatalogRowsForPluginIds(params: {

717

cfg: OpenClawConfig;

8-

providerFilter: string;

918

env?: NodeJS.ProcessEnv;

19+

index: PluginRegistrySnapshot;

20+

pluginIds: readonly string[];

21+

providerFilter: string;

1022

}): readonly NormalizedModelCatalogRow[] {

11-

const registry = loadPluginManifestRegistry({

23+

if (params.pluginIds.length === 0) {

24+

return [];

25+

}

26+

const registry = loadPluginManifestRegistryForInstalledIndex({

27+

index: params.index,

1228

config: params.cfg,

1329

env: params.env,

14-

cache: true,

30+

pluginIds: params.pluginIds,

1531

});

1632

const plan = planManifestModelCatalogRows({

1733

registry,

@@ -25,3 +41,78 @@ export function loadStaticManifestCatalogRowsForList(params: {

2541

}

2642

return plan.rows.filter((row) => staticProviders.has(row.provider));

2743

}

44+45+

function resolveConventionModelCatalogPluginIds(params: {

46+

cfg: OpenClawConfig;

47+

index: PluginRegistrySnapshot;

48+

providerFilter: string;

49+

}): readonly string[] {

50+

const record = getPluginRecord({

51+

index: params.index,

52+

pluginId: params.providerFilter,

53+

});

54+

if (

55+

!record ||

56+

!isPluginEnabled({

57+

index: params.index,

58+

pluginId: record.pluginId,

59+

config: params.cfg,

60+

})

61+

) {

62+

return [];

63+

}

64+

return [record.pluginId];

65+

}

66+67+

function resolveDeclaredModelCatalogPluginIds(params: {

68+

cfg: OpenClawConfig;

69+

index: PluginRegistrySnapshot;

70+

providerFilter: string;

71+

}): readonly string[] {

72+

return resolvePluginContributionOwners({

73+

index: params.index,

74+

config: params.cfg,

75+

contribution: "modelCatalogProviders",

76+

matches: params.providerFilter,

77+

});

78+

}

79+80+

export function loadStaticManifestCatalogRowsForList(params: {

81+

cfg: OpenClawConfig;

82+

providerFilter: string;

83+

env?: NodeJS.ProcessEnv;

84+

}): readonly NormalizedModelCatalogRow[] {

85+

const providerFilter = normalizeModelCatalogProviderId(params.providerFilter);

86+

if (!providerFilter) {

87+

return [];

88+

}

89+

const index = loadPluginRegistrySnapshot({

90+

config: params.cfg,

91+

env: params.env,

92+

});

93+

const conventionRows = loadStaticManifestCatalogRowsForPluginIds({

94+

cfg: params.cfg,

95+

env: params.env,

96+

index,

97+

pluginIds: resolveConventionModelCatalogPluginIds({

98+

cfg: params.cfg,

99+

index,

100+

providerFilter,

101+

}),

102+

providerFilter,

103+

});

104+

if (conventionRows.length > 0) {

105+

return conventionRows;

106+

}

107+

return loadStaticManifestCatalogRowsForPluginIds({

108+

cfg: params.cfg,

109+

env: params.env,

110+

index,

111+

pluginIds: resolveDeclaredModelCatalogPluginIds({

112+

cfg: params.cfg,

113+

index,

114+

providerFilter,

115+

}),

116+

providerFilter,

117+

});

118+

}