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

推荐订阅源

L
LangChain Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
N
Netflix TechBlog - Medium
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
U
Unit 42
腾讯CDC
D
Docker
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
I
InfoQ
Jina AI
Jina AI
爱范儿
爱范儿
宝玉的分享
宝玉的分享
博客园 - Franky
G
Google Developers Blog
P
Proofpoint News Feed

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(codex): preserve MCP servers in app-server harness (#...
jalehman · 2026-05-14 · via Recent Commits to openclaw:main

@@ -73,6 +73,8 @@ export async function startOrResumeThread(params: {

7373

appServer: CodexAppServerRuntimeOptions;

7474

developerInstructions?: string;

7575

config?: JsonObject;

76+

mcpServersFingerprint?: string;

77+

mcpServersFingerprintEvaluated?: boolean;

7678

pluginThreadConfig?: CodexPluginThreadConfigProvider;

7779

}): Promise<CodexAppServerThreadLifecycleBinding> {

7880

const dynamicToolsFingerprint = fingerprintDynamicTools(params.dynamicTools);

@@ -112,6 +114,17 @@ export async function startOrResumeThread(params: {

112114

await clearCodexAppServerBinding(params.params.sessionFile);

113115

binding = undefined;

114116

}

117+

if (

118+

binding?.threadId &&

119+

params.mcpServersFingerprintEvaluated === true &&

120+

binding.mcpServersFingerprint !== params.mcpServersFingerprint

121+

) {

122+

embeddedAgentLog.debug("codex app-server MCP config changed; starting a new thread", {

123+

threadId: binding.threadId,

124+

});

125+

await clearCodexAppServerBinding(params.params.sessionFile);

126+

binding = undefined;

127+

}

115128

if (binding?.threadId) {

116129

let pluginBindingStale = isCodexPluginThreadBindingStale({

117130

codexPluginsEnabled: params.pluginThreadConfig?.enabled ?? false,

@@ -146,6 +159,17 @@ export async function startOrResumeThread(params: {

146159

binding = undefined;

147160

}

148161

}

162+

if (

163+

binding?.threadId &&

164+

params.mcpServersFingerprintEvaluated === true &&

165+

binding.mcpServersFingerprint !== params.mcpServersFingerprint

166+

) {

167+

embeddedAgentLog.debug("codex app-server MCP config changed; starting a new thread", {

168+

threadId: binding.threadId,

169+

});

170+

await clearCodexAppServerBinding(params.params.sessionFile);

171+

binding = undefined;

172+

}

149173

if (binding?.threadId) {

150174

// `/codex resume <thread>` writes a binding before the next turn can know

151175

// the dynamic tool catalog, so only invalidate fingerprints we actually have.

@@ -179,6 +203,7 @@ export async function startOrResumeThread(params: {

179203

} else {

180204

try {

181205

const authProfileId = params.params.authProfileId ?? binding.authProfileId;

206+

const resumeConfig = mergeCodexThreadConfigs(params.config, userMcpServersConfigPatch);

182207

const response = assertCodexThreadResumeResponse(

183208

await params.client.request(

184209

"thread/resume",

@@ -187,7 +212,7 @@ export async function startOrResumeThread(params: {

187212

authProfileId,

188213

appServer: params.appServer,

189214

developerInstructions: params.developerInstructions,

190-

config: params.config,

215+

config: resumeConfig,

191216

}),

192217

),

193218

);

@@ -199,6 +224,10 @@ export async function startOrResumeThread(params: {

199224

agentDir: params.params.agentDir,

200225

config: params.params.config,

201226

});

227+

const nextMcpServersFingerprint =

228+

params.mcpServersFingerprintEvaluated === true

229+

? params.mcpServersFingerprint

230+

: binding.mcpServersFingerprint;

202231

await writeCodexAppServerBinding(

203232

params.params.sessionFile,

204233

{

@@ -209,6 +238,7 @@ export async function startOrResumeThread(params: {

209238

modelProvider: response.modelProvider ?? fallbackModelProvider,

210239

dynamicToolsFingerprint,

211240

userMcpServersFingerprint,

241+

mcpServersFingerprint: nextMcpServersFingerprint,

212242

pluginAppsFingerprint: binding.pluginAppsFingerprint,

213243

pluginAppsInputFingerprint: binding.pluginAppsInputFingerprint,

214244

pluginAppPolicyContext: binding.pluginAppPolicyContext,

@@ -230,6 +260,7 @@ export async function startOrResumeThread(params: {

230260

modelProvider: response.modelProvider ?? fallbackModelProvider,

231261

dynamicToolsFingerprint,

232262

userMcpServersFingerprint,

263+

mcpServersFingerprint: nextMcpServersFingerprint,

233264

pluginAppsFingerprint: binding.pluginAppsFingerprint,

234265

pluginAppsInputFingerprint: binding.pluginAppsInputFingerprint,

235266

pluginAppPolicyContext: binding.pluginAppPolicyContext,

@@ -276,6 +307,8 @@ export async function startOrResumeThread(params: {

276307

config: params.params.config,

277308

});

278309

const createdAt = new Date().toISOString();

310+

const nextMcpServersFingerprint =

311+

params.mcpServersFingerprintEvaluated === true ? params.mcpServersFingerprint : undefined;

279312

if (!preserveExistingBinding) {

280313

await writeCodexAppServerBinding(

281314

params.params.sessionFile,

@@ -287,6 +320,7 @@ export async function startOrResumeThread(params: {

287320

modelProvider: response.modelProvider ?? modelProvider,

288321

dynamicToolsFingerprint,

289322

userMcpServersFingerprint,

323+

mcpServersFingerprint: nextMcpServersFingerprint,

290324

pluginAppsFingerprint: pluginThreadConfig?.fingerprint,

291325

pluginAppsInputFingerprint: pluginThreadConfig?.inputFingerprint,

292326

pluginAppPolicyContext: pluginThreadConfig?.policyContext,

@@ -310,6 +344,7 @@ export async function startOrResumeThread(params: {

310344

modelProvider: response.modelProvider ?? modelProvider,

311345

dynamicToolsFingerprint,

312346

userMcpServersFingerprint,

347+

mcpServersFingerprint: nextMcpServersFingerprint,

313348

pluginAppsFingerprint: pluginThreadConfig?.fingerprint,

314349

pluginAppsInputFingerprint: pluginThreadConfig?.inputFingerprint,

315350

pluginAppPolicyContext: pluginThreadConfig?.policyContext,