@openclaw/codex 2026.10.5-beta.4 → 2026.10.10-beta.1

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 (156) hide show
  1. package/README.md +10 -3
  2. package/dist/.setup/{account-usage-runtime-CoVpNIlD.mjs → account-usage-runtime-DDCDkvtl.mjs} +15 -9
  3. package/dist/.setup/{app-server-policy-D_zv8J7V.mjs → app-server-policy-Cog6mm2i.mjs} +1 -1
  4. package/dist/.setup/{apply-BXDMd05l.mjs → apply-BVSXYkTV.mjs} +11 -11
  5. package/dist/.setup/{attempt-client-cleanup-zNuNTKVr.mjs → attempt-client-cleanup-6OcbMH46.mjs} +14 -8
  6. package/dist/.setup/attempt-terminal-sZutF0WY.mjs +1 -0
  7. package/dist/.setup/{attempt-workspace-context-CcwP3DA3.mjs → attempt-workspace-context-GYPLawX6.mjs} +2 -2
  8. package/dist/.setup/{auth-binding-BaxlhaNx.mjs → auth-binding-830RLAJW.mjs} +2 -2
  9. package/dist/.setup/{auth-cache-key-f8ODJ_OX.mjs → auth-cache-key-CVcYw8HD.mjs} +92 -80
  10. package/dist/.setup/{auth-profile-CgHQ8Vot.mjs → auth-profile-auwzSwwy.mjs} +14 -8
  11. package/dist/.setup/{auth-profile-health-oHizqgye.mjs → auth-profile-health-BVPZU9I8.mjs} +15 -8
  12. package/dist/.setup/{auth-profile-selection-hr8ocLtz.mjs → auth-profile-selection-Bp5PDk3W.mjs} +24 -7
  13. package/dist/.setup/{binding-connection-B7HAAZSI.mjs → binding-connection-GTgUj9pi.mjs} +2 -2
  14. package/dist/.setup/{binding-connection.runtime-DAXn7iFl.mjs → binding-connection.runtime-RcWR3vQu.mjs} +4 -3
  15. package/dist/.setup/{bounded-turn-isolation-BfDAo-qZ.mjs → bounded-turn-isolation-D8CDrAVX.mjs} +3 -3
  16. package/dist/.setup/{bounded-turn-DfIJtRlv.mjs → bounded-turn-mN_ekXYW.mjs} +18 -22
  17. package/dist/.setup/{build-state-Ds14X10-.mjs → build-state-VcujMRqP.mjs} +1 -1
  18. package/dist/.setup/{capabilities-DbOzOglY.mjs → capabilities-DAS-JX1z.mjs} +1 -1
  19. package/dist/.setup/{client-D93nbdB8.mjs → client-BS8X7HmG.mjs} +47 -317
  20. package/dist/.setup/{client-catalog-response-CuVLp4I0.mjs → client-catalog-response-jM38o5w1.mjs} +2 -2
  21. package/dist/.setup/client-initialize-CjgZcX61.mjs +165 -0
  22. package/dist/.setup/{command-dispatch-DxdH5a9-.mjs → command-dispatch-DzXbHqCn.mjs} +3 -3
  23. package/dist/.setup/{command-formatters-xW9KpoSZ.mjs → command-formatters-B_7-QZ1c.mjs} +2 -2
  24. package/dist/.setup/{command-handlers-fiYvYYq0.mjs → command-handlers-tfb5Uq-O.mjs} +539 -406
  25. package/dist/.setup/command-rpc-SXqLQukR.mjs +296 -0
  26. package/dist/.setup/compact-M-JxLcbZ.mjs +823 -0
  27. package/dist/.setup/{computer-use-DL2v3Kxq.mjs → computer-use-FqQ-Flbl.mjs} +21 -68
  28. package/dist/.setup/{config-C1YVVLEA.mjs → config-BfrAlTMT.mjs} +3 -3
  29. package/dist/.setup/{config-options-DDzeNQ8m.mjs → config-options-DMFZkd3X.mjs} +1 -1
  30. package/dist/.setup/{config-runtime-DWzK-k0n.mjs → config-runtime-BZRizyuG.mjs} +2 -2
  31. package/dist/.setup/{context-engine-projection-ps-yn_ci.mjs → context-engine-projection-PIeLSnR-.mjs} +16 -30
  32. package/dist/.setup/{conversation-binding-BieJZRRV.mjs → conversation-binding-C7MZy-Cx.mjs} +228 -116
  33. package/dist/.setup/{conversation-binding-data-UgLuTSQT.mjs → conversation-binding-data-khgW0n-o.mjs} +4 -2
  34. package/dist/.setup/{conversation-control-GXM3unE4.mjs → conversation-control-B2EpVZEb.mjs} +53 -23
  35. package/dist/.setup/{cyber-failover-D4dgNfFf.mjs → cyber-failover-CqEZoQsj.mjs} +1 -1
  36. package/dist/.setup/{cyber-failover-notice-ljgGGL0s.mjs → cyber-failover-notice-poL3Advd.mjs} +1 -1
  37. package/dist/.setup/{doctor-start-options-JjTAl-q_.mjs → doctor-start-options-8uIBXIzR.mjs} +8 -5
  38. package/dist/.setup/{dynamic-tool-build-DcaPmBlE.mjs → dynamic-tool-build-BjFAIG-f.mjs} +208 -218
  39. package/dist/.setup/{dynamic-tools-CnQFnNKH.mjs → dynamic-tools-XqWsVjcC.mjs} +344 -118
  40. package/dist/.setup/{effective-mcp-catalog-B5HKFZNK.mjs → effective-mcp-catalog-C3ta5hHc.mjs} +11 -9
  41. package/dist/.setup/{ephemeral-turn-De3qb8EQ.mjs → ephemeral-turn-1ZF17fUR.mjs} +5 -4
  42. package/dist/.setup/{event-projector-assistant-message-CLMKN4x-.mjs → event-projector-assistant-message-ChOAY7rW.mjs} +16 -11
  43. package/dist/.setup/{event-projector-usage-BpKfdoTm.mjs → event-projector-usage-CBY0Hkga.mjs} +2 -2
  44. package/dist/.setup/{event-projector-values-CLvG1Hil.mjs → event-projector-values-yf4us9Pf.mjs} +1 -1
  45. package/dist/.setup/experimental-features-uGnVDtp-.mjs +19 -0
  46. package/dist/.setup/inference-context-mv_dBpAL.mjs +209 -0
  47. package/dist/.setup/{inference-dispatch-CO6tTs4q.mjs → inference-dispatch-C2zVSnrr.mjs} +2 -2
  48. package/dist/.setup/{inference-metadata-DCvcG_N_.mjs → inference-metadata-CYFWLHVk.mjs} +3 -1
  49. package/dist/.setup/{inference-proxy-BDWV0djM.mjs → inference-proxy-yd3hr2dr.mjs} +8 -8
  50. package/dist/.setup/installed-probe-lVC1X5ve.mjs +185 -0
  51. package/dist/.setup/{isolated-completion-BPJdvk5F.mjs → isolated-completion-P-r8NRE4.mjs} +7 -7
  52. package/dist/.setup/managed-binary-DbKvGXKl.mjs +395 -0
  53. package/dist/.setup/{mcp-app-session-preparation-Dz2GOwyE.mjs → mcp-app-session-preparation-fnsnCovu.mjs} +18 -14
  54. package/dist/.setup/{model-catalog-ZNwltCKl.mjs → model-catalog-Y_esgRPY.mjs} +28 -17
  55. package/dist/.setup/{models-BHpbAuz8.mjs → models-BWLEUo2E.mjs} +3 -3
  56. package/dist/.setup/{native-auth-esN5MdIv.mjs → native-auth-DpZIaY8N.mjs} +7 -4
  57. package/dist/.setup/native-execution-policy-D09tLP-u.mjs +152 -0
  58. package/dist/.setup/{native-hook-relay-wq7jrNLk.mjs → native-hook-relay-C7aaLJaP.mjs} +45 -10
  59. package/dist/.setup/{native-mcp-app-DX3nyTtc.mjs → native-mcp-app-CsWj-v_x.mjs} +5 -5
  60. package/dist/.setup/{native-skill-isolation-DSBeF-Yy.mjs → native-skill-isolation-CMimsKYy.mjs} +7 -7
  61. package/dist/.setup/{native-subagent-monitor-DOLEIf9r.mjs → native-subagent-monitor-CFE7b4oC.mjs} +485 -239
  62. package/dist/.setup/{native-subagent-pending-assignments-DmVhedNs.mjs → native-subagent-pending-assignments-CTinVtjo.mjs} +1 -1
  63. package/dist/.setup/{native-task-assignments-DimsQ9Qa.mjs → native-task-assignments-YJopbaVO.mjs} +9 -5
  64. package/dist/.setup/{node-cli-sessions-CzKg2nGq.mjs → node-cli-sessions-BuJnBnEq.mjs} +7 -4
  65. package/dist/.setup/{node-exec-server.runtime-BWkULhBM.mjs → node-exec-server.runtime-CP7RC1Nd.mjs} +3 -3
  66. package/dist/.setup/{plan-41-YOBMq.mjs → plan-B4cHgqNv.mjs} +7 -20
  67. package/dist/.setup/{plugin-activation-D7WkJMvU.mjs → plugin-activation-CXPWe-hl.mjs} +4 -4
  68. package/dist/.setup/{plugin-app-cache-key-Bg9DbDI6.mjs → plugin-app-cache-key-DRb-niJc.mjs} +17 -55
  69. package/dist/.setup/{plugin-approval-roundtrip-CD88q3yx.mjs → plugin-approval-roundtrip-DIZHLbAM.mjs} +1 -1
  70. package/dist/.setup/{plugin-inventory-CYgdo14P.mjs → plugin-inventory-DE9wcaeH.mjs} +2 -2
  71. package/dist/.setup/{plugin-metadata-cache-Bi8TAPwX.mjs → plugin-metadata-cache-BqC-a6Fb.mjs} +2 -15
  72. package/dist/.setup/{project-doc-thread-config-BVcvnps8.mjs → project-doc-thread-config-B0UI3f1D.mjs} +6 -6
  73. package/dist/.setup/protocol-CaPAVwe9.mjs +12 -0
  74. package/dist/.setup/{provider-capabilities-Dn2WwH4P.mjs → provider-capabilities-DjcKunHS.mjs} +1 -1
  75. package/dist/.setup/{provider-LWKll6dV.mjs → provider-wj_LFJH3.mjs} +4 -4
  76. package/dist/.setup/{rate-limits-CI8pTPqL.mjs → rate-limits-BpfURnuy.mjs} +1 -1
  77. package/dist/.setup/{request-Bo0kKABI.mjs → request-ePeNJrOd.mjs} +132 -136
  78. package/dist/.setup/{responses-oauth-twnuTaAa.mjs → responses-oauth-CCV7aVYF.mjs} +6 -6
  79. package/dist/.setup/{rpc-error-C98SHchT.mjs → rpc-error-DemqqaxE.mjs} +7 -3
  80. package/dist/.setup/{run-attempt-ClU8MxhZ.mjs → run-attempt-BcWArowv.mjs} +595 -426
  81. package/dist/.setup/{run-attempt-lifecycle-KN4oh-7O.mjs → run-attempt-lifecycle-DN-ATDp9.mjs} +1 -1
  82. package/dist/.setup/{runtime-artifact-C13pR7tD.mjs → runtime-artifact-CmLWeyJB.mjs} +3 -3
  83. package/dist/.setup/{runtime-artifact-connection-jS5DeCok.mjs → runtime-artifact-connection-DpWlZ02e.mjs} +3 -3
  84. package/dist/.setup/{sandbox-guard-DIImwCy1.mjs → sandbox-guard-DneAfNye.mjs} +70 -30
  85. package/dist/.setup/{session-binding-JEHNMPsr.mjs → session-binding-BgsWcbdY.mjs} +25 -23
  86. package/dist/.setup/{session-binding-record-DU_0biMD.mjs → session-binding-record-C_THntMe.mjs} +27 -12
  87. package/dist/.setup/{session-binding-record-codec-BpH8u_G9.mjs → session-binding-record-codec-DvmOI7g_.mjs} +1 -0
  88. package/dist/.setup/{session-binding-sidecars-DD-enC8w.mjs → session-binding-sidecars-BNSS6WL4.mjs} +55 -63
  89. package/dist/.setup/session-cancellation-DLBSJO5n.mjs +43 -0
  90. package/dist/.setup/{session-catalog-adoption-Ca3OYGYM.mjs → session-catalog-adoption-ppsLlVLB.mjs} +24 -38
  91. package/dist/.setup/{session-catalog-archive-Bv6gV7x9.mjs → session-catalog-archive-CqLRHJ6z.mjs} +11 -13
  92. package/dist/.setup/{session-catalog-events-kR2Ot6nX.mjs → session-catalog-events-DK0opVp3.mjs} +5 -5
  93. package/dist/.setup/{session-catalog-index-CrnfVEnT.mjs → session-catalog-index-BfzfdtH7.mjs} +96 -271
  94. package/dist/.setup/{session-catalog-index-order-CTfoefow.mjs → session-catalog-index-order-0Zqng2u8.mjs} +1 -1
  95. package/dist/.setup/{session-catalog-limits-BynIoOYm.mjs → session-catalog-limits-Dc6E0BZz.mjs} +1 -1
  96. package/dist/.setup/{session-catalog-list-request-D4MYNgDB.mjs → session-catalog-list-request-CAjoWjaH.mjs} +3 -4
  97. package/dist/.setup/{session-catalog-native-projection-CWqCU1I_.mjs → session-catalog-native-projection-G3lSDYYG.mjs} +5 -5
  98. package/dist/.setup/{session-catalog-node-adoption-BdP9Zjqo.mjs → session-catalog-node-adoption-e9v8mGgx.mjs} +5 -5
  99. package/dist/.setup/{session-catalog-node-continue-CNJibO4_.mjs → session-catalog-node-continue-H7nrzcUD.mjs} +5 -5
  100. package/dist/.setup/{session-catalog-node-lookup-BH_DBGa9.mjs → session-catalog-node-lookup-BrZfDkA8.mjs} +2 -2
  101. package/dist/.setup/{session-catalog-parsing-DkeoVn60.mjs → session-catalog-parsing-V6jyFg9g.mjs} +2 -2
  102. package/dist/.setup/{session-catalog-projection-BzHiV818.mjs → session-catalog-projection-BjWE414G.mjs} +8 -7
  103. package/dist/.setup/{session-catalog-provenance-CmsOE5mh.mjs → session-catalog-provenance-Dg9s12z-.mjs} +50 -30
  104. package/dist/.setup/{session-catalog-source-DGuRdGvM.mjs → session-catalog-source-DqyuNxCe.mjs} +2 -6
  105. package/dist/.setup/{session-cli-GwU0izn-.mjs → session-cli-CBGKiqdv.mjs} +1 -1
  106. package/dist/.setup/{session-history-BO6i_pfk.mjs → session-history-7W0cgTXF.mjs} +11 -9
  107. package/dist/.setup/{session-history-import-CaO8s6ta.mjs → session-history-import-BwPKwcNi.mjs} +4 -4
  108. package/dist/.setup/{session-initialization-Bi_2DKhc.mjs → session-initialization-Dn3vveGv.mjs} +2 -2
  109. package/dist/.setup/{session-retirement-B3U5hpGJ.mjs → session-retirement-Ci_JvOfH.mjs} +8 -8
  110. package/dist/.setup/{session-history.worker-DJQfek5p.mjs → settled-turn-evidence--tRW6fSm.mjs} +2 -18
  111. package/dist/.setup/{settled-turn-finalizer-CYCVpTv2.mjs → settled-turn-finalizer-D3-KXsbP.mjs} +8 -8
  112. package/dist/.setup/{shared-client-BCx1wbyA.mjs → shared-client-CE_uY0A1.mjs} +380 -557
  113. package/dist/.setup/side-question-OM18H9WJ.mjs +998 -0
  114. package/dist/.setup/{source-DipMO9hL.mjs → source-uGKgKWm8.mjs} +5 -5
  115. package/dist/.setup/{thread-archive-guard-LKdwQKyr.mjs → thread-archive-guard-BWjSsA92.mjs} +1 -1
  116. package/dist/.setup/{thread-lifecycle-run-C_aYiYqk.mjs → thread-lifecycle-run-mLueY6pH.mjs} +172 -75
  117. package/dist/.setup/{thread-model-selection-DcVebr8N.mjs → thread-model-selection-DxposL4X.mjs} +9 -9
  118. package/dist/.setup/{thread-ownership-BoUd0i6L.mjs → thread-ownership-t6Y9fLQS.mjs} +7 -7
  119. package/dist/.setup/{thread-policy-B3wBRNph.mjs → thread-policy-Cy301Or8.mjs} +6 -6
  120. package/dist/.setup/{thread-requests-BgzJwJtS.mjs → thread-requests-BjawdIVV.mjs} +14 -14
  121. package/dist/.setup/{thread-resume-D-3bsr1j.mjs → thread-resume-BUbsUfgF.mjs} +6 -6
  122. package/dist/.setup/{transcript-history-projection-DfKcoZCB.mjs → transcript-history-projection-i-FVpyha.mjs} +1 -1
  123. package/dist/.setup/{transcript-mirror-Bee2o6jj.mjs → transcript-mirror-CEQJZlF3.mjs} +6 -9
  124. package/dist/.setup/{transport-stdio-CRWTkKOn.mjs → transport-stdio-Bq160Dhv.mjs} +63 -64
  125. package/dist/.setup/{transport-websocket-DIyPfkHo.mjs → transport-websocket-0YqiI_MH.mjs} +1 -1
  126. package/dist/.setup/{turn-router-DBVMToGo.mjs → turn-router-Dbw17k3K.mjs} +2 -2
  127. package/dist/.setup/{upstream-session-fork-p5fwKi7w.mjs → upstream-session-fork-_LYkh0nZ.mjs} +46 -219
  128. package/dist/.setup/{usage-limit-error-BQX8RHAd.mjs → usage-limit-error-DcOSH3J4.mjs} +4 -4
  129. package/dist/.setup/{usage-C2Kq7oej.mjs → usage-w_93wnnR.mjs} +4 -4
  130. package/dist/.setup/{web-search-item-CvokaZOo.mjs → web-search-item-DHVuNSqk.mjs} +1 -1
  131. package/dist/.setup/{web-search-provider.runtime-D89djc7e.mjs → web-search-provider.runtime-DMHxve5v.mjs} +3 -3
  132. package/dist/.setup/{workspace-write-sandbox-probe-BDWO2Qkh.mjs → workspace-write-sandbox-probe-DJxOXcF3.mjs} +2 -2
  133. package/dist/api.js +7 -28
  134. package/dist/catalog-page.worker.js +1 -1
  135. package/dist/cli-metadata.js +1 -1
  136. package/dist/client-version-api.js +25 -0
  137. package/dist/doctor-contract-api.js +5 -5
  138. package/dist/harness.js +59 -36
  139. package/dist/index.js +259 -295
  140. package/dist/media-understanding-provider.js +2 -2
  141. package/dist/migration-provider-api.js +1 -2
  142. package/dist/native-session-binding-api.js +1 -2
  143. package/dist/provider-discovery.js +1 -1
  144. package/dist/session-history-worker-entrypoint.js +12 -0
  145. package/dist/session-history-worker-runtime.js +7 -18
  146. package/dist/session-history.worker.js +18 -2
  147. package/openclaw.plugin.json +1 -1
  148. package/package.json +6 -6
  149. package/dist/.setup/attempt-terminal-jO5IMj9K.mjs +0 -2
  150. package/dist/.setup/command-rpc-HIvsy3wS.mjs +0 -247
  151. package/dist/.setup/compact-ClZ7Ar7L.mjs +0 -808
  152. package/dist/.setup/inference-context-DNlGwzwy.mjs +0 -91
  153. package/dist/.setup/managed-binary-BtIjV7yN.mjs +0 -175
  154. package/dist/.setup/native-execution-policy-MXEe7PB3.mjs +0 -75
  155. package/dist/.setup/protocol-CANUwXJ3.mjs +0 -17
  156. package/dist/.setup/side-question-Bz2UQW0l.mjs +0 -826
@@ -1,14 +1,14 @@
1
1
  import { CODEX_NATIVE_TOOL_REQUIREMENTS } from "../native-tool-policy.js";
2
2
  import { c as isCodexPairedNodeRemoteExecPlacementSandbox, d as readCodexPluginConfig, l as isCodexRemoteExecPlacementSandbox } from "./config-parsing-DsWSCPHO.mjs";
3
- import "./config-C1YVVLEA.mjs";
4
- import { a as isCodexResponsesOAuthRun } from "./responses-oauth-twnuTaAa.mjs";
5
- import { F as isForcedPrivateQaCodexRuntime, L as isSystemAgentOnlyCodexDynamicToolAllowlist, P as filterCodexDynamicTools, R as normalizeCodexDynamicToolName, h as resolveCodexWebSearchPlan } from "./thread-requests-BgzJwJtS.mjs";
6
- import { n as resolveCodexNativeExecutionPolicy, r as resolveCodexNodeExecToolOverrides } from "./native-execution-policy-MXEe7PB3.mjs";
7
- import { _ as createGatewayProcessProjection, b as isCodexDynamicToolExcluded, g as createGatewayExecProjection, v as createNodeExecAliasDynamicTool, x as placeDisabledNativeShellToolsInDirectNamespace, y as createSandboxShellProjection } from "./native-hook-relay-wq7jrNLk.mjs";
3
+ import "./config-BfrAlTMT.mjs";
4
+ import { a as isCodexResponsesOAuthRun } from "./responses-oauth-CCV7aVYF.mjs";
5
+ import { F as isForcedPrivateQaCodexRuntime, L as isSystemAgentOnlyCodexDynamicToolAllowlist, P as filterCodexDynamicTools, R as normalizeCodexDynamicToolName, h as resolveCodexWebSearchPlan } from "./thread-requests-BjawdIVV.mjs";
6
+ import { a as resolveCodexNodeExecToolOverrides, r as prepareCodexNativeExecutionPolicyForRun } from "./native-execution-policy-D09tLP-u.mjs";
7
+ import { _ as createGatewayProcessProjection, b as isCodexDynamicToolExcluded, g as createGatewayExecProjection, v as createNodeExecAliasDynamicTool, x as placeDisabledNativeShellToolsInDirectNamespace, y as createSandboxShellProjection } from "./native-hook-relay-C7aaLJaP.mjs";
8
8
  import path from "node:path";
9
9
  import { createStageTimingTracker, formatStageTimings } from "openclaw/plugin-sdk/time-runtime";
10
10
  import { resolveAgentDir } from "openclaw/plugin-sdk/agent-runtime";
11
- import { applyEmbeddedAttemptToolsAllow, buildAgentHookContextChannelFields, buildEmbeddedAttemptToolRunContext, embeddedAgentLog, filterProviderNormalizableTools, getPluginToolMeta, isHostScopedAgentToolActive, isSubagentSessionKey, normalizeAgentRuntimeTools, resolveAttemptSpawnWorkspaceDir, resolveModelAuthMode, supportsModelTools } from "openclaw/plugin-sdk/agent-harness-runtime";
11
+ import { applyEmbeddedAttemptToolsAllow, buildAgentHookContextChannelFields, buildEmbeddedAttemptToolRunContext, embeddedAgentLog, filterProviderNormalizableTools, getPluginToolMeta, isHostScopedAgentToolActive, isSubagentSessionKey, normalizeAgentRuntimeTools, resolveAttemptSpawnWorkspaceDir, resolveModelAuthModeAsync, supportsModelTools } from "openclaw/plugin-sdk/agent-harness-runtime";
12
12
  import { isToolAllowed } from "openclaw/plugin-sdk/sandbox";
13
13
  import { resolveCodexScheduledToolProjectionFactory, runWithCronCreatorAuthorityCapabilityResolver } from "openclaw/plugin-sdk/codex-mcp-projection";
14
14
  //#region extensions/codex/src/app-server/dynamic-tool-construction-plan.ts
@@ -138,238 +138,228 @@ async function buildDynamicTools(input) {
138
138
  const toolBuildStages = createStageTimingTracker();
139
139
  const modelHasVision = params.model.input?.includes("image") ?? false;
140
140
  const agentDir = params.agentDir ?? resolveAgentDir(params.config ?? {}, input.sessionAgentId);
141
- const nativeExecutionPolicy = resolveCodexNativeExecutionPolicyForRun(params, {
141
+ const preparedExecution = input.nativeExecutionPolicy ?? await prepareCodexNativeExecutionPolicyForRun(params, {
142
142
  agentId: input.policyAgentId,
143
143
  runtimeSessionKey: input.sandboxSessionKey,
144
144
  sandbox: input.sandbox
145
145
  });
146
- const webSearchPlan = resolveCodexWebSearchPlan({
147
- config: params.config,
148
- disableTools: params.disableTools,
149
- nativeToolSurfaceEnabled: isCodexResponsesOAuthRun(params) || input.nativeToolSurfaceEnabled,
150
- nativeProviderWebSearchSupport: input.nativeProviderWebSearchSupport
151
- });
152
- const messageToolProvider = resolveCodexMessageToolProvider(params);
153
- const webFetchHostnameAllowlistRef = {};
154
- const toolConstructionPlan = resolveCodexToolConstructionPlan(input.sandbox, input.nativeToolSurfaceEnabled, params.requireWorkspaceOnly);
155
- const options = {
156
- agentId: input.sessionAgentId,
157
- policyAgentId: input.policyAgentId,
158
- ...toolRunContext,
159
- exec: {
160
- ...params.execOverrides,
161
- ...input.sessionPermissionPolicy ? { mode: input.sessionPermissionPolicy.execMode } : {},
162
- ...resolveCodexNodeExecToolOverrides(nativeExecutionPolicy),
146
+ try {
147
+ const nativeExecutionPolicy = preparedExecution.policy;
148
+ const webSearchPlan = resolveCodexWebSearchPlan({
163
149
  config: params.config,
164
- elevated: params.bashElevated
165
- },
166
- sessionPermissionPolicy: input.sessionPermissionPolicy ? {
167
- mode: input.sessionPermissionPolicy.mode,
168
- root: input.sessionPermissionPolicy.root
169
- } : void 0,
170
- sandbox: input.sandbox,
171
- requireWorkspaceOnly: params.requireWorkspaceOnly,
172
- ...toolConstructionPlan ? { toolConstructionPlan } : {},
173
- messageProvider: messageToolProvider,
174
- toolPolicyMessageProvider: params.messageProvider ?? params.messageChannel,
175
- ...params.onToolResult ? { questionPrompt: {
176
- send: params.onToolResult,
177
- messageChannel: messageToolProvider
178
- } } : {},
179
- inputProvenance: params.inputProvenance,
180
- trustedInternalHandoff: params.trustedInternalHandoff,
181
- allowGatewaySubagentBinding: params.allowGatewaySubagentBinding || isForcedPrivateQaCodexRuntime(),
182
- sessionKey: input.sandboxSessionKey,
183
- runSessionKey: params.sessionKey && params.sessionKey !== input.sandboxSessionKey ? params.sessionKey : void 0,
184
- sessionId: params.sessionId,
185
- runId: params.runId,
186
- memoryAudience: params.memoryAudience,
187
- agentDir,
188
- preparedModelRuntime: params.preparedModelRuntime,
189
- cwd: input.effectiveCwd ?? input.effectiveWorkspace,
190
- workspaceDir: input.effectiveWorkspace,
191
- spawnWorkspaceDir: input.effectiveCwd && input.effectiveCwd !== input.effectiveWorkspace ? input.resolvedWorkspace : resolveAttemptSpawnWorkspaceDir({
150
+ disableTools: params.disableTools,
151
+ nativeToolSurfaceEnabled: isCodexResponsesOAuthRun(params) || input.nativeToolSurfaceEnabled,
152
+ nativeProviderWebSearchSupport: input.nativeProviderWebSearchSupport
153
+ });
154
+ const messageToolProvider = resolveCodexMessageToolProvider(params);
155
+ const webFetchHostnameAllowlistRef = {};
156
+ const toolConstructionPlan = resolveCodexToolConstructionPlan(input.sandbox, input.nativeToolSurfaceEnabled, params.requireWorkspaceOnly);
157
+ const options = {
158
+ agentId: input.sessionAgentId,
159
+ policyAgentId: input.policyAgentId,
160
+ ...toolRunContext,
161
+ exec: {
162
+ ...params.execOverrides,
163
+ ...input.sessionPermissionPolicy ? { mode: input.sessionPermissionPolicy.execMode } : {},
164
+ ...resolveCodexNodeExecToolOverrides(nativeExecutionPolicy),
165
+ config: params.config,
166
+ elevated: params.bashElevated
167
+ },
168
+ sessionPermissionPolicy: input.sessionPermissionPolicy ? {
169
+ mode: input.sessionPermissionPolicy.mode,
170
+ root: input.sessionPermissionPolicy.root
171
+ } : void 0,
192
172
  sandbox: input.sandbox,
193
- resolvedWorkspace: input.resolvedWorkspace
194
- }),
195
- config: params.config,
196
- skillsSnapshot: params.skillsSnapshot,
197
- ...params.skillLibraryAuthoring ? { skillWorkshop: { libraryAuthoring: params.skillLibraryAuthoring } } : {},
198
- authProfileStore: params.toolAuthProfileStore ?? params.authProfileStore,
199
- abortSignal: input.runAbortController.signal,
200
- emitBeforeToolCallDiagnostics: false,
201
- modelProvider: params.model.provider,
202
- modelId: params.modelId,
203
- modelCompat: params.model.compat && typeof params.model.compat === "object" ? params.model.compat : void 0,
204
- modelApi: params.model.api,
205
- modelContextWindowTokens: params.model.contextWindow,
206
- delegationCapability: params.delegationCapability,
207
- modelAuthMode: resolveModelAuthMode(params.model.provider, params.config, params.toolAuthProfileStore ?? params.authProfileStore, { workspaceDir: input.effectiveWorkspace }),
208
- suppressManagedWebSearch: false,
209
- webFetchHostnameAllowlistRef,
210
- hookChannelId: resolveCodexAppServerHookChannelId(params, input.sandboxSessionKey),
211
- modelHasVision,
212
- computerContextEpoch: input.computerContextEpoch,
213
- oneShotCliRun: params.oneShotCliRun,
214
- registerRunCleanup: input.registerRunCleanup,
215
- requireExplicitMessageTarget: params.requireExplicitMessageTarget ?? isSubagentSessionKey(params.sessionKey),
216
- disableMessageTool: input.ignoreDisableMessageTool ? false : params.disableMessageTool,
217
- forceMessageTool: shouldForceMessageTool(messagePolicyParams),
218
- enableHeartbeatTool: params.trigger === "heartbeat" || input.forceHeartbeatTool === true,
219
- forceHeartbeatTool: params.trigger === "heartbeat" || input.forceHeartbeatTool === true,
220
- onYield: (message, acknowledgment) => {
221
- input.onYieldDetected(message, acknowledgment);
222
- input.onCodexAppServerEvent?.({
223
- stream: "codex_app_server.tool",
224
- data: {
225
- name: "sessions_yield",
226
- message
227
- }
228
- });
229
- },
230
- claimYieldCompletion: input.claimYieldCompletion,
231
- recordToolPrepStage: (name) => {
232
- toolBuildStages.mark(name);
233
- },
234
- onToolOutcome: params.onToolOutcome,
235
- isTurnTainted: params.isTurnTainted,
236
- allocateToolOutcomeOrdinal: params.allocateToolOutcomeOrdinal,
237
- cronCreatorToolAllowlistRef: input.cronCreatorToolAllowlistRef,
238
- cronCreatorToolAllowlistCaptureRef: input.cronCreatorToolAllowlistCaptureRef,
239
- cronCreatorAuthorityUnavailableReason: input.cronCreatorAuthorityUnavailableReason
240
- };
241
- input.onMessageToolTargetResolved?.(options.requireExplicitMessageTarget === true);
242
- const allTools = await createCodexHostToolSurface(params, options, { cwd: input.effectiveCwd ?? input.effectiveWorkspace }, input.resolveCronCreatorToolAuthority);
243
- toolBuildStages.mark("create-openclaw-coding-tools");
244
- const preNormalizationDiagnostics = [];
245
- const readableAllToolProjection = filterProviderNormalizableTools(allTools);
246
- preNormalizationDiagnostics.push(...readableAllToolProjection.diagnostics);
247
- const readableAllTools = [...readableAllToolProjection.tools];
248
- const normallyProfiledTools = filterCodexDynamicTools(readableAllTools, input.pluginConfig, { disabledNativeSurface: input.nativeToolSurfaceEnabled === false ? { preserveShell: !isCodexMemoryFlushRun(params) && input.sandbox?.enabled !== true && nativeExecutionPolicy.effectiveExecHost !== "node" } : void 0 });
249
- const systemAgentTool = (input.isHostScopedToolActive?.("openclaw") ?? isHostScopedAgentToolActive("openclaw")) && isSystemAgentOnlyCodexDynamicToolAllowlist(params.toolsAllow) && readableAllTools.find((tool) => tool.name === "openclaw" && tool.catalogMode === "direct-only");
250
- const profileFilteredTools = systemAgentTool ? [systemAgentTool, ...normallyProfiledTools.filter((tool) => tool.name !== "openclaw")] : normallyProfiledTools;
251
- const codexFilteredTools = await addShellDynamicTools(isCodexMemoryFlushRun(params) ? readableAllTools.filter((tool) => CODEX_MEMORY_FLUSH_DYNAMIC_TOOL_ALLOW.has(normalizeCodexDynamicToolName(tool.name))) : profileFilteredTools, readableAllTools, input, nativeExecutionPolicy);
252
- toolBuildStages.mark("codex-filtering");
253
- const visionFilteredTools = filterCodexVisionTools(codexFilteredTools, {
254
- modelHasVision,
255
- nativeImageInspectionEnabled: input.nativeToolSurfaceEnabled === true
256
- });
257
- toolBuildStages.mark("vision-filtering");
258
- const webSearchPresent = visionFilteredTools.some((tool) => tool.name === "web_search");
259
- const persistentCodexWebSearchSurface = params.config?.tools?.web?.search?.enabled !== false && !isCodexDynamicToolExcluded(input.pluginConfig, ["web_search"]);
260
- const persistentHostedWebSearchEligible = resolveCodexWebSearchPlan({
261
- config: params.config,
262
- nativeProviderWebSearchSupport: input.nativeProviderWebSearchSupport
263
- }).kind === "native-hosted";
264
- let nativeWebSearchAllowed = false;
265
- let persistentWebSearchAllowed = webSearchPresent;
266
- if ((input.onPersistentWebSearchPolicyResolved || webSearchPlan.kind === "native-hosted" && (input.onWebSearchPolicyResolved || webSearchPlan.webFetchHostnameAllowlist)) && !webSearchPresent && persistentCodexWebSearchSurface) {
267
- const webSearchPolicy = (await import("openclaw/plugin-sdk/agent-harness")).resolveWebSearchToolPolicy({
268
- config: params.config,
269
- modelProvider: params.model.provider,
270
- modelId: params.modelId,
271
- agentId: input.policyAgentId,
272
- sessionKey: input.sandboxSessionKey,
273
- sessionId: params.sessionId,
274
- ...persistentHostedWebSearchEligible ? { runtimeToolAllowlist: toolRunContext.runtimeToolAllowlist } : {},
275
- sandboxToolPolicy: input.sandbox?.tools,
173
+ requireWorkspaceOnly: params.requireWorkspaceOnly,
174
+ ...toolConstructionPlan ? { toolConstructionPlan } : {},
276
175
  messageProvider: messageToolProvider,
277
- agentAccountId: params.agentAccountId,
278
- groupId: params.groupId,
279
- groupChannel: params.groupChannel,
280
- groupSpace: params.groupSpace,
281
- spawnedBy: params.spawnedBy,
282
- senderId: params.senderId,
283
- senderName: params.senderName,
284
- senderUsername: params.senderUsername,
285
- senderE164: params.senderE164,
176
+ toolPolicyMessageProvider: params.messageProvider ?? params.messageChannel,
177
+ ...params.onToolResult ? { questionPrompt: {
178
+ send: params.onToolResult,
179
+ messageChannel: messageToolProvider
180
+ } } : {},
286
181
  inputProvenance: params.inputProvenance,
287
182
  trustedInternalHandoff: params.trustedInternalHandoff,
288
- scheduledToolPolicy: params.scheduledToolPolicy
183
+ allowGatewaySubagentBinding: params.allowGatewaySubagentBinding || isForcedPrivateQaCodexRuntime(),
184
+ sessionKey: input.sandboxSessionKey,
185
+ runSessionKey: params.sessionKey && params.sessionKey !== input.sandboxSessionKey ? params.sessionKey : void 0,
186
+ sessionId: params.sessionId,
187
+ runId: params.runId,
188
+ memoryAudience: params.memoryAudience,
189
+ agentDir,
190
+ preparedModelRuntime: params.preparedModelRuntime,
191
+ cwd: input.effectiveCwd ?? input.effectiveWorkspace,
192
+ workspaceDir: input.effectiveWorkspace,
193
+ spawnWorkspaceDir: input.effectiveCwd && input.effectiveCwd !== input.effectiveWorkspace ? input.resolvedWorkspace : resolveAttemptSpawnWorkspaceDir({
194
+ sandbox: input.sandbox,
195
+ resolvedWorkspace: input.resolvedWorkspace
196
+ }),
197
+ config: params.config,
198
+ skillsSnapshot: params.skillsSnapshot,
199
+ ...params.skillLibraryAuthoring ? { skillWorkshop: { libraryAuthoring: params.skillLibraryAuthoring } } : {},
200
+ authProfileStore: params.toolAuthProfileStore ?? params.authProfileStore,
201
+ abortSignal: input.runAbortController.signal,
202
+ emitBeforeToolCallDiagnostics: false,
203
+ modelProvider: params.model.provider,
204
+ modelId: params.modelId,
205
+ modelCompat: params.model.compat && typeof params.model.compat === "object" ? params.model.compat : void 0,
206
+ modelApi: params.model.api,
207
+ modelContextWindowTokens: params.model.contextWindow,
208
+ delegationCapability: params.delegationCapability,
209
+ modelAuthMode: await resolveModelAuthModeAsync(params.model.provider, params.config, params.toolAuthProfileStore ?? params.authProfileStore, { workspaceDir: input.effectiveWorkspace }),
210
+ suppressManagedWebSearch: false,
211
+ webFetchHostnameAllowlistRef,
212
+ hookChannelId: resolveCodexAppServerHookChannelId(params, input.sandboxSessionKey),
213
+ modelHasVision,
214
+ computerContextEpoch: input.computerContextEpoch,
215
+ oneShotCliRun: params.oneShotCliRun,
216
+ registerRunCleanup: input.registerRunCleanup,
217
+ requireExplicitMessageTarget: params.requireExplicitMessageTarget ?? isSubagentSessionKey(params.sessionKey),
218
+ disableMessageTool: input.ignoreDisableMessageTool ? false : params.disableMessageTool,
219
+ forceMessageTool: shouldForceMessageTool(messagePolicyParams),
220
+ enableHeartbeatTool: params.trigger === "heartbeat" || input.forceHeartbeatTool === true,
221
+ forceHeartbeatTool: params.trigger === "heartbeat" || input.forceHeartbeatTool === true,
222
+ onYield: (message, acknowledgment) => {
223
+ input.onYieldDetected(message, acknowledgment);
224
+ input.onCodexAppServerEvent?.({
225
+ stream: "codex_app_server.tool",
226
+ data: {
227
+ name: "sessions_yield",
228
+ message
229
+ }
230
+ });
231
+ },
232
+ claimYieldCompletion: input.claimYieldCompletion,
233
+ recordToolPrepStage: (name) => {
234
+ toolBuildStages.mark(name);
235
+ },
236
+ onToolOutcome: params.onToolOutcome,
237
+ isTurnTainted: params.isTurnTainted,
238
+ allocateToolOutcomeOrdinal: params.allocateToolOutcomeOrdinal,
239
+ cronCreatorToolAllowlistRef: input.cronCreatorToolAllowlistRef,
240
+ cronCreatorToolAllowlistCaptureRef: input.cronCreatorToolAllowlistCaptureRef,
241
+ cronCreatorAuthorityUnavailableReason: input.cronCreatorAuthorityUnavailableReason
242
+ };
243
+ input.onMessageToolTargetResolved?.(options.requireExplicitMessageTarget === true);
244
+ const allTools = await createCodexHostToolSurface(params, options, { cwd: input.effectiveCwd ?? input.effectiveWorkspace }, input.resolveCronCreatorToolAuthority);
245
+ toolBuildStages.mark("create-openclaw-coding-tools");
246
+ const preNormalizationDiagnostics = [];
247
+ const readableAllToolProjection = filterProviderNormalizableTools(allTools);
248
+ preNormalizationDiagnostics.push(...readableAllToolProjection.diagnostics);
249
+ const readableAllTools = [...readableAllToolProjection.tools];
250
+ const normallyProfiledTools = filterCodexDynamicTools(readableAllTools, input.pluginConfig, { disabledNativeSurface: input.nativeToolSurfaceEnabled === false ? { preserveShell: !isCodexMemoryFlushRun(params) && input.sandbox?.enabled !== true && nativeExecutionPolicy.effectiveExecHost !== "node" } : void 0 });
251
+ const systemAgentTool = (input.isHostScopedToolActive?.("openclaw") ?? isHostScopedAgentToolActive("openclaw")) && isSystemAgentOnlyCodexDynamicToolAllowlist(params.toolsAllow) && readableAllTools.find((tool) => tool.name === "openclaw" && tool.catalogMode === "direct-only");
252
+ const profileFilteredTools = systemAgentTool ? [systemAgentTool, ...normallyProfiledTools.filter((tool) => tool.name !== "openclaw")] : normallyProfiledTools;
253
+ const codexFilteredTools = await addShellDynamicTools(isCodexMemoryFlushRun(params) ? readableAllTools.filter((tool) => CODEX_MEMORY_FLUSH_DYNAMIC_TOOL_ALLOW.has(normalizeCodexDynamicToolName(tool.name))) : profileFilteredTools, readableAllTools, input, nativeExecutionPolicy);
254
+ toolBuildStages.mark("codex-filtering");
255
+ const visionFilteredTools = filterCodexVisionTools(codexFilteredTools, {
256
+ modelHasVision,
257
+ nativeImageInspectionEnabled: input.nativeToolSurfaceEnabled === true
289
258
  });
290
- persistentWebSearchAllowed = webSearchPolicy.persistentAllowed && (persistentHostedWebSearchEligible || !webSearchPolicy.allowed || isCodexMemoryFlushRun(params));
291
- nativeWebSearchAllowed = webSearchPlan.kind === "native-hosted" && webSearchPolicy.allowed && !isCodexMemoryFlushRun(params);
292
- }
293
- input.onPersistentWebSearchPolicyResolved?.(persistentWebSearchAllowed);
294
- const filteredTools = applyEmbeddedAttemptToolsAllow(visionFilteredTools, toolRunContext.runtimeToolAllowlist, {
295
- toolMeta: getPluginToolMeta,
296
- toolAliases: (tool) => {
297
- const normalized = normalizeCodexDynamicToolName(tool.name);
298
- return normalized === "sandbox_exec" || normalized === "gateway_exec" || normalized === "node_exec" ? ["exec"] : normalized === "sandbox_process" || normalized === "gateway_process" ? ["exec", "process"] : [];
259
+ toolBuildStages.mark("vision-filtering");
260
+ const webSearchPresent = visionFilteredTools.some((tool) => tool.name === "web_search");
261
+ const persistentCodexWebSearchSurface = params.config?.tools?.web?.search?.enabled !== false && !isCodexDynamicToolExcluded(input.pluginConfig, ["web_search"]);
262
+ const persistentHostedWebSearchEligible = resolveCodexWebSearchPlan({
263
+ config: params.config,
264
+ nativeProviderWebSearchSupport: input.nativeProviderWebSearchSupport
265
+ }).kind === "native-hosted";
266
+ let nativeWebSearchAllowed = false;
267
+ let persistentWebSearchAllowed = webSearchPresent;
268
+ if ((input.onPersistentWebSearchPolicyResolved || webSearchPlan.kind === "native-hosted" && (input.onWebSearchPolicyResolved || webSearchPlan.webFetchHostnameAllowlist)) && !webSearchPresent && persistentCodexWebSearchSurface) {
269
+ const webSearchPolicy = (await import("openclaw/plugin-sdk/agent-harness")).resolveWebSearchToolPolicy({
270
+ config: params.config,
271
+ modelProvider: params.model.provider,
272
+ modelId: params.modelId,
273
+ agentId: input.policyAgentId,
274
+ sessionKey: input.sandboxSessionKey,
275
+ sessionId: params.sessionId,
276
+ ...persistentHostedWebSearchEligible ? { runtimeToolAllowlist: toolRunContext.runtimeToolAllowlist } : {},
277
+ sandboxToolPolicy: input.sandbox?.tools,
278
+ messageProvider: messageToolProvider,
279
+ agentAccountId: params.agentAccountId,
280
+ groupId: params.groupId,
281
+ groupChannel: params.groupChannel,
282
+ groupSpace: params.groupSpace,
283
+ spawnedBy: params.spawnedBy,
284
+ senderId: params.senderId,
285
+ senderName: params.senderName,
286
+ senderUsername: params.senderUsername,
287
+ senderE164: params.senderE164,
288
+ inputProvenance: params.inputProvenance,
289
+ trustedInternalHandoff: params.trustedInternalHandoff,
290
+ scheduledToolPolicy: params.scheduledToolPolicy
291
+ });
292
+ persistentWebSearchAllowed = webSearchPolicy.persistentAllowed && (persistentHostedWebSearchEligible || !webSearchPolicy.allowed || isCodexMemoryFlushRun(params));
293
+ nativeWebSearchAllowed = webSearchPlan.kind === "native-hosted" && webSearchPolicy.allowed && !isCodexMemoryFlushRun(params);
299
294
  }
300
- });
301
- toolBuildStages.mark("allowlist-filter");
302
- const normalizedTools = normalizeAgentRuntimeTools({
303
- runtimePlan: input.ignoreRuntimePlan ? void 0 : params.runtimePlan,
304
- tools: filteredTools,
305
- provider: params.provider,
306
- config: params.config,
307
- workspaceDir: input.effectiveWorkspace,
308
- env: process.env,
309
- modelId: params.modelId,
310
- modelApi: params.model.api,
311
- model: params.model,
312
- allowProviderRuntimePluginLoad: input.ignoreRuntimePlan ? false : void 0,
313
- onPreNormalizationSchemaDiagnostics: (diagnostics) => preNormalizationDiagnostics.push(...diagnostics)
314
- });
315
- toolBuildStages.mark("runtime-normalization");
316
- const webSearchAllowed = nativeWebSearchAllowed || normalizedTools.some((tool) => tool.name === "web_search");
317
- webFetchHostnameAllowlistRef.value = webSearchAllowed ? webSearchPlan.webFetchHostnameAllowlist : void 0;
318
- input.onWebSearchPolicyResolved?.(webSearchAllowed);
319
- const webSearchFilteredTools = webSearchPlan.suppressManagedWebSearch ? normalizedTools.filter((tool) => tool.name !== "web_search") : normalizedTools;
320
- const exposedTools = placeDisabledNativeShellToolsInDirectNamespace(webSearchFilteredTools, input.nativeToolSurfaceEnabled);
321
- if (preNormalizationDiagnostics.length > 0) embeddedAgentLog.warn(`codex app-server quarantined ${preNormalizationDiagnostics.length} unsupported runtime tool schema${preNormalizationDiagnostics.length === 1 ? "" : "s"} before dynamic tool registration`, {
322
- runId: params.runId,
323
- sessionId: params.sessionId,
324
- diagnostics: preNormalizationDiagnostics.map((diagnostic) => ({
325
- index: diagnostic.toolIndex,
326
- tool: diagnostic.toolName,
327
- violations: diagnostic.violations.slice(0, 12),
328
- violationCount: diagnostic.violations.length
329
- }))
330
- });
331
- const summary = toolBuildStages.snapshot();
332
- if (shouldWarnCodexDynamicToolBuildStageSummary(summary, input.profilerEnabled)) {
333
- const phase = input.forceHeartbeatTool ? "registered-tools" : "runtime-tools";
334
- embeddedAgentLog.warn(`codex app-server dynamic tool build timings runId=${params.runId} sessionId=${params.sessionId} phase=${phase} totalMs=${summary.totalMs} stages=${formatStageTimings(summary.stages)}`, {
295
+ input.onPersistentWebSearchPolicyResolved?.(persistentWebSearchAllowed);
296
+ const filteredTools = applyEmbeddedAttemptToolsAllow(visionFilteredTools, toolRunContext.runtimeToolAllowlist, {
297
+ toolMeta: getPluginToolMeta,
298
+ toolAliases: (tool) => {
299
+ const normalized = normalizeCodexDynamicToolName(tool.name);
300
+ return normalized === "sandbox_exec" || normalized === "gateway_exec" || normalized === "node_exec" ? ["exec"] : normalized === "sandbox_process" || normalized === "gateway_process" ? ["exec", "process"] : [];
301
+ }
302
+ });
303
+ toolBuildStages.mark("allowlist-filter");
304
+ const normalizedTools = normalizeAgentRuntimeTools({
305
+ runtimePlan: input.ignoreRuntimePlan ? void 0 : params.runtimePlan,
306
+ tools: filteredTools,
307
+ provider: params.provider,
308
+ config: params.config,
309
+ workspaceDir: input.effectiveWorkspace,
310
+ env: process.env,
311
+ modelId: params.modelId,
312
+ modelApi: params.model.api,
313
+ model: params.model,
314
+ allowProviderRuntimePluginLoad: input.ignoreRuntimePlan ? false : void 0,
315
+ onPreNormalizationSchemaDiagnostics: (diagnostics) => preNormalizationDiagnostics.push(...diagnostics)
316
+ });
317
+ toolBuildStages.mark("runtime-normalization");
318
+ const webSearchAllowed = nativeWebSearchAllowed || normalizedTools.some((tool) => tool.name === "web_search");
319
+ webFetchHostnameAllowlistRef.value = webSearchAllowed ? webSearchPlan.webFetchHostnameAllowlist : void 0;
320
+ input.onWebSearchPolicyResolved?.(webSearchAllowed);
321
+ const webSearchFilteredTools = webSearchPlan.suppressManagedWebSearch ? normalizedTools.filter((tool) => tool.name !== "web_search") : normalizedTools;
322
+ const exposedTools = placeDisabledNativeShellToolsInDirectNamespace(webSearchFilteredTools, input.nativeToolSurfaceEnabled);
323
+ if (preNormalizationDiagnostics.length > 0) embeddedAgentLog.warn(`codex app-server quarantined ${preNormalizationDiagnostics.length} unsupported runtime tool schema${preNormalizationDiagnostics.length === 1 ? "" : "s"} before dynamic tool registration`, {
335
324
  runId: params.runId,
336
325
  sessionId: params.sessionId,
337
- phase,
338
- totalMs: summary.totalMs,
339
- stages: summary.stages,
340
- allToolCount: readableAllTools.length,
341
- codexFilteredToolCount: codexFilteredTools.length,
342
- visionFilteredToolCount: visionFilteredTools.length,
343
- filteredToolCount: filteredTools.length,
344
- normalizedToolCount: exposedTools.length,
345
- forceHeartbeatTool: input.forceHeartbeatTool === true,
346
- ignoreRuntimePlan: input.ignoreRuntimePlan === true,
347
- nativeToolSurfaceEnabled: input.nativeToolSurfaceEnabled === true
326
+ diagnostics: preNormalizationDiagnostics.map((diagnostic) => ({
327
+ index: diagnostic.toolIndex,
328
+ tool: diagnostic.toolName,
329
+ violations: diagnostic.violations.slice(0, 12),
330
+ violationCount: diagnostic.violations.length
331
+ }))
348
332
  });
333
+ const summary = toolBuildStages.snapshot();
334
+ if (shouldWarnCodexDynamicToolBuildStageSummary(summary, input.profilerEnabled)) {
335
+ const phase = input.forceHeartbeatTool ? "registered-tools" : "runtime-tools";
336
+ embeddedAgentLog.warn(`codex app-server dynamic tool build timings runId=${params.runId} sessionId=${params.sessionId} phase=${phase} totalMs=${summary.totalMs} stages=${formatStageTimings(summary.stages)}`, {
337
+ runId: params.runId,
338
+ sessionId: params.sessionId,
339
+ phase,
340
+ totalMs: summary.totalMs,
341
+ stages: summary.stages,
342
+ allToolCount: readableAllTools.length,
343
+ codexFilteredToolCount: codexFilteredTools.length,
344
+ visionFilteredToolCount: visionFilteredTools.length,
345
+ filteredToolCount: filteredTools.length,
346
+ normalizedToolCount: exposedTools.length,
347
+ forceHeartbeatTool: input.forceHeartbeatTool === true,
348
+ ignoreRuntimePlan: input.ignoreRuntimePlan === true,
349
+ nativeToolSurfaceEnabled: input.nativeToolSurfaceEnabled === true
350
+ });
351
+ }
352
+ return exposedTools;
353
+ } finally {
354
+ if (!input.nativeExecutionPolicy) preparedExecution.release();
349
355
  }
350
- return exposedTools;
351
356
  }
352
- function shouldEnableCodexAppServerNativeToolSurface(params, sandbox, options = {}) {
357
+ function shouldEnableCodexAppServerNativeToolSurface(params, sandbox, options) {
353
358
  if (isCodexResponsesOAuthRun(params) || params.requireWorkspaceOnly === true || params.pluginHarnessToolPolicyRestricted === true || isCodexMemoryFlushRun(params) || params.disableTools) return false;
354
- if (!resolveCodexNativeExecutionPolicyForRun(params, {
355
- agentId: options.agentId,
356
- runtimeSessionKey: options.runtimeSessionKey,
357
- sandbox
358
- }).nativeToolSurfaceAllowed) return false;
359
+ if (!options.nativeExecutionPolicy.policy.nativeToolSurfaceAllowed) return false;
359
360
  const toolsAllow = params.toolsAllow;
360
361
  return (toolsAllow === void 0 || toolsAllow.some((name) => normalizeCodexDynamicToolName(name) === "*")) && canCodexAppServerNativeToolSurfaceHonorSandbox(sandbox, options);
361
362
  }
362
- function resolveCodexNativeExecutionPolicyForRun(params, options = {}) {
363
- return resolveCodexNativeExecutionPolicy({
364
- config: params.config,
365
- sessionKey: options.runtimeSessionKey?.trim() || params.sandboxSessionKey?.trim() || params.sessionKey?.trim() || params.sessionId,
366
- sessionId: params.sessionId,
367
- agentId: options.agentId,
368
- execOverrides: params.execOverrides,
369
- sandboxAvailable: options.sandbox === null ? false : options.sandbox?.enabled,
370
- readRuntimeSessionEntry: true
371
- });
372
- }
373
363
  function canCodexAppServerNativeToolSurfaceHonorSandbox(sandbox, options = {}) {
374
364
  if (!sandbox?.enabled) return true;
375
365
  return options.sandboxExecServerEnabled === true && (sandbox.backend || isCodexRemoteExecPlacementSandbox(sandbox)) && CODEX_NATIVE_TOOL_REQUIREMENTS.every((toolName) => isToolAllowed(sandbox.tools, toolName));