@openclaw/codex 2026.7.1-beta.4 → 2026.7.1-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,9 +2,9 @@ import { n as flattenCodexDynamicToolFunctions, r as isJsonObject } from "./prot
2
2
  import { h as resolveCodexPluginsPolicy, i as codexSandboxPolicyForTurn, t as CODEX_PLUGINS_MARKETPLACE_NAME } from "./config-CYEDnLJ2.js";
3
3
  import { n as assertCodexThreadResumeResponse, r as assertCodexThreadStartResponse } from "./protocol-validators-dZQ-UTOa.js";
4
4
  import { CODEX_GPT5_HEARTBEAT_PROMPT_OVERLAY } from "./prompt-overlay.js";
5
- import { a as readCodexSupportedReasoningEfforts, i as isModernCodexModel, o as resolveCodexFallbackReasoningEfforts, r as isMaxReasoningCodexModel, s as resolveCodexSupportedReasoningEffort } from "./provider-cc_62eQE.js";
5
+ import { a as readCodexSupportedReasoningEfforts, i as isModernCodexModel, o as resolveCodexFallbackReasoningEfforts, r as isMaxReasoningCodexModel, s as resolveCodexSupportedReasoningEffort } from "./provider-zjPfx5Fs.js";
6
6
  import { f as isCodexAppServerConnectionClosedError, n as clearSharedCodexAppServerClientIfCurrentAndUnclaimed, s as retireSharedCodexAppServerClientIfCurrent, t as clearSharedCodexAppServerClientIfCurrent, u as CodexAppServerRpcError } from "./shared-client-4ICy3U6d.js";
7
- import { a as reclaimCurrentCodexSessionGeneration, i as normalizeCodexAppServerBindingModelProvider, o as sessionBindingIdentity, r as isCodexAppServerNativeAuthProfile } from "./session-binding-Dc03iwRF.js";
7
+ import { a as normalizeCodexAppServerBindingModelProvider, i as isCodexAppServerNativeAuthProfile, o as reclaimCurrentCodexSessionGeneration, r as hashCodexAppServerBindingFingerprint, s as sessionBindingIdentity } from "./session-binding-C1ZXdP-x.js";
8
8
  import "node:fs/promises";
9
9
  import "node:path";
10
10
  import { isFutureDateTimestampMs, resolveDateTimestampMs, resolveExpiresAtMsFromDurationMs } from "openclaw/plugin-sdk/number-runtime";
@@ -1684,7 +1684,8 @@ async function startOrResumeThread(params) {
1684
1684
  ...params.timing,
1685
1685
  enabled: params.timing?.enabled ?? isCodexAppServerProfilerEnabled(params.params.config)
1686
1686
  });
1687
- const dynamicToolsFingerprint = lifecycleTiming.measureSync("dynamic-tools-fingerprint", () => fingerprintDynamicTools(params.dynamicTools));
1687
+ const legacyDynamicToolsFingerprint = lifecycleTiming.measureSync("legacy-dynamic-tools-fingerprint", () => legacyFingerprintDynamicTools(params.dynamicTools));
1688
+ const dynamicToolsFingerprint = lifecycleTiming.measureSync("dynamic-tools-fingerprint", () => hashCodexAppServerBindingFingerprint(legacyDynamicToolsFingerprint));
1688
1689
  const dynamicToolsContainDeferred = flattenCodexDynamicToolFunctions(params.dynamicTools).some((tool) => tool.deferLoading === true);
1689
1690
  const webSearchThreadConfigFingerprint = fingerprintJsonObject(lifecycleTiming.measureSync("web-search-plan", () => resolveCodexWebSearchPlan({
1690
1691
  config: params.params.config,
@@ -1696,6 +1697,7 @@ async function startOrResumeThread(params) {
1696
1697
  const networkProxyConfigFingerprint = params.appServer.networkProxy?.configFingerprint;
1697
1698
  const contextEngineBinding = lifecycleTiming.measureSync("context-engine-binding", () => buildContextEngineBinding(params.params, params.contextEngineProjection));
1698
1699
  const userMcpServersConfigPatch = params.userMcpServersEnabled === false ? void 0 : buildCodexUserMcpServersThreadConfigPatch(params.params.config, { agentId: params.agentId ?? params.params.agentId });
1700
+ const legacyUserMcpServersFingerprint = legacyFingerprintUserMcpServersConfigPatch(userMcpServersConfigPatch);
1699
1701
  const userMcpServersFingerprint = fingerprintUserMcpServersConfigPatch(userMcpServersConfigPatch);
1700
1702
  const environmentSelectionFingerprint = fingerprintEnvironmentSelection(params.environmentSelection);
1701
1703
  let binding = await lifecycleTiming.measure("read-binding", () => params.bindingStore.read(bindingIdentity));
@@ -1734,6 +1736,18 @@ async function startOrResumeThread(params) {
1734
1736
  await clearCurrentBinding("rotating a stale thread binding");
1735
1737
  binding = void 0;
1736
1738
  }
1739
+ if (binding?.threadId && shouldRotateCodexGpt56MultiAgentBinding({
1740
+ bindingModel: binding.model,
1741
+ requestedModel: params.params.modelId
1742
+ })) {
1743
+ embeddedAgentLog.debug("codex app-server GPT-5.6 multi-agent version changed; starting a new thread", {
1744
+ threadId: binding.threadId,
1745
+ bindingModel: binding.model,
1746
+ requestedModel: params.params.modelId
1747
+ });
1748
+ await clearCurrentBinding("rotating a GPT-5.6 multi-agent thread binding");
1749
+ binding = void 0;
1750
+ }
1737
1751
  const startModelSelection = resolveCodexAppServerThreadModelSelection({
1738
1752
  provider: params.params.provider,
1739
1753
  model: params.params.modelId,
@@ -1805,7 +1819,11 @@ async function startOrResumeThread(params) {
1805
1819
  rotatedContextEngineBinding = true;
1806
1820
  }
1807
1821
  }
1808
- if (binding?.threadId && binding.userMcpServersFingerprint !== userMcpServersFingerprint) {
1822
+ if (binding?.threadId && !areUserMcpServersFingerprintsCompatible({
1823
+ previous: binding.userMcpServersFingerprint,
1824
+ next: userMcpServersFingerprint,
1825
+ nextLegacy: legacyUserMcpServersFingerprint
1826
+ })) {
1809
1827
  embeddedAgentLog.debug("codex app-server user MCP config changed; starting a new thread", { threadId: binding.threadId });
1810
1828
  await clearCurrentBinding("rotating a stale thread binding");
1811
1829
  binding = void 0;
@@ -1853,10 +1871,10 @@ async function startOrResumeThread(params) {
1853
1871
  binding = void 0;
1854
1872
  }
1855
1873
  }
1856
- if (binding?.threadId) if (binding.dynamicToolsFingerprint && !areDynamicToolFingerprintsCompatible(binding.dynamicToolsFingerprint, dynamicToolsFingerprint)) {
1874
+ if (binding?.threadId) if (binding.dynamicToolsFingerprint && !areDynamicToolFingerprintsCompatible(binding.dynamicToolsFingerprint, dynamicToolsFingerprint, legacyDynamicToolsFingerprint)) {
1857
1875
  preserveExistingBinding = shouldStartTransientNoToolThread({
1858
1876
  previous: binding.dynamicToolsFingerprint,
1859
- next: dynamicToolsFingerprint
1877
+ nextHasDynamicTools: params.dynamicTools.length > 0
1860
1878
  });
1861
1879
  if (preserveExistingBinding) embeddedAgentLog.debug("codex app-server dynamic tools unavailable for turn; starting transient thread", { threadId: binding.threadId });
1862
1880
  else {
@@ -2081,6 +2099,23 @@ function shouldRotateCodexAppServerBindingForRuntime(params) {
2081
2099
  if (params.binding === params.current) return false;
2082
2100
  return params.connectionClass === "remote" || Boolean(params.binding);
2083
2101
  }
2102
+ function resolveCodexGpt56MultiAgentVersion(modelRef) {
2103
+ let modelId = modelRef?.trim().toLowerCase();
2104
+ if (!modelId) return;
2105
+ const slashIndex = modelId.indexOf("/");
2106
+ if (slashIndex > 0) {
2107
+ const provider = modelId.slice(0, slashIndex);
2108
+ if (provider !== "openai" && provider !== "codex") return;
2109
+ modelId = modelId.slice(slashIndex + 1);
2110
+ }
2111
+ if (modelId === "gpt-5.6-sol" || modelId === "gpt-5.6-terra") return "v2";
2112
+ return modelId === "gpt-5.6-luna" ? "v1" : void 0;
2113
+ }
2114
+ function shouldRotateCodexGpt56MultiAgentBinding(params) {
2115
+ const bindingVersion = resolveCodexGpt56MultiAgentVersion(params.bindingModel);
2116
+ const requestedVersion = resolveCodexGpt56MultiAgentVersion(params.requestedModel);
2117
+ return Boolean(bindingVersion && requestedVersion && bindingVersion !== requestedVersion);
2118
+ }
2084
2119
  function isTransientWebSearchRestriction(params) {
2085
2120
  if (params.nativeProviderWebSearchSupport === "unknown") return true;
2086
2121
  if (params.params.config?.tools?.web?.search?.enabled === false) return false;
@@ -2416,15 +2451,24 @@ function joinPresentSections(...sections) {
2416
2451
  function codexDynamicToolsFingerprint(dynamicTools) {
2417
2452
  return fingerprintDynamicTools(dynamicTools);
2418
2453
  }
2454
+ function codexLegacyDynamicToolsFingerprint(dynamicTools) {
2455
+ return legacyFingerprintDynamicTools(dynamicTools);
2456
+ }
2419
2457
  function areCodexDynamicToolFingerprintsCompatible(params) {
2420
- return areDynamicToolFingerprintsCompatible(params.previous, params.next);
2458
+ return areDynamicToolFingerprintsCompatible(params.previous, params.next, params.nextLegacy);
2421
2459
  }
2422
2460
  function fingerprintDynamicTools(dynamicTools) {
2461
+ return hashCodexAppServerBindingFingerprint(legacyFingerprintDynamicTools(dynamicTools));
2462
+ }
2463
+ function legacyFingerprintDynamicTools(dynamicTools) {
2423
2464
  return JSON.stringify(dynamicTools.map(fingerprintDynamicToolSpec).toSorted(compareJsonFingerprint));
2424
2465
  }
2425
- function fingerprintUserMcpServersConfigPatch(configPatch) {
2466
+ function legacyFingerprintUserMcpServersConfigPatch(configPatch) {
2426
2467
  return configPatch ? JSON.stringify(stabilizeJsonValue(configPatch)) : void 0;
2427
2468
  }
2469
+ function fingerprintUserMcpServersConfigPatch(configPatch) {
2470
+ return configPatch ? hashCodexAppServerBindingFingerprint(JSON.stringify(stabilizeJsonValue(configPatch))) : void 0;
2471
+ }
2428
2472
  function fingerprintJsonObject(value) {
2429
2473
  return JSON.stringify(stabilizeJsonValue(value));
2430
2474
  }
@@ -2454,12 +2498,19 @@ function stabilizeJsonValue(value) {
2454
2498
  function readActiveCodexTurnIds(thread) {
2455
2499
  return (thread.turns ?? []).filter((turn) => turn.status === "inProgress").map((turn) => typeof turn.id === "string" ? turn.id : "").filter((turnId) => turnId.trim().length > 0);
2456
2500
  }
2457
- const EMPTY_DYNAMIC_TOOLS_FINGERPRINT = JSON.stringify([]);
2458
- function areDynamicToolFingerprintsCompatible(previous, next) {
2459
- return !previous || previous === next;
2501
+ const LEGACY_EMPTY_DYNAMIC_TOOLS_FINGERPRINT = legacyFingerprintDynamicTools([]);
2502
+ const EMPTY_DYNAMIC_TOOLS_FINGERPRINT = hashCodexAppServerBindingFingerprint(LEGACY_EMPTY_DYNAMIC_TOOLS_FINGERPRINT);
2503
+ function areDynamicToolFingerprintsCompatible(previous, next, nextLegacy) {
2504
+ return !previous || previous === next || previous === nextLegacy;
2505
+ }
2506
+ function areUserMcpServersFingerprintsCompatible(params) {
2507
+ return params.previous === params.next || params.previous === params.nextLegacy || params.nextLegacy !== void 0 && params.previous === hashCodexAppServerBindingFingerprint(params.nextLegacy);
2460
2508
  }
2461
2509
  function shouldStartTransientNoToolThread(params) {
2462
- return Boolean(params.previous && params.previous !== EMPTY_DYNAMIC_TOOLS_FINGERPRINT && params.next === EMPTY_DYNAMIC_TOOLS_FINGERPRINT);
2510
+ return Boolean(params.previous && !isEmptyDynamicToolsFingerprint(params.previous) && !params.nextHasDynamicTools);
2511
+ }
2512
+ function isEmptyDynamicToolsFingerprint(fingerprint) {
2513
+ return fingerprint === EMPTY_DYNAMIC_TOOLS_FINGERPRINT || fingerprint === LEGACY_EMPTY_DYNAMIC_TOOLS_FINGERPRINT;
2463
2514
  }
2464
2515
  function compareJsonFingerprint(left, right) {
2465
2516
  return JSON.stringify(left).localeCompare(JSON.stringify(right));
@@ -2536,4 +2587,4 @@ function resolveReasoningEffort(thinkLevel, modelId, supportedReasoningEfforts)
2536
2587
  return null;
2537
2588
  }
2538
2589
  //#endregion
2539
- export { resolveCodexContextEngineProjectionReserveTokens as A, buildCodexPluginThreadConfigInputFingerprint as B, isForcedPrivateQaCodexRuntime as C, fitCodexProjectedContextForTurnStart as D, resolveCodexDynamicToolsLoadingForRuntime as E, interruptCodexTurnBestEffort as F, buildCodexAppInventoryCacheKey as G, shouldBuildCodexPluginThreadConfig as H, retireCodexAppServerClientAfterTimedOutTurn as I, defaultCodexAppInventoryCache as K, unsubscribeCodexThreadBestEffort as L, CODEX_APP_SERVER_UNSUBSCRIBE_TIMEOUT_MS as M, CodexAppServerUnsafeSubscriptionError as N, projectContextEngineAssemblyForCodex as O, closeCodexStartupClientBestEffort as P, buildCodexPluginAppsConfigPatchFromPolicyContext as R, filterCodexDynamicTools as S, resolveCodexDynamicToolsLoading as T, ensureCodexPluginActivation as U, mergeCodexThreadConfigs as V, pluginReadParams as W, resolveCodexWebSearchPlan as _, buildDeveloperInstructions as a, sanitizeCodexHistoryImagePayloads as b, codexDynamicToolsFingerprint as c, resolveCodexAppServerRequestModelSelection as d, resolveCodexAppServerThreadModelSelection as f, buildCodexNativeWebSearchThreadConfig as g, startOrResumeThread as h, buildContextEngineBinding as i, CODEX_APP_SERVER_INTERRUPT_TIMEOUT_MS as j, resolveCodexContextEngineProjectionMaxChars as k, isContextEngineBindingCompatible as l, resolveReasoningEffort as m, areCodexDynamicToolFingerprintsCompatible as n, buildTurnCollaborationMode as o, resolveCodexBindingModelProviderFallback as p, buildCodexRuntimeThreadConfig as r, buildTurnStartParams as s, CODEX_NATIVE_PERSONALITY_NONE as t, resolveCodexAppServerModelProvider as u, isCodexAppServerProfilerEnabled as v, normalizeCodexDynamicToolName as w, sanitizeInlineImageDataUrl$1 as x, invalidInlineImageText as y, buildCodexPluginThreadConfig as z };
2590
+ export { resolveCodexContextEngineProjectionMaxChars as A, buildCodexPluginThreadConfig as B, filterCodexDynamicTools as C, resolveCodexDynamicToolsLoadingForRuntime as D, resolveCodexDynamicToolsLoading as E, closeCodexStartupClientBestEffort as F, pluginReadParams as G, mergeCodexThreadConfigs as H, interruptCodexTurnBestEffort as I, buildCodexAppInventoryCacheKey as K, retireCodexAppServerClientAfterTimedOutTurn as L, CODEX_APP_SERVER_INTERRUPT_TIMEOUT_MS as M, CODEX_APP_SERVER_UNSUBSCRIBE_TIMEOUT_MS as N, fitCodexProjectedContextForTurnStart as O, CodexAppServerUnsafeSubscriptionError as P, unsubscribeCodexThreadBestEffort as R, sanitizeInlineImageDataUrl$1 as S, normalizeCodexDynamicToolName as T, shouldBuildCodexPluginThreadConfig as U, buildCodexPluginThreadConfigInputFingerprint as V, ensureCodexPluginActivation as W, buildCodexNativeWebSearchThreadConfig as _, buildDeveloperInstructions as a, invalidInlineImageText as b, codexDynamicToolsFingerprint as c, resolveCodexAppServerModelProvider as d, resolveCodexAppServerRequestModelSelection as f, startOrResumeThread as g, resolveReasoningEffort as h, buildContextEngineBinding as i, resolveCodexContextEngineProjectionReserveTokens as j, projectContextEngineAssemblyForCodex as k, codexLegacyDynamicToolsFingerprint as l, resolveCodexBindingModelProviderFallback as m, areCodexDynamicToolFingerprintsCompatible as n, buildTurnCollaborationMode as o, resolveCodexAppServerThreadModelSelection as p, defaultCodexAppInventoryCache as q, buildCodexRuntimeThreadConfig as r, buildTurnStartParams as s, CODEX_NATIVE_PERSONALITY_NONE as t, isContextEngineBindingCompatible as u, resolveCodexWebSearchPlan as v, isForcedPrivateQaCodexRuntime as w, sanitizeCodexHistoryImagePayloads as x, isCodexAppServerProfilerEnabled as y, buildCodexPluginAppsConfigPatchFromPolicyContext as z };
@@ -1,6 +1,6 @@
1
1
  import { r as isJsonObject } from "./protocol-2POPqAY4.js";
2
- import { g as buildCodexNativeWebSearchThreadConfig } from "./thread-lifecycle-BskXnNP-.js";
3
- import { n as runBoundedCodexAppServerTurn } from "./media-understanding-provider-DgqRvU2_.js";
2
+ import { _ as buildCodexNativeWebSearchThreadConfig } from "./thread-lifecycle-qWE88Dn2.js";
3
+ import { n as runBoundedCodexAppServerTurn } from "./media-understanding-provider-BHOu9-Gg.js";
4
4
  import { readStringParam, resolveSearchTimeoutSeconds, wrapWebContent } from "openclaw/plugin-sdk/provider-web-search";
5
5
  //#region extensions/codex/src/web-search-provider.runtime.ts
6
6
  async function executeCodexWebSearchProviderTool(ctx, args, executionContext, options) {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@openclaw/codex",
3
- "version": "2026.7.1-beta.4",
3
+ "version": "2026.7.1-beta.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@openclaw/codex",
9
- "version": "2026.7.1-beta.4",
9
+ "version": "2026.7.1-beta.6",
10
10
  "dependencies": {
11
11
  "@openai/codex": "0.144.1",
12
12
  "typebox": "1.3.3",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/codex",
3
- "version": "2026.7.1-beta.4",
3
+ "version": "2026.7.1-beta.6",
4
4
  "description": "OpenClaw Codex app-server harness and model provider plugin with a Codex-managed GPT catalog.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -34,10 +34,10 @@
34
34
  ]
35
35
  },
36
36
  "compat": {
37
- "pluginApi": ">=2026.7.1-beta.4"
37
+ "pluginApi": ">=2026.7.1-beta.6"
38
38
  },
39
39
  "build": {
40
- "openclawVersion": "2026.7.1-beta.4"
40
+ "openclawVersion": "2026.7.1-beta.6"
41
41
  },
42
42
  "release": {
43
43
  "publishToClawHub": true,
@@ -58,7 +58,7 @@
58
58
  "README.md"
59
59
  ],
60
60
  "peerDependencies": {
61
- "openclaw": ">=2026.7.1-beta.4"
61
+ "openclaw": ">=2026.7.1-beta.6"
62
62
  },
63
63
  "peerDependenciesMeta": {
64
64
  "openclaw": {