@openclaw/codex 2026.8.1-beta.2 → 2026.8.1-beta.3

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.
Files changed (59) hide show
  1. package/dist/api.js +147 -0
  2. package/dist/app-server-policy-bg5QPSVP.js +25 -0
  3. package/dist/{attempt-client-cleanup-DMLXUfa8.js → attempt-client-cleanup-URjUlCHg.js} +1 -1
  4. package/dist/{binding-connection-I5Bo-AsX.js → binding-connection-DAvZwp96.js} +15 -3
  5. package/dist/{bounded-turn-qgZmzy_4.js → bounded-turn-4BjrZEwW.js} +22 -16
  6. package/dist/{capabilities-CybGI1oz.js → capabilities-CH3K57v4.js} +1 -1
  7. package/dist/cli-metadata.js +1 -1
  8. package/dist/{command-formatters-B1AEz8ZA.js → command-formatters-D0nZ3qtd.js} +2 -2
  9. package/dist/{command-handlers-Db8pu_ds.js → command-handlers-DC86lgT4.js} +39 -22
  10. package/dist/command-rpc-xUIIonsO.js +90 -0
  11. package/dist/{compact-LspQaGfl.js → compact-COqgBRny.js} +35 -29
  12. package/dist/{session-binding-DPxIvMgE.js → config-CpNeo5AE.js} +28 -888
  13. package/dist/context-compaction-activity-BOeJf7yo.js +58 -0
  14. package/dist/doctor-contract-api.js +15 -14
  15. package/dist/{dynamic-tools-BVdyWkUD.js → dynamic-tools-fJZhl4CE.js} +1284 -651
  16. package/dist/{effective-mcp-catalog-DIIhAtOZ.js → effective-mcp-catalog-4YKn51aG.js} +2 -2
  17. package/dist/elicitation-input-DMkeki8d.js +71 -0
  18. package/dist/{event-projector-usage-e5huIQWu.js → event-projector-usage-CLwNEJqW.js} +16 -16
  19. package/dist/harness-DoKQcF8n.js +258 -0
  20. package/dist/harness.js +2 -226
  21. package/dist/index.js +171 -48
  22. package/dist/{isolated-completion-C58NbL40.js → isolated-completion-DPMtlH9r.js} +3 -3
  23. package/dist/managed-binary-By4FZC6i.js +212 -0
  24. package/dist/media-understanding-provider.js +2 -2
  25. package/dist/model-catalog-CmGoqVKB.js +48 -0
  26. package/dist/{models-BFlpn1Ex.js → models-CZw1wClT.js} +2 -2
  27. package/dist/{native-subagent-monitor-DyTGmTUx.js → native-subagent-monitor-GGq3RnOo.js} +185 -71
  28. package/dist/node-exec-server.runtime-Bsu1LdFZ.js +192 -0
  29. package/dist/{plugin-app-cache-key-C3H2CVp6.js → plugin-app-cache-key-DMNQ8Zi8.js} +15 -3
  30. package/dist/plugin-approval-roundtrip-C75Yiiwc.js +95 -0
  31. package/dist/{plugin-marketplace-discovery-CzrGJdCR.js → plugin-marketplace-discovery-CSWDkMrP.js} +40 -26
  32. package/dist/{plugin-metadata-cache-CNJPj4_b.js → plugin-metadata-cache-BXH5NF-4.js} +8 -5
  33. package/dist/{protocol-validators-B4F7L8Rf.js → protocol-validators-VAVyEnDp.js} +55 -2
  34. package/dist/{rate-limits-DZXmOL8-.js → rate-limits-BI1dMHDG.js} +1 -1
  35. package/dist/{request-BRl5_UfX.js → request-DSK0W6YI.js} +2 -2
  36. package/dist/{run-attempt-P8BdxC1I.js → run-attempt-BV3HzuCf.js} +1098 -666
  37. package/dist/{runtime-artifact-BVSPdd6g.js → runtime-artifact-BvyT1uyd.js} +4 -7
  38. package/dist/{sandbox-guard-Cmwc9eIk.js → sandbox-guard-C1qEeZ5C.js} +25 -19
  39. package/dist/session-binding-BTrLf9Qm.js +874 -0
  40. package/dist/{session-catalog-xwNi_SDM.js → session-catalog-ezP_UcRM.js} +1541 -1296
  41. package/dist/session-catalog-home-id-BNwAJ9D7.js +18 -0
  42. package/dist/{session-cli-7hgXZDV7.js → session-cli-B1hKvfkI.js} +20 -7
  43. package/dist/{session-retirement-DoMMJFKm.js → session-retirement-CE4iMiLh.js} +3 -3
  44. package/dist/{session-upstream-marker-CrIFX06J.js → session-upstream-marker-D_2npHlA.js} +1 -1
  45. package/dist/{settled-turn-finalizer-BRWBO4MO.js → settled-turn-finalizer-Dx1onIqg.js} +23 -19
  46. package/dist/{shared-client-kIBbGjk4.js → shared-client-Dw-rzii0.js} +755 -273
  47. package/dist/{side-question-9HAL26l9.js → side-question-DbXkJZzg.js} +52 -30
  48. package/dist/{thread-lifecycle-Bu1BTDXr.js → thread-lifecycle-DKdrnTMX.js} +310 -92
  49. package/dist/{thread-ownership-6kOQHlyC.js → thread-ownership-i2NBwDUL.js} +2 -2
  50. package/dist/{thread-resume-CPrJNQVM.js → thread-resume-CdJk2Ehf.js} +3 -3
  51. package/dist/{transcript-mirror-B9gGgnJS.js → transcript-mirror-BU0_LKAL.js} +46 -28
  52. package/dist/{transport-stdio-DIImwDVS.js → transport-stdio-DhoGy33Z.js} +2 -2
  53. package/dist/{upstream-prompt-provenance-ClRBije0.js → upstream-prompt-provenance-CFmsKwr9.js} +12 -14
  54. package/dist/{upstream-session-fork-CE-_LdnP.js → upstream-session-fork-BDVJCLAD.js} +12 -6
  55. package/dist/{usage-CHlV0e-o.js → usage-9dKJCgcy.js} +3 -3
  56. package/dist/{web-search-provider.runtime-DRw2Vl42.js → web-search-provider.runtime-DCdx4DGu.js} +3 -3
  57. package/openclaw.plugin.json +31 -1
  58. package/package.json +6 -5
  59. package/dist/app-server-policy-zcBDc1JU.js +0 -49
@@ -1,13 +1,14 @@
1
- import { C as isCodexRemoteExecPlacementSandbox, N as resolveOpenClawExecPolicyForCodexAppServer, T as readCodexPluginConfig, d as sessionBindingIdentity, h as resolveCodexAppServerHomeScope, j as resolveCodexModelBackedReviewerPolicyContext, k as canUseCodexModelBackedApprovalsReviewerForModel, w as isCodexSandboxExecServerEnabled, x as shouldAutoApproveCodexAppServerApprovals } from "./session-binding-DPxIvMgE.js";
2
- import { A as isCodexAppServerApprovalRequest, H as ensureCodexAppServerClientRuntime, N as isCodexAppServerIndeterminateRequestCancellationError, X as readRecentCodexRateLimits, a as getLeasedSharedCodexAppServerClient, c as releaseCodexAppServerClientLease, ct as isJsonObject, h as withLeasedCodexAppServerClientStartSelectionRetry, rt as resolveCodexAppServerPreparedAuthHandoff } from "./shared-client-kIBbGjk4.js";
3
- import { d as unsubscribeCodexThreadBestEffort, h as isCodexNotificationForTurn, s as isCodexAlreadyTerminalInterruptError, u as retireUnsafeCodexTurnClientBestEffort } from "./attempt-client-cleanup-DMLXUfa8.js";
4
- import { l as readCodexTurn, o as assertCodexTurnStartResponse, r as assertCodexThreadForkResponse, s as readCodexDynamicToolCallParams } from "./protocol-validators-B4F7L8Rf.js";
5
- import { R as buildCodexPluginAppsConfigPatchFromPolicyContext, W as mergeCodexThreadConfigs, b as readCodexSupportedReasoningEfforts, f as resolveCodexWebSearchPlan, g as resolveCodexAppServerRequestModelSelection, h as resolveCodexAppServerModelProvider, k as resolveCodexDynamicToolsLoading, l as buildCodexRuntimeThreadConfig, m as CODEX_NATIVE_PERSONALITY_NONE, v as resolveCodexBindingModelProviderFallback, w as filterCodexDynamicTools, y as resolveReasoningEffort } from "./thread-lifecycle-Bu1BTDXr.js";
6
- import { n as formatCodexUsageLimitErrorMessage } from "./rate-limits-DZXmOL8-.js";
7
- import { t as resolveCodexAppServerForModelProvider } from "./app-server-policy-zcBDc1JU.js";
8
- import { n as resolveCodexNativeExecutionBlock } from "./sandbox-guard-Cmwc9eIk.js";
9
- import { n as resolveCodexBindingAppServerConnection, t as requireCodexSupervisionModelSelection } from "./binding-connection-I5Bo-AsX.js";
10
- import { A as buildCodexNativeHookRelayDisabledConfig, B as resolveDynamicToolCallTimeoutMs, D as CODEX_NATIVE_HOOK_RELAY_EVENTS, E as CodexNativeToolLifecycleProjector, I as handleDynamicToolCallWithTimeout, K as resolveCodexToolAbortTerminalReason, M as emitCodexNativePreToolUseFailureDiagnostic, S as shouldRequireCodexSandboxExecServerEnvironment, a as emitDynamicToolStartedDiagnostic, b as resolveCodexSandboxEnvironmentSelection, d as releaseCodexSandboxExecServerEnvironment, i as emitDynamicToolErrorDiagnostic, k as buildCodexNativeHookRelayConfig, l as resolveCodexProviderWebSearchSupportForClient, o as emitDynamicToolTerminalDiagnostic, r as handleCodexAppServerElicitationRequest, s as handleCodexAppServerApprovalRequest, t as createCodexDynamicToolBridge, u as ensureCodexSandboxExecServerEnvironment, v as resolveCodexExternalSandboxPolicyForOpenClawSandbox, w as filterToolsForVisionInputs, x as shouldEnableCodexAppServerNativeToolSurface, y as resolveCodexMessageToolProvider } from "./dynamic-tools-BVdyWkUD.js";
1
+ import { A as resolveOpenClawExecPolicyForCodexAppServer, S as resolveCodexModelBackedReviewerPolicyContext, b as canUseCodexModelBackedApprovalsReviewerForModel, f as isCodexPairedNodeRemoteExecPlacementSandbox, h as readCodexPluginConfig, m as isCodexSandboxExecServerEnabled, p as isCodexRemoteExecPlacementSandbox, r as resolveCodexAppServerHomeScope, u as shouldAutoApproveCodexAppServerApprovals } from "./config-CpNeo5AE.js";
2
+ import { A as isCodexAppServerApprovalRequest, N as isCodexAppServerIndeterminateRequestCancellationError, Q as readRecentCodexRateLimits, V as createCodexElicitationResponse, W as ensureCodexAppServerClientRuntime, a as getLeasedSharedCodexAppServerClient, at as resolveCodexAppServerPreparedAuthHandoff, c as releaseCodexAppServerClientLease, h as withLeasedCodexAppServerClientStartSelectionRetry, ut as isJsonObject } from "./shared-client-Dw-rzii0.js";
3
+ import { d as sessionBindingIdentity } from "./session-binding-BTrLf9Qm.js";
4
+ import { d as unsubscribeCodexThreadBestEffort, h as isCodexNotificationForTurn, s as isCodexAlreadyTerminalInterruptError, u as retireUnsafeCodexTurnClientBestEffort } from "./attempt-client-cleanup-URjUlCHg.js";
5
+ import { l as readCodexTurn, o as assertCodexTurnStartResponse, r as assertCodexThreadForkResponse, s as readCodexDynamicToolCallParams } from "./protocol-validators-VAVyEnDp.js";
6
+ import { G as buildCodexPluginAppsConfigPatchFromPolicyContext, O as filterCodexDynamicTools, P as resolveCodexDynamicToolsLoading, Z as mergeCodexThreadConfigs, _ as resolveCodexAppServerRequestModelSelection, b as resolveReasoningEffort, f as resolveCodexWebSearchPlan, g as resolveCodexAppServerModelProvider, h as CODEX_NATIVE_PERSONALITY_NONE, l as buildCodexRuntimeThreadConfig, x as readCodexSupportedReasoningEfforts, y as resolveCodexBindingModelProviderFallback } from "./thread-lifecycle-DKdrnTMX.js";
7
+ import { n as formatCodexUsageLimitErrorMessage } from "./rate-limits-BI1dMHDG.js";
8
+ import { t as resolveCodexAppServerForModelProvider } from "./app-server-policy-bg5QPSVP.js";
9
+ import { n as resolveCodexNativeExecutionBlock } from "./sandbox-guard-C1qEeZ5C.js";
10
+ import { n as resolveCodexBindingAppServerConnection, t as requireCodexSupervisionModelSelection } from "./binding-connection-DAvZwp96.js";
11
+ import { A as buildCodexNativeHookRelayConfig, C as shouldRequireCodexSandboxExecServerEnvironment, D as CodexNativeToolLifecycleProjector, L as handleDynamicToolCallWithTimeout, N as emitCodexNativePreToolUseFailureDiagnostic, O as CODEX_NATIVE_HOOK_RELAY_EVENTS, S as shouldEnableCodexAppServerNativeToolSurface, T as filterCodexVisionTools, V as resolveDynamicToolCallTimeoutMs, a as emitDynamicToolStartedDiagnostic, b as resolveCodexNodePlacementToolConstructionPlan, d as releaseCodexSandboxExecServerEnvironment, i as emitDynamicToolErrorDiagnostic, j as buildCodexNativeHookRelayDisabledConfig, l as resolveCodexProviderWebSearchSupportForClient, o as emitDynamicToolTerminalDiagnostic, q as resolveCodexToolAbortTerminalReason, r as routeCodexAppServerElicitationRequest, s as handleCodexAppServerApprovalRequest, t as createCodexDynamicToolBridge, u as ensureCodexSandboxExecServerEnvironment, v as resolveCodexExternalSandboxPolicyForOpenClawSandbox, x as resolveCodexSandboxEnvironmentSelection, y as resolveCodexMessageToolProvider } from "./dynamic-tools-fJZhl4CE.js";
11
12
  import { readStringField } from "openclaw/plugin-sdk/string-coerce-runtime";
12
13
  import { buildAgentHookContextChannelFields, embeddedAgentLog, formatErrorMessage, registerNativeHookRelay, resolveAgentDir, resolveAttemptSpawnWorkspaceDir, resolveModelAuthMode, resolveSandboxContext, resolveSessionAgentIds, supportsModelTools } from "openclaw/plugin-sdk/agent-harness-runtime";
13
14
  import { randomUUID } from "node:crypto";
@@ -56,6 +57,7 @@ async function runCodexAppServerSideQuestion(params, options) {
56
57
  config: params.cfg
57
58
  }));
58
59
  if (!binding?.threadId) throw new Error("Codex /btw needs an active Codex thread. Send a normal message first, then try /btw again.");
60
+ if (isCodexPairedNodeRemoteExecPlacementSandbox(params.sandbox)) throw new Error("Normal Codex turns are supported on paired devices, but /btw is not yet bound to the active placement.");
59
61
  const pluginConfig = readCodexPluginConfig(options.pluginConfig);
60
62
  const { sessionAgentId } = resolveSessionAgentIds({
61
63
  sessionKey: params.sessionKey,
@@ -99,7 +101,7 @@ async function runCodexAppServerSideQuestion(params, options) {
99
101
  bindingModelProvider: binding.modelProvider
100
102
  });
101
103
  const modelSelection = resolveCodexAppServerRequestModelSelection({
102
- model: supervisionModelSelection?.model ?? params.model,
104
+ model: supervisionModelSelection?.model ?? options.runtimeModelId ?? params.model,
103
105
  modelProvider,
104
106
  authProfileId,
105
107
  authProfileStore: preparedRuntimeAuth.authProfileStore,
@@ -152,7 +154,10 @@ async function runCodexAppServerSideQuestion(params, options) {
152
154
  timeoutMs: appServer.requestTimeoutMs
153
155
  });
154
156
  const sandboxExecServerEnabled = isCodexSandboxExecServerEnabled(pluginConfig, params.sandbox);
155
- const nativeToolSurfaceEnabled = shouldEnableCodexAppServerNativeToolSurface(sideRunParams, params.sandbox ?? void 0, { sandboxExecServerEnabled });
157
+ const nativeToolSurfaceEnabled = shouldEnableCodexAppServerNativeToolSurface(sideRunParams, params.sandbox ?? void 0, {
158
+ agentId: sideRunParams.agentId,
159
+ sandboxExecServerEnabled
160
+ });
156
161
  const sandboxEnvironmentRequired = shouldRequireCodexSandboxExecServerEnvironment({
157
162
  sandbox: params.sandbox ?? void 0,
158
163
  nativeToolSurfaceEnabled,
@@ -162,6 +167,7 @@ async function runCodexAppServerSideQuestion(params, options) {
162
167
  config: sideRunParams.config,
163
168
  sessionKey: sideRunParams.sandboxSessionKey?.trim() || sideRunParams.sessionKey,
164
169
  sessionId: sideRunParams.sessionId,
170
+ agentId: sideRunParams.agentId,
165
171
  sandbox: params.sandbox,
166
172
  sandboxEnvironmentSelected: sandboxEnvironmentRequired,
167
173
  surface: "/btw side-question mode"
@@ -230,9 +236,10 @@ async function runCodexAppServerSideQuestion(params, options) {
230
236
  const activeDynamicToolCalls = /* @__PURE__ */ new Set();
231
237
  const releaseSandboxEnvironment = async () => {
232
238
  if (!sandboxEnvironment) return;
239
+ const environment = sandboxEnvironment;
233
240
  sandboxEnvironment = void 0;
234
241
  sandboxEnvironmentClient = void 0;
235
- await releaseCodexSandboxExecServerEnvironment(params.sandbox);
242
+ await releaseCodexSandboxExecServerEnvironment(params.sandbox, environment);
236
243
  };
237
244
  const ensureSandboxEnvironment = async (targetClient) => {
238
245
  if (!sandboxEnvironmentRequired || sandboxEnvironmentClient === targetClient) return;
@@ -240,9 +247,15 @@ async function runCodexAppServerSideQuestion(params, options) {
240
247
  const environment = await ensureCodexSandboxExecServerEnvironment({
241
248
  client: targetClient,
242
249
  sandbox: params.sandbox ?? null,
250
+ runtime: options.runtime,
243
251
  appServerStartOptions: appServer.start,
244
252
  timeoutMs: appServer.requestTimeoutMs,
245
- signal: runAbortController.signal
253
+ signal: runAbortController.signal,
254
+ onExecutionDisconnect: (error) => {
255
+ collector.reject(error);
256
+ embeddedAgentLog.warn(error.message);
257
+ runAbortController.abort("client_closed");
258
+ }
246
259
  });
247
260
  if (!environment) throw new Error("Codex app-server did not register an OpenClaw sandbox exec-server environment.");
248
261
  sandboxEnvironment = environment;
@@ -295,14 +308,17 @@ async function runCodexAppServerSideQuestion(params, options) {
295
308
  });
296
309
  const registerRequestHandler = (targetClient) => targetClient.addRequestHandler(async (request) => {
297
310
  if (!childThreadId || !turnId) return;
298
- if (request.method === "mcpServer/elicitation/request") return handleCodexAppServerElicitationRequest({
299
- requestParams: request.params,
300
- paramsForRun: sideRunParams,
301
- threadId: childThreadId,
302
- turnId,
303
- pluginAppPolicyContext: binding.pluginAppPolicyContext,
304
- signal: runAbortController.signal
305
- });
311
+ if (request.method === "mcpServer/elicitation/request") {
312
+ const approvalResult = await routeCodexAppServerElicitationRequest({
313
+ requestParams: request.params,
314
+ paramsForRun: sideRunParams,
315
+ threadId: childThreadId,
316
+ turnId,
317
+ pluginAppPolicyContext: binding.pluginAppPolicyContext,
318
+ signal: runAbortController.signal
319
+ });
320
+ return approvalResult.kind === "handled" ? approvalResult.response : createCodexElicitationResponse("decline", null, { message: "OpenClaw Codex side questions do not support interactive MCP input." });
321
+ }
306
322
  if (request.method === "item/tool/requestUserInput") return isSideUserInputRequest(request.params, childThreadId, turnId) ? emptySideUserInputResponse() : void 0;
307
323
  if (isCodexAppServerApprovalRequest(request.method)) return handleCodexAppServerApprovalRequest({
308
324
  method: request.method,
@@ -412,8 +428,7 @@ async function runCodexAppServerSideQuestion(params, options) {
412
428
  relay: nativeHookRelay,
413
429
  events: nativeHookRelayEvents,
414
430
  hookTimeoutSec: options.nativeHookRelay?.hookTimeoutSec,
415
- clearOmittedEvents: true,
416
- loopDetectionPreToolUseRelay: appServer.loopDetectionPreToolUseRelay
431
+ clearOmittedEvents: true
417
432
  }) : options.nativeHookRelay?.enabled === false ? buildCodexNativeHookRelayDisabledConfig() : void 0;
418
433
  const runtimeThreadConfig = buildCodexRuntimeThreadConfig(webSearchPlan.threadConfig, {
419
434
  nativeCodeModeEnabled: nativeToolSurfaceEnabled,
@@ -423,7 +438,7 @@ async function runCodexAppServerSideQuestion(params, options) {
423
438
  const forkResponse = assertCodexThreadForkResponse(await withLeasedCodexAppServerClientStartSelectionRetry({
424
439
  lease: clientLease,
425
440
  options: clientOptions,
426
- signal: params.opts?.abortSignal,
441
+ signal: runAbortController.signal,
427
442
  run: async (forkClient, requestOptions) => {
428
443
  await ensureSandboxEnvironment(forkClient);
429
444
  const executionCwd = sandboxEnvironment?.cwd ?? cwd;
@@ -451,7 +466,7 @@ async function runCodexAppServerSideQuestion(params, options) {
451
466
  items: [sideBoundaryPromptItem()]
452
467
  }, {
453
468
  timeoutMs: appServer.requestTimeoutMs,
454
- signal: params.opts?.abortSignal
469
+ signal: runAbortController.signal
455
470
  });
456
471
  const effort = usesSupervisionConnection ? void 0 : resolveReasoningEffort(params.resolvedThinkLevel ?? "off", modelSelection.model, readCodexSupportedReasoningEfforts(params.runtimeModel?.compat));
457
472
  turnId = assertCodexTurnStartResponse(await client.request("turn/start", {
@@ -482,7 +497,7 @@ async function runCodexAppServerSideQuestion(params, options) {
482
497
  }
483
498
  }, {
484
499
  timeoutMs: appServer.requestTimeoutMs,
485
- signal: params.opts?.abortSignal
500
+ signal: runAbortController.signal
486
501
  }).catch((error) => {
487
502
  if (isCodexAppServerIndeterminateRequestCancellationError(error)) turnId = "";
488
503
  throw error;
@@ -499,7 +514,7 @@ async function runCodexAppServerSideQuestion(params, options) {
499
514
  let text;
500
515
  try {
501
516
  text = await collector.wait({
502
- signal: params.opts?.abortSignal,
517
+ signal: runAbortController.signal,
503
518
  timeoutMs: Math.max(appServer.turnCompletionIdleTimeoutMs, SIDE_QUESTION_COMPLETION_TIMEOUT_MS)
504
519
  });
505
520
  } catch (error) {
@@ -622,6 +637,7 @@ function buildSideRunAttemptParams(params, options) {
622
637
  authStorage: params.preparedRuntimeAuth.authStorage,
623
638
  authProfileStore: params.preparedRuntimeAuth.authProfileStore,
624
639
  modelRegistry: params.preparedRuntimeAuth.modelRegistry,
640
+ preparedModelRuntime: params.preparedModelRuntime,
625
641
  ...params.preparedRuntimeAuth.resolvedApiKey ? { resolvedApiKey: params.preparedRuntimeAuth.resolvedApiKey } : {},
626
642
  runId: options.runId,
627
643
  abortSignal: params.opts?.abortSignal,
@@ -641,6 +657,7 @@ async function createCodexSideToolBridge(input) {
641
657
  };
642
658
  const messageToolProvider = resolveCodexMessageToolProvider(input.params);
643
659
  let tools = [];
660
+ const webFetchHostnameAllowlistRef = {};
644
661
  if (supportsModelTools(runtimeModel)) {
645
662
  const createOpenClawCodingTools = (await import("openclaw/plugin-sdk/agent-harness")).createOpenClawCodingTools;
646
663
  const sandboxSessionKey = input.params.sandboxSessionKey?.trim() || input.params.sessionKey?.trim() || input.params.sessionId || input.sessionAgentId;
@@ -649,7 +666,8 @@ async function createCodexSideToolBridge(input) {
649
666
  sessionKey: sandboxSessionKey,
650
667
  workspaceDir: input.cwd
651
668
  });
652
- tools = filterToolsForVisionInputs(filterCodexDynamicTools(createOpenClawCodingTools({
669
+ const toolConstructionPlan = resolveCodexNodePlacementToolConstructionPlan(sandbox, input.nativeToolSurfaceEnabled);
670
+ tools = filterCodexVisionTools(filterCodexDynamicTools(createOpenClawCodingTools({
653
671
  agentId: input.sessionAgentId,
654
672
  sessionKey: sandboxSessionKey,
655
673
  runSessionKey: input.params.sessionKey && input.params.sessionKey !== sandboxSessionKey ? input.params.sessionKey : void 0,
@@ -662,6 +680,7 @@ async function createCodexSideToolBridge(input) {
662
680
  resolvedWorkspace: input.params.workspaceDir ?? input.cwd
663
681
  }),
664
682
  config: input.params.cfg,
683
+ preparedModelRuntime: input.params.preparedModelRuntime,
665
684
  abortSignal: input.signal,
666
685
  modelProvider: runtimeModel.provider,
667
686
  modelId: input.params.model,
@@ -670,6 +689,7 @@ async function createCodexSideToolBridge(input) {
670
689
  modelContextWindowTokens: runtimeModel.contextWindow,
671
690
  modelAuthMode: resolveModelAuthMode(runtimeModel.provider, input.params.cfg, void 0, { workspaceDir: input.cwd }),
672
691
  suppressManagedWebSearch: false,
692
+ webFetchHostnameAllowlistRef,
673
693
  ...input.params.messageProvider || input.params.messageChannel ? {
674
694
  messageProvider: messageToolProvider,
675
695
  toolPolicyMessageProvider: input.params.messageProvider ?? input.params.messageChannel
@@ -698,12 +718,13 @@ async function createCodexSideToolBridge(input) {
698
718
  currentChannelId: input.params.currentChannelId
699
719
  }).channelId,
700
720
  sandbox,
721
+ ...toolConstructionPlan ? { toolConstructionPlan } : {},
701
722
  emitBeforeToolCallDiagnostics: false,
702
723
  modelHasVision: runtimeModel.input?.includes("image") ?? false,
703
724
  requireExplicitMessageTarget: true
704
725
  }), input.pluginConfig), {
705
726
  modelHasVision: runtimeModel.input?.includes("image") ?? false,
706
- hasInboundImages: false
727
+ nativeImageInspectionEnabled: input.nativeToolSurfaceEnabled
707
728
  });
708
729
  }
709
730
  const requestedWebSearchPlan = resolveCodexWebSearchPlan({
@@ -712,6 +733,7 @@ async function createCodexSideToolBridge(input) {
712
733
  nativeProviderWebSearchSupport: input.nativeProviderWebSearchSupport,
713
734
  webSearchAllowed: tools.some((tool) => tool.name === "web_search")
714
735
  });
736
+ webFetchHostnameAllowlistRef.value = requestedWebSearchPlan.webFetchHostnameAllowlist;
715
737
  const webSearchPlan = requestedWebSearchPlan.kind === "managed" ? resolveCodexWebSearchPlan({
716
738
  config: input.params.cfg,
717
739
  webSearchAllowed: false