

























@@ -73,6 +73,8 @@ export async function startOrResumeThread(params: {
7373appServer: CodexAppServerRuntimeOptions;
7474developerInstructions?: string;
7575config?: JsonObject;
76+mcpServersFingerprint?: string;
77+mcpServersFingerprintEvaluated?: boolean;
7678pluginThreadConfig?: CodexPluginThreadConfigProvider;
7779}): Promise<CodexAppServerThreadLifecycleBinding> {
7880const dynamicToolsFingerprint = fingerprintDynamicTools(params.dynamicTools);
@@ -112,6 +114,17 @@ export async function startOrResumeThread(params: {
112114await clearCodexAppServerBinding(params.params.sessionFile);
113115binding = 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+}
115128if (binding?.threadId) {
116129let pluginBindingStale = isCodexPluginThreadBindingStale({
117130codexPluginsEnabled: params.pluginThreadConfig?.enabled ?? false,
@@ -146,6 +159,17 @@ export async function startOrResumeThread(params: {
146159binding = 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+}
149173if (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 {
180204try {
181205const authProfileId = params.params.authProfileId ?? binding.authProfileId;
206+const resumeConfig = mergeCodexThreadConfigs(params.config, userMcpServersConfigPatch);
182207const response = assertCodexThreadResumeResponse(
183208await params.client.request(
184209"thread/resume",
@@ -187,7 +212,7 @@ export async function startOrResumeThread(params: {
187212 authProfileId,
188213appServer: params.appServer,
189214developerInstructions: params.developerInstructions,
190-config: params.config,
215+config: resumeConfig,
191216}),
192217),
193218);
@@ -199,6 +224,10 @@ export async function startOrResumeThread(params: {
199224agentDir: params.params.agentDir,
200225config: params.params.config,
201226});
227+const nextMcpServersFingerprint =
228+params.mcpServersFingerprintEvaluated === true
229+ ? params.mcpServersFingerprint
230+ : binding.mcpServersFingerprint;
202231await writeCodexAppServerBinding(
203232params.params.sessionFile,
204233{
@@ -209,6 +238,7 @@ export async function startOrResumeThread(params: {
209238modelProvider: response.modelProvider ?? fallbackModelProvider,
210239 dynamicToolsFingerprint,
211240 userMcpServersFingerprint,
241+mcpServersFingerprint: nextMcpServersFingerprint,
212242pluginAppsFingerprint: binding.pluginAppsFingerprint,
213243pluginAppsInputFingerprint: binding.pluginAppsInputFingerprint,
214244pluginAppPolicyContext: binding.pluginAppPolicyContext,
@@ -230,6 +260,7 @@ export async function startOrResumeThread(params: {
230260modelProvider: response.modelProvider ?? fallbackModelProvider,
231261 dynamicToolsFingerprint,
232262 userMcpServersFingerprint,
263+mcpServersFingerprint: nextMcpServersFingerprint,
233264pluginAppsFingerprint: binding.pluginAppsFingerprint,
234265pluginAppsInputFingerprint: binding.pluginAppsInputFingerprint,
235266pluginAppPolicyContext: binding.pluginAppPolicyContext,
@@ -276,6 +307,8 @@ export async function startOrResumeThread(params: {
276307config: params.params.config,
277308});
278309const createdAt = new Date().toISOString();
310+const nextMcpServersFingerprint =
311+params.mcpServersFingerprintEvaluated === true ? params.mcpServersFingerprint : undefined;
279312if (!preserveExistingBinding) {
280313await writeCodexAppServerBinding(
281314params.params.sessionFile,
@@ -287,6 +320,7 @@ export async function startOrResumeThread(params: {
287320modelProvider: response.modelProvider ?? modelProvider,
288321 dynamicToolsFingerprint,
289322 userMcpServersFingerprint,
323+mcpServersFingerprint: nextMcpServersFingerprint,
290324pluginAppsFingerprint: pluginThreadConfig?.fingerprint,
291325pluginAppsInputFingerprint: pluginThreadConfig?.inputFingerprint,
292326pluginAppPolicyContext: pluginThreadConfig?.policyContext,
@@ -310,6 +344,7 @@ export async function startOrResumeThread(params: {
310344modelProvider: response.modelProvider ?? modelProvider,
311345 dynamicToolsFingerprint,
312346 userMcpServersFingerprint,
347+mcpServersFingerprint: nextMcpServersFingerprint,
313348pluginAppsFingerprint: pluginThreadConfig?.fingerprint,
314349pluginAppsInputFingerprint: pluginThreadConfig?.inputFingerprint,
315350pluginAppPolicyContext: pluginThreadConfig?.policyContext,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。