



























@@ -3,6 +3,7 @@ import {
33isActiveHarnessContextEngine,
44type EmbeddedRunAttemptParams,
55} from "openclaw/plugin-sdk/agent-harness-runtime";
6+import { buildCodexUserMcpServersThreadConfigPatch } from "openclaw/plugin-sdk/codex-mcp-projection";
67import {
78CODEX_GPT5_HEARTBEAT_PROMPT_OVERLAY,
89renderCodexPromptOverlay,
@@ -76,6 +77,8 @@ export async function startOrResumeThread(params: {
7677}): Promise<CodexAppServerThreadLifecycleBinding> {
7778const dynamicToolsFingerprint = fingerprintDynamicTools(params.dynamicTools);
7879const contextEngineBinding = buildContextEngineBinding(params.params);
80+const userMcpServersConfigPatch = buildCodexUserMcpServersThreadConfigPatch(params.params.config);
81+const userMcpServersFingerprint = fingerprintUserMcpServersConfigPatch(userMcpServersConfigPatch);
7982let binding = await readCodexAppServerBinding(params.params.sessionFile, {
8083authProfileStore: params.params.authProfileStore,
8184agentDir: params.params.agentDir,
@@ -102,6 +105,13 @@ export async function startOrResumeThread(params: {
102105rotatedContextEngineBinding = true;
103106}
104107}
108+if (binding?.threadId && binding.userMcpServersFingerprint !== userMcpServersFingerprint) {
109+embeddedAgentLog.debug("codex app-server user MCP config changed; starting a new thread", {
110+threadId: binding.threadId,
111+});
112+await clearCodexAppServerBinding(params.params.sessionFile);
113+binding = undefined;
114+}
105115if (binding?.threadId) {
106116let pluginBindingStale = isCodexPluginThreadBindingStale({
107117codexPluginsEnabled: params.pluginThreadConfig?.enabled ?? false,
@@ -198,6 +208,7 @@ export async function startOrResumeThread(params: {
198208model: params.params.modelId,
199209modelProvider: response.modelProvider ?? fallbackModelProvider,
200210 dynamicToolsFingerprint,
211+ userMcpServersFingerprint,
201212pluginAppsFingerprint: binding.pluginAppsFingerprint,
202213pluginAppsInputFingerprint: binding.pluginAppsInputFingerprint,
203214pluginAppPolicyContext: binding.pluginAppPolicyContext,
@@ -218,6 +229,7 @@ export async function startOrResumeThread(params: {
218229model: params.params.modelId,
219230modelProvider: response.modelProvider ?? fallbackModelProvider,
220231 dynamicToolsFingerprint,
232+ userMcpServersFingerprint,
221233pluginAppsFingerprint: binding.pluginAppsFingerprint,
222234pluginAppsInputFingerprint: binding.pluginAppsInputFingerprint,
223235pluginAppPolicyContext: binding.pluginAppPolicyContext,
@@ -239,7 +251,11 @@ export async function startOrResumeThread(params: {
239251const pluginThreadConfig = params.pluginThreadConfig?.enabled
240252 ? (prebuiltPluginThreadConfig ?? (await params.pluginThreadConfig.build()))
241253 : undefined;
242-const config = mergeCodexThreadConfigs(params.config, pluginThreadConfig?.configPatch);
254+const config = mergeCodexThreadConfigs(
255+params.config,
256+userMcpServersConfigPatch,
257+pluginThreadConfig?.configPatch,
258+);
243259const response = assertCodexThreadStartResponse(
244260await params.client.request(
245261"thread/start",
@@ -270,6 +286,7 @@ export async function startOrResumeThread(params: {
270286model: response.model ?? params.params.modelId,
271287modelProvider: response.modelProvider ?? modelProvider,
272288 dynamicToolsFingerprint,
289+ userMcpServersFingerprint,
273290pluginAppsFingerprint: pluginThreadConfig?.fingerprint,
274291pluginAppsInputFingerprint: pluginThreadConfig?.inputFingerprint,
275292pluginAppPolicyContext: pluginThreadConfig?.policyContext,
@@ -292,6 +309,7 @@ export async function startOrResumeThread(params: {
292309model: response.model ?? params.params.modelId,
293310modelProvider: response.modelProvider ?? modelProvider,
294311 dynamicToolsFingerprint,
312+ userMcpServersFingerprint,
295313pluginAppsFingerprint: pluginThreadConfig?.fingerprint,
296314pluginAppsInputFingerprint: pluginThreadConfig?.inputFingerprint,
297315pluginAppPolicyContext: pluginThreadConfig?.policyContext,
@@ -530,6 +548,12 @@ function fingerprintDynamicTools(dynamicTools: CodexDynamicToolSpec[]): string {
530548);
531549}
532550551+function fingerprintUserMcpServersConfigPatch(
552+configPatch: JsonObject | undefined,
553+): string | undefined {
554+return configPatch ? JSON.stringify(stabilizeJsonValue(configPatch)) : undefined;
555+}
556+533557function fingerprintDynamicToolSpec(tool: JsonValue): JsonValue {
534558if (!isJsonObject(tool)) {
535559return stabilizeJsonValue(tool);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。