@openclaw/codex 2026.8.1-beta.3 → 2026.8.2

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 (69) hide show
  1. package/dist/api.js +5 -6
  2. package/dist/{attempt-client-cleanup-URjUlCHg.js → attempt-client-cleanup-CpVfwctT.js} +47 -5
  3. package/dist/{auth-binding-B4FfbcCg.js → auth-binding-Ds_QVm-X.js} +18 -3
  4. package/dist/{binding-connection-DAvZwp96.js → binding-connection-CF7BmrDk.js} +2 -2
  5. package/dist/{bounded-turn-4BjrZEwW.js → bounded-turn-DRC3hcjm.js} +16 -20
  6. package/dist/{capabilities-CH3K57v4.js → capabilities-D6m_TdVy.js} +1 -1
  7. package/dist/cli-metadata.js +1 -1
  8. package/dist/{command-formatters-D0nZ3qtd.js → command-formatters--UToCokS.js} +4 -3
  9. package/dist/{command-handlers-DC86lgT4.js → command-handlers-CLFx2Ypa.js} +114 -79
  10. package/dist/{compact-COqgBRny.js → compact-5xqW1oCh.js} +13 -12
  11. package/dist/{config-CpNeo5AE.js → config-CcYL77O6.js} +350 -288
  12. package/dist/{conversation-binding-data-CW2GuupV.js → conversation-binding-data-BiodpIzq.js} +2 -1
  13. package/dist/doctor-contract-api.js +121 -16
  14. package/dist/{dynamic-tools-fJZhl4CE.js → dynamic-tools-BmeXjwNZ.js} +243 -1002
  15. package/dist/{effective-mcp-catalog-4YKn51aG.js → effective-mcp-catalog-XXQKgK1U.js} +2 -2
  16. package/dist/{event-projector-assistant-message-BwxV4d6N.js → event-projector-assistant-message-C5-Ds8mA.js} +18 -1
  17. package/dist/{event-projector-usage-CLwNEJqW.js → event-projector-usage-B2r5vhWH.js} +9 -14
  18. package/dist/{harness-DoKQcF8n.js → harness-BgeB7LnD.js} +42 -52
  19. package/dist/harness.js +1 -1
  20. package/dist/index.js +308 -306
  21. package/dist/{isolated-completion-DPMtlH9r.js → isolated-completion-CxTus3vZ.js} +4 -4
  22. package/dist/launch-args-sXOAg0SX.js +84 -0
  23. package/dist/{managed-binary-By4FZC6i.js → managed-binary-ZkGodW19.js} +43 -7
  24. package/dist/media-understanding-provider.js +1 -1
  25. package/dist/model-catalog-DULBcniB.js +101 -0
  26. package/dist/{models-CZw1wClT.js → models-DaWfETQk.js} +27 -29
  27. package/dist/{native-subagent-monitor-GGq3RnOo.js → native-subagent-monitor-vXYUZH37.js} +226 -129
  28. package/dist/{node-exec-server.runtime-Bsu1LdFZ.js → node-exec-server.runtime-DirKVZ5h.js} +9 -6
  29. package/dist/{plugin-approval-roundtrip-C75Yiiwc.js → plugin-approval-roundtrip-CCWQGlAI.js} +2 -1
  30. package/dist/{plugin-marketplace-discovery-CSWDkMrP.js → plugin-marketplace-discovery-BXjIFEiw.js} +38 -46
  31. package/dist/{plugin-metadata-cache-BXH5NF-4.js → plugin-metadata-cache-DQQm4gWT.js} +163 -136
  32. package/dist/{protocol-validators-VAVyEnDp.js → protocol-validators-Bg5rpNxk.js} +148 -5
  33. package/dist/{rate-limits-BI1dMHDG.js → rate-limits-BqHEHXQJ.js} +3 -2
  34. package/dist/{sandbox-guard-C1qEeZ5C.js → request-BWxweEdK.js} +183 -2
  35. package/dist/{run-attempt-BV3HzuCf.js → run-attempt-BVLE4Gbi.js} +706 -517
  36. package/dist/{runtime-artifact-BvyT1uyd.js → runtime-artifact-D9pYp4zL.js} +3 -3
  37. package/dist/{session-binding-BTrLf9Qm.js → session-binding-D0zinCP1.js} +195 -122
  38. package/dist/{session-catalog-ezP_UcRM.js → session-catalog-eMhVm0Ql.js} +448 -313
  39. package/dist/session-catalog-home-id-Dt2GiG5o.js +112 -0
  40. package/dist/{session-cli-B1hKvfkI.js → session-cli-B2lyjJA0.js} +1 -1
  41. package/dist/session-history-C5J1AKzG.js +87 -0
  42. package/dist/session-permission-policy-ScnAyG90.js +160 -0
  43. package/dist/session-retirement-CtUtUTr9.js +90 -0
  44. package/dist/{session-upstream-marker-D_2npHlA.js → session-upstream-marker-gqrYIRHk.js} +2 -3
  45. package/dist/settled-turn-context-Bk3IUwod.js +290 -0
  46. package/dist/settled-turn-finalizer-BXLN9PfJ.js +104 -0
  47. package/dist/{shared-client-Dw-rzii0.js → shared-client-B1tT5U6r.js} +1738 -806
  48. package/dist/{side-question-DbXkJZzg.js → side-question-CZ-mCw-t.js} +76 -43
  49. package/dist/{thread-lifecycle-DKdrnTMX.js → thread-lifecycle-CGGKP720.js} +991 -455
  50. package/dist/{thread-ownership-i2NBwDUL.js → thread-ownership-RkaoZCmQ.js} +18 -8
  51. package/dist/{plugin-app-cache-key-DMNQ8Zi8.js → thread-resume-BFt1-ZDa.js} +55 -8
  52. package/dist/{transcript-mirror-BU0_LKAL.js → transcript-mirror-1ep4XjzF.js} +124 -18
  53. package/dist/transport-stdio-NT_Dpd9V.js +724 -0
  54. package/dist/{upstream-prompt-provenance-CFmsKwr9.js → upstream-prompt-provenance-LphB8slG.js} +8 -4
  55. package/dist/{upstream-session-fork-BDVJCLAD.js → upstream-session-fork-Dc8BFExw.js} +76 -90
  56. package/dist/{usage-9dKJCgcy.js → usage-DUhd58gI.js} +3 -3
  57. package/dist/{web-search-provider.runtime-DCdx4DGu.js → web-search-provider.runtime-BEmlE7ov.js} +3 -3
  58. package/openclaw.plugin.json +19 -1
  59. package/package.json +8 -8
  60. package/dist/app-server-policy-bg5QPSVP.js +0 -25
  61. package/dist/command-rpc-xUIIonsO.js +0 -90
  62. package/dist/incognito-session-ET_ufDH-.js +0 -2
  63. package/dist/model-catalog-CmGoqVKB.js +0 -48
  64. package/dist/request-DSK0W6YI.js +0 -157
  65. package/dist/session-catalog-home-id-BNwAJ9D7.js +0 -18
  66. package/dist/session-retirement-CE4iMiLh.js +0 -36
  67. package/dist/settled-turn-finalizer-Dx1onIqg.js +0 -328
  68. package/dist/thread-resume-CdJk2Ehf.js +0 -30
  69. package/dist/transport-stdio-DhoGy33Z.js +0 -99
@@ -1,17 +1,19 @@
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";
1
+ import { C as isCodexRemoteExecPlacementSandbox, D as resolveOpenClawExecPolicyForCodexAppServer, S as isCodexPairedNodeRemoteExecPlacementSandbox, T as readCodexPluginConfig, m as resolveCodexModelBackedReviewerPolicyContext, p as canUseCodexModelBackedApprovalsReviewerForModel, r as resolveCodexAppServerHomeScope, u as shouldAutoApproveCodexAppServerApprovals, v as readCodexRequirementsToml, w as isCodexSandboxExecServerEnabled } from "./config-CcYL77O6.js";
2
+ import { C as withLeasedCodexAppServerClientStartSelectionRetry, Ht as isJsonObject, K as isCodexAppServerIndeterminateRequestCancellationError, Lt as resolveCodexAppServerPreparedAuthHandoff, Ot as readRecentCodexRateLimits, U as isCodexAppServerApprovalRequest, _t as ensureCodexAppServerClientRuntime, at as resolveDynamicToolCallTimeoutMs, c as getLeasedSharedCodexAppServerClient, dt as resolveCodexToolAbortTerminalReason, et as createCodexElicitationResponse, m as releaseCodexAppServerClientLease, tt as handleDynamicToolCallWithTimeout } from "./shared-client-B1tT5U6r.js";
3
+ import { d as sessionBindingIdentity } from "./session-binding-D0zinCP1.js";
4
+ import { a as assertCodexThreadForkResponse, c as assertCodexTurnStartResponse, d as readCodexTurn, l as readCodexDynamicToolCallParams } from "./protocol-validators-Bg5rpNxk.js";
5
+ import { f as unsubscribeCodexThreadBestEffort, g as isCodexNotificationForTurn, s as isCodexAlreadyTerminalInterruptError, u as retireUnsafeCodexTurnClientBestEffort } from "./attempt-client-cleanup-CpVfwctT.js";
6
+ import { A as readCodexSupportedReasoningEfforts, E as resolveCodexAppServerRequestModelSelection, L as filterCodexDynamicTools, O as resolveCodexBindingModelProviderFallback, T as resolveCodexAppServerModelProvider, U as resolveCodexDynamicToolsLoading, c as buildCodexNativeHookRelayConfig, d as emitCodexNativePreToolUseFailureDiagnostic, et as buildCodexPluginAppsConfigPatchFromPolicyContext, k as resolveReasoningEffort, l as buildCodexNativeHookRelayDisabledConfig, o as CODEX_NATIVE_HOOK_RELAY_EVENTS, ot as mergeCodexThreadConfigs, v as buildCodexRuntimeThreadConfig, w as CODEX_NATIVE_PERSONALITY_NONE, x as resolveCodexWebSearchPlan } from "./thread-lifecycle-CGGKP720.js";
7
+ import { s as resolveCodexNativeExecutionBlock } from "./request-BWxweEdK.js";
8
+ import { n as formatCodexUsageLimitErrorMessage } from "./rate-limits-BqHEHXQJ.js";
9
+ import { a as resolveCodexAppServerForModelProvider, i as resolveCodexSessionPermissionCwd, n as applyCodexSessionPermissionPolicy, r as resolveCodexEffectiveSessionPermissionPolicy, t as CODEX_SESSION_PERMISSION_EXEC_MODES } from "./session-permission-policy-ScnAyG90.js";
10
+ import { n as resolveCodexBindingAppServerConnection, t as requireCodexSupervisionModelSelection } from "./binding-connection-CF7BmrDk.js";
11
+ import { C as shouldRequireCodexSandboxExecServerEnvironment, D as CodexNativeToolLifecycleProjector, S as shouldEnableCodexAppServerNativeToolSurface, T as filterCodexVisionTools, a as emitDynamicToolStartedDiagnostic, b as resolveCodexNodePlacementToolConstructionPlan, d as releaseCodexSandboxExecServerEnvironment, i as emitDynamicToolErrorDiagnostic, l as resolveCodexProviderWebSearchSupportForClient, o as emitDynamicToolTerminalDiagnostic, r as routeCodexAppServerElicitationRequest, s as handleCodexAppServerApprovalRequest, t as createCodexDynamicToolBridge, u as ensureCodexSandboxExecServerEnvironment, v as resolveCodexExternalSandboxPolicyForOpenClawSandbox, x as resolveCodexSandboxEnvironmentSelection, y as resolveCodexMessageToolProvider } from "./dynamic-tools-BmeXjwNZ.js";
12
12
  import { readStringField } from "openclaw/plugin-sdk/string-coerce-runtime";
13
- import { buildAgentHookContextChannelFields, embeddedAgentLog, formatErrorMessage, registerNativeHookRelay, resolveAgentDir, resolveAttemptSpawnWorkspaceDir, resolveModelAuthMode, resolveSandboxContext, resolveSessionAgentIds, supportsModelTools } from "openclaw/plugin-sdk/agent-harness-runtime";
13
+ import { buildAgentHookContextChannelFields, embeddedAgentLog, formatErrorMessage, registerNativeHookRelay, resolveAgentDir, resolveAttemptSpawnWorkspaceDir, resolveModelAuthMode, resolveSandboxContext, supportsModelTools } from "openclaw/plugin-sdk/agent-harness-runtime";
14
14
  import { randomUUID } from "node:crypto";
15
+ import { resolveAgentWorkspaceDir } from "openclaw/plugin-sdk/agent-runtime";
16
+ import { resolveSessionAgentIdsStrict } from "openclaw/plugin-sdk/agent-scope-runtime";
15
17
  import { loadExecApprovals } from "openclaw/plugin-sdk/exec-approvals-runtime";
16
18
  //#region extensions/codex/src/app-server/side-question.ts
17
19
  const SIDE_QUESTION_COMPLETION_TIMEOUT_MS = 6e5;
@@ -21,8 +23,8 @@ var CodexSideQuestionTimeoutError = class extends Error {
21
23
  this.name = "TimeoutError";
22
24
  }
23
25
  };
24
- const CODEX_SIDE_NATIVE_HOOK_RELAY_MIN_TTL_MS = 30 * 6e4;
25
- const CODEX_SIDE_NATIVE_HOOK_RELAY_TTL_GRACE_MS = 5 * 6e4;
26
+ const CODEX_SIDE_NATIVE_HOOK_RELAY_MIN_TTL_MS = 18e5;
27
+ const CODEX_SIDE_NATIVE_HOOK_RELAY_TTL_GRACE_MS = 3e5;
26
28
  const CODEX_SIDE_NATIVE_HOOK_RELAY_STARTUP_REQUEST_COUNT = 3;
27
29
  const CODEX_SIDE_NATIVE_HOOK_RELAY_EVENTS_WITH_APP_SERVER_APPROVALS = CODEX_NATIVE_HOOK_RELAY_EVENTS.filter((event) => event !== "permission_request");
28
30
  const SIDE_BOUNDARY_PROMPT = `Side conversation boundary.
@@ -57,15 +59,18 @@ async function runCodexAppServerSideQuestion(params, options) {
57
59
  config: params.cfg
58
60
  }));
59
61
  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.");
62
+ if (isCodexPairedNodeRemoteExecPlacementSandbox(params.sandbox)) throw new Error("Normal Codex turns are supported on nodes, but /btw is not yet bound to the active placement.");
61
63
  const pluginConfig = readCodexPluginConfig(options.pluginConfig);
62
- const { sessionAgentId } = resolveSessionAgentIds({
64
+ const { sessionAgentId } = resolveSessionAgentIdsStrict({
63
65
  sessionKey: params.sessionKey,
64
66
  config: params.cfg,
65
67
  agentId: params.agentId
66
68
  });
69
+ const agentWorkspaceDir = params.workspaceDir?.trim() || resolveAgentWorkspaceDir(params.cfg, sessionAgentId);
67
70
  const execPolicy = resolveOpenClawExecPolicyForCodexAppServer({
68
- approvals: loadExecApprovals(),
71
+ permissionMode: params.sessionEntry.permissionMode,
72
+ execOverrides: params.sessionEntry.permissionMode ? { mode: CODEX_SESSION_PERMISSION_EXEC_MODES[params.sessionEntry.permissionMode] } : void 0,
73
+ approvals: params.sessionEntry.permissionMode === "full" ? void 0 : loadExecApprovals(),
69
74
  config: params.cfg,
70
75
  agentId: sessionAgentId
71
76
  });
@@ -125,8 +130,41 @@ async function runCodexAppServerSideQuestion(params, options) {
125
130
  config: params.cfg,
126
131
  agentDir: params.agentDir
127
132
  });
128
- const appServer = connection.appServer;
129
- const cwd = binding.cwd || params.workspaceDir || process.cwd();
133
+ const reviewerContext = {
134
+ modelProvider: reviewerPolicyContext.modelProvider,
135
+ model: reviewerPolicyContext.model,
136
+ config: params.cfg,
137
+ env: process.env,
138
+ agentDir: params.agentDir
139
+ };
140
+ const appServer = resolveCodexAppServerForModelProvider({
141
+ appServer: applyCodexSessionPermissionPolicy({
142
+ appServer: connection.appServer,
143
+ permissionMode: params.sessionEntry.permissionMode,
144
+ sessionRoot: params.sessionEntry.sessionRoot,
145
+ defaultRoot: agentWorkspaceDir,
146
+ pluginConfig,
147
+ canUseAutoReview: canUseCodexModelBackedApprovalsReviewerForModel(reviewerContext),
148
+ requirementsToml: readCodexRequirementsToml({}),
149
+ policyLocked: usesSupervisionConnection,
150
+ execMode: execPolicy.mode
151
+ }),
152
+ ...reviewerContext,
153
+ provider: reviewerContext.modelProvider
154
+ });
155
+ const sessionPermissionPolicy = resolveCodexEffectiveSessionPermissionPolicy({
156
+ appServer,
157
+ permissionMode: params.sessionEntry.permissionMode,
158
+ sessionRoot: params.sessionEntry.sessionRoot,
159
+ defaultRoot: agentWorkspaceDir
160
+ });
161
+ const cwd = resolveCodexSessionPermissionCwd({
162
+ permissionMode: params.sessionEntry.permissionMode,
163
+ sessionRoot: params.sessionEntry.sessionRoot,
164
+ defaultRoot: agentWorkspaceDir,
165
+ requestedCwd: binding.cwd,
166
+ fallbackCwd: agentWorkspaceDir
167
+ });
130
168
  const runId = params.opts?.runId ?? randomUUID();
131
169
  const effectiveParams = supervisionModelSelection ? {
132
170
  ...params,
@@ -153,6 +191,9 @@ async function runCodexAppServerSideQuestion(params, options) {
153
191
  runId,
154
192
  timeoutMs: appServer.requestTimeoutMs
155
193
  });
194
+ sideRunParams.permissionMode = sessionPermissionPolicy?.mode;
195
+ sideRunParams.sessionRoot = sessionPermissionPolicy?.root;
196
+ sideRunParams.execOverrides = sessionPermissionPolicy && { mode: sessionPermissionPolicy.execMode };
156
197
  const sandboxExecServerEnabled = isCodexSandboxExecServerEnabled(pluginConfig, params.sandbox);
157
198
  const nativeToolSurfaceEnabled = shouldEnableCodexAppServerNativeToolSurface(sideRunParams, params.sandbox ?? void 0, {
158
199
  agentId: sideRunParams.agentId,
@@ -262,23 +303,8 @@ async function runCodexAppServerSideQuestion(params, options) {
262
303
  sandboxEnvironmentClient = targetClient;
263
304
  };
264
305
  try {
265
- const modelScopedAppServer = resolveCodexAppServerForModelProvider({
266
- appServer,
267
- provider: reviewerPolicyContext.modelProvider,
268
- model: reviewerPolicyContext.model,
269
- config: params.cfg,
270
- env: process.env,
271
- agentDir: params.agentDir
272
- });
273
- const useModelScopedPolicy = !canUseCodexModelBackedApprovalsReviewerForModel({
274
- modelProvider: reviewerPolicyContext.modelProvider,
275
- model: reviewerPolicyContext.model,
276
- config: params.cfg,
277
- env: process.env,
278
- agentDir: params.agentDir
279
- });
280
- const approvalPolicy = useModelScopedPolicy ? modelScopedAppServer.approvalPolicy : binding.approvalPolicy ?? modelScopedAppServer.approvalPolicy;
281
- const sandbox = useModelScopedPolicy ? modelScopedAppServer.sandbox : binding.sandbox ?? modelScopedAppServer.sandbox;
306
+ const approvalPolicy = appServer.approvalPolicy;
307
+ const sandbox = appServer.sandbox;
282
308
  const { toolBridge, webSearchPlan } = await createCodexSideToolBridge({
283
309
  params: effectiveParams,
284
310
  cwd,
@@ -294,6 +320,7 @@ async function runCodexAppServerSideQuestion(params, options) {
294
320
  modelProviderOverride: modelSelection.modelProvider,
295
321
  signal: runAbortController.signal
296
322
  }) : "unsupported",
323
+ sessionPermissionPolicy,
297
324
  runId,
298
325
  signal: runAbortController.signal
299
326
  });
@@ -329,7 +356,7 @@ async function runCodexAppServerSideQuestion(params, options) {
329
356
  nativeHookRelay,
330
357
  autoApprove: shouldAutoApproveCodexAppServerApprovals({
331
358
  approvalPolicy,
332
- networkProxy: modelScopedAppServer.networkProxy,
359
+ networkProxy: appServer.networkProxy,
333
360
  sandbox
334
361
  }),
335
362
  signal: runAbortController.signal,
@@ -434,7 +461,8 @@ async function runCodexAppServerSideQuestion(params, options) {
434
461
  nativeCodeModeEnabled: nativeToolSurfaceEnabled,
435
462
  nativeCodeModeOnlyEnabled: appServer.codeModeOnly
436
463
  });
437
- const threadConfig = mergeCodexThreadConfigs(nativeHookRelayConfig, runtimeThreadConfig, binding.pluginAppPolicyContext ? buildCodexPluginAppsConfigPatchFromPolicyContext(binding.pluginAppPolicyContext) : void 0, modelScopedAppServer.networkProxy?.configPatch) ?? runtimeThreadConfig;
464
+ const pluginAppsConfigPatch = binding.pluginAppPolicyContext ? buildCodexPluginAppsConfigPatchFromPolicyContext(binding.pluginAppPolicyContext) : void 0;
465
+ const threadConfig = mergeCodexThreadConfigs(nativeHookRelayConfig, runtimeThreadConfig, pluginAppsConfigPatch, appServer.networkProxy?.configPatch) ?? runtimeThreadConfig;
438
466
  const forkResponse = assertCodexThreadForkResponse(await withLeasedCodexAppServerClientStartSelectionRetry({
439
467
  lease: clientLease,
440
468
  options: clientOptions,
@@ -447,15 +475,16 @@ async function runCodexAppServerSideQuestion(params, options) {
447
475
  model: modelSelection.model,
448
476
  ...modelSelection.modelProvider ? { modelProvider: modelSelection.modelProvider } : {},
449
477
  cwd: executionCwd,
478
+ ...sessionPermissionPolicy ? { runtimeWorkspaceRoots: [sessionPermissionPolicy.root] } : {},
450
479
  approvalPolicy,
451
- approvalsReviewer: modelScopedAppServer.approvalsReviewer,
452
- ...sandboxEnvironment || modelScopedAppServer.networkProxy ? {} : { sandbox },
480
+ approvalsReviewer: appServer.approvalsReviewer,
481
+ ...sandboxEnvironment || appServer.networkProxy ? {} : { sandbox },
453
482
  ...serviceTier ? { serviceTier } : {},
454
483
  config: threadConfig,
455
484
  developerInstructions: SIDE_DEVELOPER_INSTRUCTIONS,
456
485
  ephemeral: true,
457
486
  threadSource: "user"
458
- }, requestOptions);
487
+ }, requestOptions());
459
488
  },
460
489
  onClientChange: rebindClientHandlers
461
490
  }));
@@ -667,11 +696,13 @@ async function createCodexSideToolBridge(input) {
667
696
  workspaceDir: input.cwd
668
697
  });
669
698
  const toolConstructionPlan = resolveCodexNodePlacementToolConstructionPlan(sandbox, input.nativeToolSurfaceEnabled);
670
- tools = filterCodexVisionTools(filterCodexDynamicTools(createOpenClawCodingTools({
699
+ const allTools = createOpenClawCodingTools({
671
700
  agentId: input.sessionAgentId,
672
701
  sessionKey: sandboxSessionKey,
673
702
  runSessionKey: input.params.sessionKey && input.params.sessionKey !== sandboxSessionKey ? input.params.sessionKey : void 0,
674
703
  sessionId: input.params.sessionId,
704
+ exec: input.sessionPermissionPolicy && { mode: input.sessionPermissionPolicy.execMode },
705
+ sessionPermissionPolicy: input.sessionPermissionPolicy,
675
706
  runId: input.runId,
676
707
  agentDir: input.params.agentDir ?? resolveAgentDir(input.params.cfg ?? {}, input.sessionAgentId),
677
708
  workspaceDir: input.cwd,
@@ -722,7 +753,9 @@ async function createCodexSideToolBridge(input) {
722
753
  emitBeforeToolCallDiagnostics: false,
723
754
  modelHasVision: runtimeModel.input?.includes("image") ?? false,
724
755
  requireExplicitMessageTarget: true
725
- }), input.pluginConfig), {
756
+ });
757
+ const codexFilteredTools = filterCodexDynamicTools(allTools, input.pluginConfig);
758
+ tools = filterCodexVisionTools(codexFilteredTools, {
726
759
  modelHasVision: runtimeModel.input?.includes("image") ?? false,
727
760
  nativeImageInspectionEnabled: input.nativeToolSurfaceEnabled
728
761
  });