@openclaw/codex 2026.9.4 → 2026.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/assets/activity.svg +30 -0
  2. package/assets/icon.png +0 -0
  3. package/dist/.setup/account-usage-runtime-Eem_WGqY.mjs +75 -0
  4. package/dist/{apply-CvT8tW5i.js → .setup/apply-DDOi8uNx.mjs} +24 -30
  5. package/dist/.setup/async-questions-DdhOCwGi.mjs +27 -0
  6. package/dist/{attempt-client-cleanup-DKHzbwt5.js → .setup/attempt-client-cleanup-CEv1cKwF.mjs} +79 -49
  7. package/dist/.setup/attempt-terminal-gZrxQ35N.mjs +5 -0
  8. package/dist/.setup/attempt-workspace-context-DUVEn_CS.mjs +331 -0
  9. package/dist/{auth-binding-CWlKVccJ.js → .setup/auth-binding-DhLWa_7K.mjs} +1 -1
  10. package/dist/{auth-cache-key-7orQae_j.js → .setup/auth-cache-key-B2mpaI9D.mjs} +9 -81
  11. package/dist/{auth-profile-CwzO4_RG.js → .setup/auth-profile-WqZtZfXN.mjs} +1 -1
  12. package/dist/.setup/auth-profile-health-oHizqgye.mjs +53 -0
  13. package/dist/.setup/auth-profile-recovery-BREezV0L.mjs +14 -0
  14. package/dist/.setup/binding-connection-ThoatDcb.mjs +50 -0
  15. package/dist/.setup/binding-connection.runtime-yoHrABt-.mjs +48 -0
  16. package/dist/{bounded-turn-C_Hneydj.js → .setup/bounded-turn-B2HScEgT.mjs} +143 -32
  17. package/dist/{build-state-BCmg9-5p.js → .setup/build-state-C7EnDVgr.mjs} +1 -1
  18. package/dist/{capabilities-8vx68WLH.js → .setup/capabilities-CDXOOFdZ.mjs} +1 -1
  19. package/dist/{client-B57KWPQx.js → .setup/client-Cs08OXVQ.mjs} +705 -512
  20. package/dist/.setup/client-catalog-response-BMgt_4q4.mjs +285 -0
  21. package/dist/{command-dispatch-BpduNGVf.js → .setup/command-dispatch-B4JuOsOk.mjs} +8 -4
  22. package/dist/{command-formatters-lxlkNZgU.js → .setup/command-formatters-Bmqvr9tO.mjs} +8 -4
  23. package/dist/{command-handlers-tiL9iWj7.js → .setup/command-handlers-DW7Lx9oH.mjs} +137 -186
  24. package/dist/{command-rpc-CR5EOEZX.js → .setup/command-rpc-DixIj3HW.mjs} +47 -23
  25. package/dist/{compact-B_H3AOd7.js → .setup/compact-Du5UvtxA.mjs} +29 -51
  26. package/dist/{config-oIORaQ5T.js → .setup/config-BoTP_mrL.mjs} +5 -4
  27. package/dist/{config-options-CXMq1T-C.js → .setup/config-options-BvaRs51b.mjs} +50 -446
  28. package/dist/{protocol-5bh1G-H7.js → .setup/config-parsing-CcB9iPoq.mjs} +9 -51
  29. package/dist/{config-runtime-D0zGNIHu.js → .setup/config-runtime-C8Rw1m1m.mjs} +2 -2
  30. package/dist/.setup/config-security-BEReZ6go.mjs +380 -0
  31. package/dist/{conversation-binding-DsB4-O7U.js → .setup/conversation-binding-DP-gMrBP.mjs} +29 -38
  32. package/dist/{conversation-binding-data-BiodpIzq.js → .setup/conversation-binding-data-CrcyZk6O.mjs} +1 -1
  33. package/dist/{conversation-control-CtUu1b3m.js → .setup/conversation-control-uK9Jomlc.mjs} +32 -67
  34. package/dist/.setup/cyber-failover-DYwbmf1o.mjs +123 -0
  35. package/dist/.setup/cyber-failover-notice-e9G3J9-e.mjs +17 -0
  36. package/dist/{dynamic-tools-CmN5RAip.js → .setup/dynamic-tools-BDXl-8Cw.mjs} +936 -620
  37. package/dist/{effective-mcp-catalog-Bd73bqA8.js → .setup/effective-mcp-catalog-CvnvnGIe.mjs} +3 -3
  38. package/dist/{ephemeral-turn-D78_VmzO.js → .setup/ephemeral-turn-poidXgek.mjs} +9 -7
  39. package/dist/{event-projector-assistant-message-BmBM4qBV.js → .setup/event-projector-assistant-message-BsruvNrH.mjs} +8 -7
  40. package/dist/{event-projector-items-5VhsECCO.js → .setup/event-projector-items-C6L_5ZiT.mjs} +42 -8
  41. package/dist/{attempt-notifications-C9XufG6l.js → .setup/event-projector-usage-CnBS8Wa3.mjs} +102 -9
  42. package/dist/{harness-C7rRa7bm.js → .setup/harness-a_MsE4-_.mjs} +81 -21
  43. package/dist/{inference-context-Dr_mzvk4.js → .setup/inference-context-D96l9-ew.mjs} +1 -1
  44. package/dist/.setup/inference-proxy-b-aJMSxm.mjs +601 -0
  45. package/dist/{isolated-completion-DWVb5U2J.js → .setup/isolated-completion-BIZFhTNG.mjs} +18 -11
  46. package/dist/.setup/launch-args-DbFCehO7.mjs +196 -0
  47. package/dist/{managed-binary-D22rNEcR.js → .setup/managed-binary-BnshlFag.mjs} +14 -3
  48. package/dist/{managed-thread-store-D1t5jh3G.js → .setup/managed-thread-store-BMqgThVL.mjs} +48 -14
  49. package/dist/{model-catalog-Dq2n8f_p.js → .setup/model-catalog-CfXJf9Ay.mjs} +36 -12
  50. package/dist/{models-PCKOim-h.js → .setup/models-KnqBv0hE.mjs} +3 -3
  51. package/dist/.setup/native-auth-rWbGbMn3.mjs +57 -0
  52. package/dist/{native-subagent-history-DjtPloaU.js → .setup/native-subagent-history-0nYYgo0k.mjs} +43 -35
  53. package/dist/.setup/native-subagent-monitor-D3filLY2.mjs +4859 -0
  54. package/dist/{native-subagent-task-ids-BzTdT0Uw.js → .setup/native-subagent-task-ids-wb8CKZGN.mjs} +98 -44
  55. package/dist/{node-cli-sessions-DKaOmVUh.js → .setup/node-cli-sessions-r3avj02l.mjs} +86 -68
  56. package/dist/.setup/node-exec-server.runtime-BDwWXVpK.mjs +247 -0
  57. package/dist/{plan-7uG-Fp36.js → .setup/plan-CN3VwfNU.mjs} +133 -119
  58. package/dist/{plugin-activation-BYQculil.js → .setup/plugin-activation-DT3MNtqj.mjs} +7 -16
  59. package/dist/{plugin-app-cache-key-d0eKxy7b.js → .setup/plugin-app-cache-key-B2CsSdnV.mjs} +32 -44
  60. package/dist/{plugin-approval-roundtrip-Bz3FT8W5.js → .setup/plugin-approval-roundtrip-C0MZzCuP.mjs} +1 -1
  61. package/dist/{plugin-inventory-oL4Na1ZG.js → .setup/plugin-inventory-BoRei8Z4.mjs} +21 -11
  62. package/dist/{plugin-marketplace-discovery-P-Vndfqq.js → .setup/plugin-marketplace-discovery-CDOi8IFs.mjs} +4 -1
  63. package/dist/{plugin-metadata-cache-ClPJpRio.js → .setup/plugin-metadata-cache-Ctmo83k_.mjs} +226 -141
  64. package/dist/.setup/protocol-CANUwXJ3.mjs +17 -0
  65. package/dist/{provider-MQ8PVkuE.js → .setup/provider-BOsxQHOM.mjs} +9 -5
  66. package/dist/{provider-capabilities-BvCUL69A.js → .setup/provider-capabilities-BfE88FZ5.mjs} +31 -3
  67. package/dist/{rate-limits-CBMmWBr9.js → .setup/rate-limits-CMU3DUD0.mjs} +174 -151
  68. package/dist/{request-B7hEkBGq.js → .setup/request-D2L0zMrq.mjs} +130 -42
  69. package/dist/{run-attempt-CvsAAGa0.js → .setup/run-attempt-BHu11r7h.mjs} +1628 -966
  70. package/dist/.setup/run-attempt-lifecycle-B7JbY4-F.mjs +71 -0
  71. package/dist/{runtime-artifact-BJ0rXBZ_.js → .setup/runtime-artifact-CLZ8udh-.mjs} +29 -45
  72. package/dist/{sandbox-guard-BxgyoM8M.js → .setup/sandbox-guard-C2sRMOEY.mjs} +3 -3
  73. package/dist/{session-binding-CI8UuilT.js → .setup/session-binding-Cm0apEbd.mjs} +36 -83
  74. package/dist/{session-binding-record-Bcvslnhf.js → .setup/session-binding-record-BGoz8wOK.mjs} +202 -5
  75. package/dist/.setup/session-binding-sidecars-BlB5EvIS.mjs +546 -0
  76. package/dist/.setup/session-catalog-Pno1xGcl.mjs +2764 -0
  77. package/dist/{session-catalog-adoption-tcZi1IfX.js → .setup/session-catalog-adoption-BI6UTDZT.mjs} +58 -26
  78. package/dist/{session-catalog-archive-CwKg8Xz2.js → .setup/session-catalog-archive-lHBqzhaO.mjs} +6 -6
  79. package/dist/.setup/session-catalog-events-Bj6j94E_.mjs +347 -0
  80. package/dist/.setup/session-catalog-index-B9_VQIUz.mjs +1170 -0
  81. package/dist/.setup/session-catalog-index-order-hcdz07yN.mjs +48 -0
  82. package/dist/.setup/session-catalog-index-state-Dgh8ORJm.mjs +183 -0
  83. package/dist/{thread-history-page-D0JIp48V.js → .setup/session-catalog-native-projection-DowriLid.mjs} +223 -95
  84. package/dist/{session-catalog-node-adoption-B1tgDW-m.js → .setup/session-catalog-node-adoption-ITddWx_X.mjs} +25 -13
  85. package/dist/{session-catalog-node-continue-Ci-DXyJP.js → .setup/session-catalog-node-continue-6g6qi4A9.mjs} +24 -15
  86. package/dist/.setup/session-catalog-projection-zK_PUsiE.mjs +422 -0
  87. package/dist/{session-cli-DNN_jhGc.js → .setup/session-cli-irrD-uo7.mjs} +3 -3
  88. package/dist/{session-history-Cz-tOOYj.js → .setup/session-history-BrqhSCf9.mjs} +19 -19
  89. package/dist/{session-history-import-DwyijFI6.js → .setup/session-history-import-D-3wAgOP.mjs} +4 -4
  90. package/dist/{session-history-read-cxPUxyVV.js → .setup/session-history-read-B3ZfSUbF.mjs} +2 -2
  91. package/dist/{session-history.worker-BeK1YOyT.js → .setup/session-history.worker-CaCh0xF_.mjs} +10 -24
  92. package/dist/{session-initialization-Ct0_Hzmg.js → .setup/session-initialization-rcgbZiid.mjs} +2 -2
  93. package/dist/{session-permission-policy-BBmXA8Eg.js → .setup/session-permission-policy-BI1QK_98.mjs} +2 -2
  94. package/dist/{session-retirement-B2YfbAAT.js → .setup/session-retirement-BH-S6qkJ.mjs} +26 -7
  95. package/dist/{settled-turn-context-Du6gdUDd.js → .setup/settled-turn-context-fmwouT5I.mjs} +2 -2
  96. package/dist/{settled-turn-finalizer-Dn91stmc.js → .setup/settled-turn-finalizer-DiAi6Kx6.mjs} +12 -12
  97. package/dist/{shared-client-CscigXXL.js → .setup/shared-client-DA4VR4Eb.mjs} +332 -221
  98. package/dist/{side-question-BGMJQf4U.js → .setup/side-question-BJ1wSDcB.mjs} +183 -230
  99. package/dist/{source-CElXU0Oy.js → .setup/source-CUzJq5WN.mjs} +11 -10
  100. package/dist/.setup/spawn-error-CL3n6MAa.mjs +57 -0
  101. package/dist/{thread-archive-guard-DfpBr-Sz.js → .setup/thread-archive-guard-C9frICzX.mjs} +10 -3
  102. package/dist/.setup/thread-history-page-DoVpnHim.mjs +83 -0
  103. package/dist/{thread-lifecycle-DXl1-I6b.js → .setup/thread-lifecycle-B3mfz1TG.mjs} +347 -2318
  104. package/dist/{thread-ownership-BsDRTsyp.js → .setup/thread-ownership-DcTtAcXj.mjs} +6 -4
  105. package/dist/{thread-policy-BuEQfE0g.js → .setup/thread-policy-DGuQsuFC.mjs} +19 -3
  106. package/dist/.setup/thread-requests-BLvGkP2R.mjs +2205 -0
  107. package/dist/{thread-resume-DsDOZpFg.js → .setup/thread-resume-DIBXwOpE.mjs} +8 -5
  108. package/dist/.setup/timeout-C910MdAB.mjs +80 -0
  109. package/dist/{transcript-history-projection-v17wXgdK.js → .setup/transcript-history-projection-ZZpkFkJ_.mjs} +96 -61
  110. package/dist/{transcript-mirror-C5CKgNy6.js → .setup/transcript-mirror-BtHDBp1G.mjs} +224 -195
  111. package/dist/{transcript-mirror-attestation-DibE0krH.js → .setup/transcript-mirror-attestation-CzM-94NC.mjs} +4 -1
  112. package/dist/{transport-stdio-BGjHoYLr.js → .setup/transport-stdio-h2VHOskC.mjs} +274 -89
  113. package/dist/{upstream-session-fork-BZerMte_.js → .setup/upstream-session-fork-BUr4OUbC.mjs} +51 -42
  114. package/dist/{usage-tCk-mg_x.js → .setup/usage-BML0r-ua.mjs} +5 -4
  115. package/dist/.setup/usage-limit-error-DUMbefVY.mjs +166 -0
  116. package/dist/{web-search-provider.runtime-B7bGbGWq.js → .setup/web-search-provider.runtime-CDKlN-Rv.mjs} +4 -3
  117. package/dist/api.js +23 -12
  118. package/dist/catalog-page-worker-entrypoint.js +12 -0
  119. package/dist/catalog-page.worker.js +9 -0
  120. package/dist/cli-metadata.js +1 -1
  121. package/dist/doctor-contract-api.js +8 -528
  122. package/dist/harness.js +1 -1
  123. package/dist/index.js +306 -215
  124. package/dist/media-understanding-provider.js +3 -3
  125. package/dist/migration-provider-api.js +1 -1
  126. package/dist/native-tool-policy.js +12 -0
  127. package/dist/provider-discovery.js +18 -0
  128. package/dist/session-history-worker-runtime.js +36 -35
  129. package/dist/session-history.worker.js +2 -2
  130. package/dist/web-search-contract-api.js +1 -1
  131. package/openclaw.plugin.json +354 -69
  132. package/package.json +14 -8
  133. package/dist/attempt-context-D44yeDII.js +0 -636
  134. package/dist/binding-connection-D3udKbIE.js +0 -60
  135. package/dist/event-projector-usage-BfXmpOec.js +0 -102
  136. package/dist/inference-proxy-HGXKUIre.js +0 -311
  137. package/dist/launch-args-RXQwn8zV.js +0 -90
  138. package/dist/native-subagent-history-owner-Pcp7JuVF.js +0 -34
  139. package/dist/native-subagent-monitor-fQ7eIXEf.js +0 -2978
  140. package/dist/node-exec-server.runtime-Cl2vapEi.js +0 -226
  141. package/dist/rpc-error-ttN_QjEm.js +0 -30
  142. package/dist/session-catalog-ct-AH01I.js +0 -1477
  143. package/dist/session-catalog-home-id-CwhLdC03.js +0 -18
  144. package/dist/session-catalog-provenance-D-dIfRAH.js +0 -96
  145. package/dist/timeout-BVw8aaM1.js +0 -33
  146. package/dist/version-omm6IPI3.js +0 -12
  147. /package/dist/{auth-profile-selection-DFu9e167.js → .setup/auth-profile-selection-DFu9e167.mjs} +0 -0
  148. /package/dist/{config-utils-DujwEnhg.js → .setup/config-utils-DujwEnhg.mjs} +0 -0
  149. /package/dist/{context-compaction-activity-CMla5FPJ.js → .setup/context-compaction-activity-CMla5FPJ.mjs} +0 -0
  150. /package/dist/{elicitation-input-DPoK8F7w.js → .setup/elicitation-input-DPoK8F7w.mjs} +0 -0
  151. /package/dist/{history-rejection-B4nOXNXF.js → .setup/history-rejection-B4nOXNXF.mjs} +0 -0
  152. /package/dist/{image-payload-sanitizer-tupAr-2o.js → .setup/image-payload-sanitizer-tupAr-2o.mjs} +0 -0
  153. /package/dist/{incognito-session-uhrBF6wJ.js → .setup/incognito-session-uhrBF6wJ.mjs} +0 -0
  154. /package/dist/{local-runtime-attribution-B_2mnqhb.js → .setup/local-runtime-attribution-B_2mnqhb.mjs} +0 -0
  155. /package/dist/{native-execution-policy-umd0tgh4.js → .setup/native-execution-policy-umd0tgh4.mjs} +0 -0
  156. /package/dist/{rolldown-runtime-8H4AJuhK.js → .setup/rolldown-runtime-8H4AJuhK.mjs} +0 -0
  157. /package/dist/{session-binding-meta-B7aEMU7g.js → .setup/session-binding-meta-B7aEMU7g.mjs} +0 -0
  158. /package/dist/{session-upstream-marker-D15C9NHp.js → .setup/session-upstream-marker-D15C9NHp.mjs} +0 -0
  159. /package/dist/{upstream-prompt-provenance-LphB8slG.js → .setup/upstream-prompt-provenance-LphB8slG.mjs} +0 -0
  160. /package/dist/{web-search-provider.shared-BrZmlqyR.js → .setup/web-search-provider.shared-BrZmlqyR.mjs} +0 -0
@@ -1,250 +1,12 @@
1
- import { a as normalizeHeaders, d as readNumberEnv, f as readRecord, i as normalizeCodexServiceTier, o as normalizePositiveNumber, p as resolveArgs, r as normalizeCodexAppServerSecretInput, s as readBooleanEnv, t as hashSecretForKey, u as readNonEmptyString } from "./config-utils-DujwEnhg.js";
2
- import { _ as assertCodexAppServerCommandHasNoInlineArgs, d as DEFAULT_CODEX_APP_SERVER_NETWORK_PROXY_PROFILE_PREFIX, f as DEFAULT_CODEX_COMPUTER_USE_LIVE_TEST_TIMEOUT_MS, g as DEFAULT_CODEX_COMPUTER_USE_TOOL_CALL_TIMEOUT_MS, h as DEFAULT_CODEX_COMPUTER_USE_PLUGIN_NAME, l as resolveCodexAppServerUserHomeDir, o as isJsonObject, p as DEFAULT_CODEX_COMPUTER_USE_MARKETPLACE_DISCOVERY_TIMEOUT_MS, s as resolveCodexAppServerHomeDir, x as readCodexPluginConfig } from "./protocol-5bh1G-H7.js";
3
- import { r as readCodexAppServerConfigOptions } from "./launch-args-RXQwn8zV.js";
1
+ import { a as normalizeHeaders, d as readNumberEnv, f as readRecord, i as normalizeCodexServiceTier, o as normalizePositiveNumber, p as resolveArgs, r as normalizeCodexAppServerSecretInput, s as readBooleanEnv, t as hashSecretForKey, u as readNonEmptyString } from "./config-utils-DujwEnhg.mjs";
2
+ import { A as selectForcedPromptingSandbox, C as assertCodexAppServerAllowedForOpenClawExecMode, D as resolveEffectiveOpenClawExecModeForCodexAppServer, E as resolveCodexPolicyModeForOpenClawExecMode, O as resolveSandbox, T as resolveApprovalsReviewer, a as resolveCodexAppServerNetworkProxy, c as resolveTransport, d as resolveCodexAppServerHomeDir, g as parseAllowedApprovalPoliciesFromCodexRequirements, i as normalizeRemoteWorkspaceRoot, k as selectForcedDangerFullAccessSandbox, o as resolveDefaultCodexAppServerPolicy, p as resolveCodexAppServerUserHomeDir, r as inferCodexAppServerConnectionClass, s as resolvePolicyMode, t as assertCodexAppServerConnectionSecurity, w as resolveApprovalPolicy, y as readCodexRequirementsToml } from "./config-security-BEReZ6go.mjs";
3
+ import { a as DEFAULT_CODEX_COMPUTER_USE_PLUGIN_NAME, d as readCodexPluginConfig, n as DEFAULT_CODEX_COMPUTER_USE_LIVE_TEST_TIMEOUT_MS, o as DEFAULT_CODEX_COMPUTER_USE_TOOL_CALL_TIMEOUT_MS, r as DEFAULT_CODEX_COMPUTER_USE_MARKETPLACE_DISCOVERY_TIMEOUT_MS, s as assertCodexAppServerCommandHasNoInlineArgs } from "./config-parsing-CcB9iPoq.mjs";
4
+ import { i as readCodexAppServerConfigOptions } from "./launch-args-DbFCehO7.mjs";
5
+ import { i as isJsonObject } from "./protocol-CANUwXJ3.mjs";
4
6
  import { normalizeTrimmedStringList } from "openclaw/plugin-sdk/string-coerce-runtime";
5
- import { createHash } from "node:crypto";
6
- import { AgentHarnessPreflightError } from "openclaw/plugin-sdk/agent-harness-registration";
7
7
  import { parse } from "smol-toml";
8
8
  import { readFileSync } from "node:fs";
9
9
  import path from "node:path";
10
- import { hostname } from "node:os";
11
- import { isLoopbackHost } from "openclaw/plugin-sdk/request-url";
12
- //#region extensions/codex/src/app-server/config-exec-policy.ts
13
- function selectForcedPromptingSandbox(params) {
14
- if (params.configuredSandbox === "read-only" || params.defaultSandbox === "read-only") return "read-only";
15
- return params.defaultSandbox ?? "workspace-write";
16
- }
17
- function selectForcedDangerFullAccessSandbox(params) {
18
- if (params.configuredSandbox === "read-only") return "read-only";
19
- if (params.defaultPolicy?.dangerFullAccessAllowed === false) {
20
- if (params.openClawSandboxActive) return params.defaultPolicy.sandbox ?? "workspace-write";
21
- throw new Error("legacy full exec security with ask requires Codex app-server danger-full-access");
22
- }
23
- return "danger-full-access";
24
- }
25
- function selectGuardianSandbox(allowedSandboxModes) {
26
- if (allowedSandboxModes === void 0 || allowedSandboxModes.has("workspace-write")) return "workspace-write";
27
- if (allowedSandboxModes.has("read-only")) return "read-only";
28
- if (allowedSandboxModes.has("danger-full-access")) return "danger-full-access";
29
- return "workspace-write";
30
- }
31
- function resolveApprovalPolicy(value) {
32
- if (value === "untrusted") throw new Error("Codex app-server approval policy \"untrusted\" is retired; run \"openclaw doctor --fix\" and use \"on-request\".");
33
- if (value === "on-failure") return "on-request";
34
- return value === "on-request" || value === "never" ? value : void 0;
35
- }
36
- function resolveSandbox(value) {
37
- return value === "read-only" || value === "workspace-write" || value === "danger-full-access" ? value : void 0;
38
- }
39
- function resolveApprovalsReviewer(value) {
40
- return value === "auto_review" || value === "guardian_subagent" || value === "user" ? value : void 0;
41
- }
42
- function resolveEffectiveOpenClawExecModeForCodexAppServer(params) {
43
- if (params.execPolicy?.touched === true) return params.execPolicy.mode;
44
- return params.execMode;
45
- }
46
- function resolveCodexPolicyModeForOpenClawExecMode(mode) {
47
- if (!mode || mode === "full") return;
48
- return "guardian";
49
- }
50
- function assertCodexAppServerAllowedForOpenClawExecMode(mode) {
51
- if (mode === "deny" || mode === "allowlist") throw new AgentHarnessPreflightError(`Codex app-server local execution is unavailable because effective tools.exec.mode=${mode}. Execution-host approvals are authoritative. For gateway turns, inspect them with \`openclaw approvals get --gateway\` and update that same target with \`openclaw approvals set --gateway --stdin\`; for local \`agent exec\`, omit \`--gateway\`. Intentionally align that host policy before retrying.`, { scope: "harness" });
52
- }
53
- //#endregion
54
- //#region extensions/codex/src/app-server/config-requirements.ts
55
- const UNIX_CODEX_REQUIREMENTS_PATH = "/etc/codex/requirements.toml";
56
- const WINDOWS_CODEX_REQUIREMENTS_SUFFIX = "\\OpenAI\\Codex\\requirements.toml";
57
- function readCodexRequirementsToml(params) {
58
- if (params.requirementsToml !== void 0) return params.requirementsToml ?? void 0;
59
- const requirementsPath = readNonEmptyString(params.requirementsPath) ?? resolveCodexRequirementsPath(params.env ?? process.env, params.platform ?? process.platform);
60
- try {
61
- if (params.readRequirementsFile) return params.readRequirementsFile(requirementsPath);
62
- return readFileSync(requirementsPath, "utf8");
63
- } catch {
64
- return;
65
- }
66
- }
67
- function resolveCodexRequirementsPath(env, platform) {
68
- if (platform === "win32") return `${(readNonEmptyString(env.ProgramData) ?? "C:\\ProgramData").replace(/[\\/]+$/, "")}${WINDOWS_CODEX_REQUIREMENTS_SUFFIX}`;
69
- return UNIX_CODEX_REQUIREMENTS_PATH;
70
- }
71
- function parseAllowedSandboxModesFromCodexRequirements(content, hostName) {
72
- const remoteSandboxModes = parseMatchingRemoteSandboxModesFromCodexRequirements(content, hostName);
73
- if (remoteSandboxModes !== void 0) return remoteSandboxModes;
74
- return parseRequirementsSandboxModes(parseTopLevelRequirementsStringArray(content, "allowed_sandbox_modes"));
75
- }
76
- function parseAllowedApprovalPoliciesFromCodexRequirements(content) {
77
- const values = parseTopLevelRequirementsStringArray(content, "allowed_approval_policies");
78
- if (values === void 0) return;
79
- const normalizedPolicies = values.map((entry) => normalizeRequirementsApprovalPolicy(entry)).filter((entry) => entry !== void 0);
80
- return normalizedPolicies.length > 0 ? new Set(normalizedPolicies) : void 0;
81
- }
82
- function parseAllowedApprovalsReviewersFromCodexRequirements(content) {
83
- const values = parseTopLevelRequirementsStringArray(content, "allowed_approvals_reviewers");
84
- if (values === void 0) return;
85
- const normalizedReviewers = values.map((entry) => normalizeRequirementsApprovalsReviewer(entry)).filter((entry) => entry !== void 0);
86
- return normalizedReviewers.length > 0 ? new Set(normalizedReviewers) : void 0;
87
- }
88
- function parseMatchingRemoteSandboxModesFromCodexRequirements(content, hostName) {
89
- const normalizedHostName = normalizeRequirementsHostName(hostName);
90
- if (normalizedHostName === void 0) return;
91
- for (const section of parseTomlArrayTableSections(content, "remote_sandbox_config")) {
92
- const patterns = parseRequirementsStringArray(section, "hostname_patterns");
93
- if (!patterns || !requirementsHostNameMatchesAnyPattern(normalizedHostName, patterns)) continue;
94
- return parseRequirementsSandboxModes(parseRequirementsStringArray(section, "allowed_sandbox_modes"));
95
- }
96
- }
97
- function parseRequirementsSandboxModes(values) {
98
- if (values === void 0) return;
99
- const normalizedModes = values.map((entry) => normalizeRequirementsSandboxMode(entry)).filter((entry) => entry !== void 0);
100
- return normalizedModes.length > 0 ? new Set(normalizedModes) : void 0;
101
- }
102
- function parseTopLevelRequirementsStringArray(content, key) {
103
- return parseRequirementsStringArray(stripTomlLineComments(content).slice(0, firstTomlTableOffset(content)), key);
104
- }
105
- function parseTomlStringValue(content, key) {
106
- return parseTomlStringAssignmentValue(content, tomlDottedKeyPattern(key));
107
- }
108
- function parseInlineOpenAIModelProviderBaseUrl(content) {
109
- return parseTomlStringAssignmentValue(content, `${tomlKeyPattern("model_providers")}\\s*=\\s*\\{[\\s\\S]*?${tomlKeyPattern("openai")}\\s*=\\s*\\{[\\s\\S]*?${tomlKeyPattern("base_url")}`);
110
- }
111
- function parseTomlStringAssignmentValue(content, keyPattern) {
112
- const assignment = content.match(new RegExp(`(?:^|\\n)\\s*${keyPattern}\\s*=\\s*([^\\r\\n]*)`));
113
- if (!assignment) return;
114
- const rawValue = assignment[1]?.trimStart() ?? "";
115
- if (rawValue.startsWith("\"\"\"") || rawValue.startsWith("'''")) return false;
116
- const match = parseTomlStringAssignment(content, keyPattern);
117
- return match ? match[1] ?? match[2] ?? "" : false;
118
- }
119
- function parseTomlStringAssignment(content, keyPattern) {
120
- return content.match(new RegExp(`(?:^|\\n)\\s*${keyPattern}\\s*=\\s*(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|'([^']*)')`));
121
- }
122
- function tomlDottedKeyPattern(key) {
123
- return key.split(".").map(tomlKeyPattern).join("\\s*\\.\\s*");
124
- }
125
- function tomlKeyPattern(key) {
126
- const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
127
- return `(?:"${escaped}"|'${escaped}'|${escaped})`;
128
- }
129
- function parseRequirementsStringArray(content, key) {
130
- const match = content.match(new RegExp(`(?:^|\\n)\\s*${key}\\s*=\\s*\\[([\\s\\S]*?)\\]`));
131
- if (!match) return;
132
- const arrayBody = match[1] ?? "";
133
- const stringMatches = [...arrayBody.matchAll(/"([^"\\]*(?:\\.[^"\\]*)*)"|'([^']*)'/g)];
134
- if (stringMatches.length === 0 && arrayBody.trim().length > 0) return;
135
- return stringMatches.map((entry) => entry[1] ?? entry[2] ?? "");
136
- }
137
- function parseTomlTableSection(content, table) {
138
- const strippedContent = stripTomlLineComments(content);
139
- const tablePattern = tomlDottedKeyPattern(table);
140
- const match = new RegExp(`^\\s*\\[\\s*${tablePattern}\\s*\\]\\s*$`, "m").exec(strippedContent);
141
- if (!match) return;
142
- const sectionStart = match.index + match[0].length;
143
- const rest = strippedContent.slice(sectionStart);
144
- const nextTableOffset = rest.search(/^\s*\[/m);
145
- return nextTableOffset === -1 ? rest : rest.slice(0, nextTableOffset);
146
- }
147
- function parseTomlArrayTableSections(content, table) {
148
- const strippedContent = stripTomlLineComments(content);
149
- const escapedTable = table.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
150
- const headerPattern = new RegExp(`^\\s*\\[\\[\\s*${escapedTable}\\s*\\]\\]\\s*$`, "gm");
151
- const sections = [];
152
- for (let match = headerPattern.exec(strippedContent); match; match = headerPattern.exec(strippedContent)) {
153
- const sectionStart = headerPattern.lastIndex;
154
- const rest = strippedContent.slice(sectionStart);
155
- const nextTableOffset = rest.search(/^\s*\[/m);
156
- sections.push(nextTableOffset === -1 ? rest : rest.slice(0, nextTableOffset));
157
- }
158
- return sections;
159
- }
160
- function firstTomlTableOffset(content) {
161
- return content.match(/^\s*\[[^\]\n]/m)?.index ?? content.length;
162
- }
163
- function stripTomlLineComments(value) {
164
- let output = "";
165
- let quote;
166
- let escaped = false;
167
- for (let index = 0; index < value.length; index += 1) {
168
- const char = value[index] ?? "";
169
- if (quote) {
170
- output += char;
171
- if (quote === "\"" && escaped) {
172
- escaped = false;
173
- continue;
174
- }
175
- if (quote === "\"" && char === "\\") {
176
- escaped = true;
177
- continue;
178
- }
179
- if (char === quote) quote = void 0;
180
- continue;
181
- }
182
- if (char === "\"" || char === "'") {
183
- quote = char;
184
- output += char;
185
- continue;
186
- }
187
- if (char === "#") {
188
- while (index < value.length && value[index] !== "\n") index += 1;
189
- if (value[index] === "\n") output += "\n";
190
- continue;
191
- }
192
- output += char;
193
- }
194
- return output;
195
- }
196
- function normalizeRequirementsSandboxMode(value) {
197
- const compact = value.replace(/[\s_-]/g, "").toLowerCase();
198
- if (compact === "readonly") return "read-only";
199
- if (compact === "workspacewrite") return "workspace-write";
200
- if (compact === "dangerfullaccess") return "danger-full-access";
201
- }
202
- function normalizeRequirementsHostName(value) {
203
- const normalized = value.trim().replace(/\.+$/g, "").toLowerCase();
204
- return normalized.length > 0 ? normalized : void 0;
205
- }
206
- function requirementsHostNameMatchesAnyPattern(hostName, patterns) {
207
- return patterns.some((pattern) => {
208
- const normalizedPattern = normalizeRequirementsHostName(pattern);
209
- return normalizedPattern !== void 0 && globPatternMatches(hostName, normalizedPattern);
210
- });
211
- }
212
- function globPatternMatches(value, pattern) {
213
- let regex = "^";
214
- for (const char of pattern) if (char === "*") regex += ".*";
215
- else if (char === "?") regex += ".";
216
- else regex += char.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
217
- regex += "$";
218
- return new RegExp(regex).test(value);
219
- }
220
- function normalizeRequirementsApprovalPolicy(value) {
221
- const normalized = value.trim().toLowerCase();
222
- if (normalized === "on-failure") return "on-request";
223
- if (normalized === "untrusted") return normalized;
224
- return resolveApprovalPolicy(normalized);
225
- }
226
- function normalizeRequirementsApprovalsReviewer(value) {
227
- return resolveApprovalsReviewer(value.trim().toLowerCase());
228
- }
229
- function selectGuardianApprovalPolicy(allowedApprovalPolicies, execModeRequiringPromptingApprovals) {
230
- if (allowedApprovalPolicies === void 0 || allowedApprovalPolicies.has("on-request")) return "on-request";
231
- if (allowedApprovalPolicies.has("untrusted")) return "untrusted";
232
- if (execModeRequiringPromptingApprovals) throw new Error(`tools.exec.mode=${execModeRequiringPromptingApprovals} requires Codex app-server prompting approvals`);
233
- if (allowedApprovalPolicies.has("never")) return "never";
234
- return "on-request";
235
- }
236
- function selectGuardianApprovalsReviewer(allowedApprovalsReviewers, execModeRequiringAutoReviewer) {
237
- if (allowedApprovalsReviewers === void 0 || allowedApprovalsReviewers.has("auto_review")) return "auto_review";
238
- if (allowedApprovalsReviewers.has("guardian_subagent")) return "guardian_subagent";
239
- if (execModeRequiringAutoReviewer) throw new Error(`tools.exec.mode=${execModeRequiringAutoReviewer} requires Codex app-server auto approvals`);
240
- if (allowedApprovalsReviewers.has("user")) return "user";
241
- return "auto_review";
242
- }
243
- function selectUserApprovalsReviewer(allowedApprovalsReviewers, execModeRequiringUserReviewer) {
244
- if (allowedApprovalsReviewers === void 0 || allowedApprovalsReviewers.has("user")) return "user";
245
- throw new Error(`tools.exec.mode=${execModeRequiringUserReviewer ?? "ask"} requires Codex app-server user approvals`);
246
- }
247
- //#endregion
248
10
  //#region extensions/codex/src/app-server/config-layer-policy.ts
249
11
  const CODEX_SESSION_OVERRIDABLE_LAYER_TYPES = /* @__PURE__ */ new Set([
250
12
  "packagedDefaults",
@@ -267,18 +29,21 @@ async function readCodexEffectiveConfig(client, cwd, options) {
267
29
  //#endregion
268
30
  //#region extensions/codex/src/app-server/config-reviewer-policy.ts
269
31
  const CODEX_CONFIG_TOML_FILENAME = "config.toml";
32
+ const CODEX_CLI_WHITESPACE = /^\p{White_Space}+|\p{White_Space}+$/gu;
270
33
  /** Cloud/system config can redirect reviews after local home/profile checks have passed. */
271
34
  async function assertCodexModelBackedReviewerEffectiveConfig(params) {
272
35
  if (params.approvalsReviewer !== "auto_review" && params.approvalsReviewer !== "guardian_subagent") return;
273
36
  const response = await readCodexEffectiveConfig(params.client, params.cwd, { signal: params.signal });
274
- const effectiveConfig = response.config;
275
- const modelProvider = effectiveConfig.model_provider;
276
- const providers = effectiveConfig.model_providers;
37
+ if (!isTrustedCodexReviewerConfig(response.config)) throw new Error("Codex model-backed approval reviewer requires the running server to use a trusted OpenAI endpoint");
38
+ return response;
39
+ }
40
+ function isTrustedCodexReviewerConfig(config) {
41
+ const modelProvider = config.model_provider;
42
+ const providers = config.model_providers;
277
43
  const providerRecords = providers == null ? void 0 : readRecord(providers);
278
44
  const provider = providerRecords?.openai;
279
45
  const openAIProvider = provider == null ? void 0 : readRecord(provider);
280
- if (modelProvider != null && modelProvider !== "openai" || providers != null && !providerRecords || provider != null && !openAIProvider || !isTrustedOptionalReviewerEndpoint(effectiveConfig.openai_base_url, isNativeOpenAIBaseUrl) || !isTrustedOptionalReviewerEndpoint(effectiveConfig.chatgpt_base_url, isNativeChatGPTBaseUrl) || !isTrustedOptionalReviewerEndpoint(openAIProvider?.base_url, isNativeOpenAIBaseUrl)) throw new Error("Codex model-backed approval reviewer requires the running server to use a trusted OpenAI endpoint");
281
- return response;
46
+ return (modelProvider == null || modelProvider === "openai") && (providers == null || providerRecords !== void 0) && (provider == null || openAIProvider !== void 0) && isTrustedOptionalReviewerEndpoint(config.openai_base_url, isNativeOpenAIBaseUrl) && isTrustedOptionalReviewerEndpoint(config.chatgpt_base_url, isNativeChatGPTBaseUrl) && isTrustedOptionalReviewerEndpoint(openAIProvider?.base_url, isNativeOpenAIBaseUrl);
282
47
  }
283
48
  function isTrustedOptionalReviewerEndpoint(value, isTrusted) {
284
49
  return value == null || typeof value === "string" && isTrusted(value);
@@ -291,8 +56,7 @@ function canUseCodexModelBackedApprovalsReviewerForModel(params, resolveAuthProv
291
56
  }
292
57
  function isTrustedCodexModelBackedOpenAIProvider(params, resolveAuthProviderId) {
293
58
  if (!openAIBaseUrlEnvOverridesAreTrustedForModelBackedReview(params.env)) return false;
294
- const codexBaseUrlOverrides = readCodexBaseUrlOverridesForModelBackedReview(params);
295
- if (codexBaseUrlOverrides === false || !codexBaseUrlOverrides.openAI.every(isNativeOpenAIBaseUrl) || !codexBaseUrlOverrides.chatGPT.every(isNativeChatGPTBaseUrl)) return false;
59
+ if (!nativeCodexConfigIsTrustedForModelBackedReview(params)) return false;
296
60
  const openAIProviders = readConfiguredOpenAIProvidersForModelBackedReview(params.config, resolveAuthProviderId);
297
61
  if (openAIProviders.length === 0) return true;
298
62
  return openAIProviders.every((openAIProvider) => configuredOpenAIProviderIsTrustedForModelBackedReview(openAIProvider, params.model));
@@ -324,28 +88,17 @@ function resolveCodexModelBackedReviewerPolicyContext(params) {
324
88
  model: params.model ?? params.bindingModel
325
89
  };
326
90
  }
327
- function readCodexBaseUrlOverridesForModelBackedReview(params) {
91
+ function nativeCodexConfigIsTrustedForModelBackedReview(params) {
328
92
  const configToml = readCodexAppServerConfigToml(params);
329
93
  if (configToml === false) return false;
330
- const configTomls = configToml === void 0 ? [] : [configToml];
331
94
  const nativeOverrides = readNativeCodexReviewerConfigOverrides(params);
332
95
  if (nativeOverrides === false) return false;
333
- configTomls.push(...nativeOverrides);
334
- const openAI = [];
335
- const chatGPT = [];
336
- for (const content of configTomls) {
337
- const topLevelContent = stripTomlLineComments(content).slice(0, firstTomlTableOffset(content));
338
- const modelProviderOpenAISection = parseTomlTableSection(content, "model_providers.openai");
339
- const modelProvider = parseTomlStringValue(topLevelContent, "model_provider");
340
- if (modelProvider === false || modelProvider && modelProvider !== "openai") return false;
341
- openAI.push(parseTomlStringValue(topLevelContent, "openai_base_url"), parseTomlStringValue(topLevelContent, "model_providers.openai.base_url"), parseInlineOpenAIModelProviderBaseUrl(topLevelContent), modelProviderOpenAISection ? parseTomlStringValue(modelProviderOpenAISection, "base_url") : void 0);
342
- chatGPT.push(parseTomlStringValue(topLevelContent, "chatgpt_base_url"));
96
+ if (configToml !== void 0) try {
97
+ nativeOverrides.unshift(parse(configToml, { integersAsBigInt: true }));
98
+ } catch {
99
+ return false;
343
100
  }
344
- if ([...openAI, ...chatGPT].includes(false)) return false;
345
- return {
346
- openAI: openAI.filter((entry) => typeof entry === "string"),
347
- chatGPT: chatGPT.filter((entry) => typeof entry === "string")
348
- };
101
+ return nativeOverrides.every(isTrustedCodexReviewerConfig);
349
102
  }
350
103
  function readNativeCodexReviewerConfigOverrides(params) {
351
104
  if (params.codexArgs?.some((arg) => !arg)) return false;
@@ -354,20 +107,39 @@ function readNativeCodexReviewerConfigOverrides(params) {
354
107
  for (const { name, value } of readCodexAppServerConfigOptions(params.codexArgs ?? [])) {
355
108
  if (!value) return false;
356
109
  if (name === "--profile" || name === "-p") profile = value;
357
- else overrides.push(`${value}\n`);
110
+ else {
111
+ const override = parseNativeCodexReviewerConfigOverride(value);
112
+ if (override === false) return false;
113
+ overrides.push(override);
114
+ }
358
115
  }
359
116
  if (profile) {
360
117
  if (path.basename(profile) !== profile || profile === "." || profile === "..") return false;
361
118
  const configPath = resolveCodexAppServerConfigPath(params);
362
119
  if (!configPath) return false;
363
120
  try {
364
- overrides.unshift(readFileSync(path.join(path.dirname(configPath), `${profile}.config.toml`), "utf8"));
121
+ overrides.unshift(parse(readFileSync(path.join(path.dirname(configPath), `${profile}.config.toml`), "utf8"), { integersAsBigInt: true }));
365
122
  } catch (error) {
366
123
  if (readErrorCode(error) !== "ENOENT") return false;
367
124
  }
368
125
  }
369
126
  return overrides;
370
127
  }
128
+ function parseNativeCodexReviewerConfigOverride(override) {
129
+ const separator = override.indexOf("=");
130
+ if (separator < 0) return false;
131
+ const key = override.slice(0, separator).replace(CODEX_CLI_WHITESPACE, "");
132
+ if (!key) return false;
133
+ const raw = override.slice(separator + 1).replace(CODEX_CLI_WHITESPACE, "");
134
+ let value;
135
+ try {
136
+ value = parse(`_x_ = ${raw}`, { integersAsBigInt: true })["_x_"];
137
+ } catch {
138
+ value = raw.replace(/^["']+|["']+$/g, "");
139
+ }
140
+ for (const segment of key.split(".").toReversed()) value = { [segment]: value };
141
+ return readRecord(value) ?? false;
142
+ }
371
143
  function readCodexAppServerConfigToml(params) {
372
144
  if (params.codexConfigToml !== void 0) return params.codexConfigToml ?? void 0;
373
145
  const configPath = resolveCodexAppServerConfigPath(params);
@@ -402,6 +174,7 @@ function codexConfigEnablesNativeComputerUse(params) {
402
174
  return false;
403
175
  }
404
176
  function resolveCodexAppServerConfigPath(params) {
177
+ if (params.codexHome) return path.join(params.codexHome, CODEX_CONFIG_TOML_FILENAME);
405
178
  if (params.homeScope === "user") return path.join(resolveCodexAppServerUserHomeDir(params.env), CODEX_CONFIG_TOML_FILENAME);
406
179
  const agentDir = readNonEmptyString(params.agentDir);
407
180
  return agentDir ? path.join(resolveCodexAppServerHomeDir(agentDir), CODEX_CONFIG_TOML_FILENAME) : void 0;
@@ -478,180 +251,6 @@ function inferProviderFromModelRef(model) {
478
251
  return slashIndex > 0 ? normalized?.slice(0, slashIndex) : void 0;
479
252
  }
480
253
  //#endregion
481
- //#region extensions/codex/src/app-server/config-security.ts
482
- function shouldAutoApproveCodexAppServerApprovals(appServer) {
483
- return appServer.networkProxy === void 0 && appServer.approvalPolicy === "never" && appServer.sandbox === "danger-full-access";
484
- }
485
- function resolveCodexAppServerNetworkProxy(config, sandbox) {
486
- if (config?.enabled !== true) return {};
487
- const fileSystemMode = config.baseProfile === "read-only" || !config.baseProfile && sandbox === "read-only" ? "read" : "write";
488
- const networkConfig = removeUndefinedJsonFields({
489
- enabled: true,
490
- mode: config.mode,
491
- domains: normalizeNetworkProxyPermissionMap(config.domains),
492
- unix_sockets: normalizeNetworkProxyPermissionMap(config.unixSockets),
493
- proxy_url: readNonEmptyString(config.proxyUrl),
494
- socks_url: readNonEmptyString(config.socksUrl),
495
- enable_socks5: config.enableSocks5,
496
- enable_socks5_udp: config.enableSocks5Udp,
497
- allow_upstream_proxy: config.allowUpstreamProxy,
498
- allow_local_binding: config.allowLocalBinding,
499
- dangerously_allow_non_loopback_proxy: config.dangerouslyAllowNonLoopbackProxy,
500
- dangerously_allow_all_unix_sockets: config.dangerouslyAllowAllUnixSockets
501
- });
502
- const profile = {
503
- filesystem: {
504
- ":minimal": "read",
505
- ":project_roots": { ".": fileSystemMode }
506
- },
507
- network: networkConfig
508
- };
509
- const profileName = resolveNetworkProxyPermissionProfileName(config, profile);
510
- const configPatch = {
511
- "features.network_proxy.enabled": true,
512
- default_permissions: profileName,
513
- permissions: { [profileName]: profile }
514
- };
515
- return { networkProxy: {
516
- profileName,
517
- configFingerprint: fingerprintCodexAppServerNetworkProxyConfigPatch(configPatch),
518
- configPatch
519
- } };
520
- }
521
- function resolveNetworkProxyPermissionProfileName(config, profile) {
522
- const explicitProfileName = readNonEmptyString(config.profileName);
523
- if (explicitProfileName) return explicitProfileName;
524
- const suffix = createHash("sha256").update(stableStringifyJson({
525
- version: 1,
526
- profile
527
- })).digest("hex").slice(0, 16);
528
- return `${DEFAULT_CODEX_APP_SERVER_NETWORK_PROXY_PROFILE_PREFIX}-${suffix}`;
529
- }
530
- function fingerprintCodexAppServerNetworkProxyConfigPatch(configPatch) {
531
- return createHash("sha256").update(stableStringifyJson(configPatch)).digest("hex");
532
- }
533
- function normalizeNetworkProxyPermissionMap(value) {
534
- const entries = Object.entries(value ?? {}).map(([key, permission]) => [key.trim(), permission]).filter(([key]) => key.length > 0);
535
- return entries.length > 0 ? Object.fromEntries(entries) : void 0;
536
- }
537
- function removeUndefinedJsonFields(value) {
538
- return Object.fromEntries(Object.entries(value).filter((entry) => entry[1] !== void 0));
539
- }
540
- function stableStringifyJson(value) {
541
- if (Array.isArray(value)) return `[${value.map((item) => stableStringifyJson(item)).join(",")}]`;
542
- if (value && typeof value === "object") return `{${Object.entries(value).toSorted(([left], [right]) => left.localeCompare(right)).map(([key, item]) => `${JSON.stringify(key)}:${stableStringifyJson(item)}`).join(",")}}`;
543
- return JSON.stringify(value);
544
- }
545
- /** Explicit MCP prompting must bypass Codex's unconditional Never-policy approval. */
546
- function hasCodexMcpToolApprovalOverrides(servers, serverNames, projectedMcpServers) {
547
- const modes = new Map(Object.entries(projectedMcpServers ?? {}).map(([name, server]) => [name, server.default_tools_approval_mode]));
548
- for (const name of serverNames ?? Object.keys(servers ?? {})) {
549
- const server = servers?.[name];
550
- const mode = server?.codex?.defaultToolsApprovalMode;
551
- if (mode !== void 0 && (serverNames !== void 0 || server?.enabled !== false)) modes.set(name, mode);
552
- }
553
- return [...modes.values()].some((mode) => mode === "auto" || mode === "prompt");
554
- }
555
- function withMcpElicitationsApprovalPolicy(policy) {
556
- if (policy === "untrusted") return policy;
557
- if (typeof policy !== "string") return { granular: {
558
- ...policy.granular,
559
- mcp_elicitations: true
560
- } };
561
- if (policy === "never") return { granular: {
562
- mcp_elicitations: true,
563
- rules: false,
564
- sandbox_approval: false,
565
- request_permissions: false,
566
- skill_approval: false
567
- } };
568
- return { granular: {
569
- mcp_elicitations: true,
570
- rules: true,
571
- sandbox_approval: true,
572
- request_permissions: true,
573
- skill_approval: true
574
- } };
575
- }
576
- function resolveTransport(value) {
577
- return value === "websocket" || value === "unix" ? value : "stdio";
578
- }
579
- function normalizeRemoteWorkspaceRoot(value) {
580
- return readNonEmptyString(value);
581
- }
582
- function inferCodexAppServerConnectionClass(params) {
583
- if (params.transport !== "websocket") return "local-loopback";
584
- return params.url && isLoopbackWebSocketUrl(params.url) ? "local-loopback" : "remote";
585
- }
586
- function assertCodexAppServerConnectionClassConfig(params) {
587
- if (params.connectionClass === "remote" && !hasIdentityBearingWebSocketAuth({
588
- authToken: params.authToken,
589
- headers: params.headers
590
- })) throw new Error("remote Codex app-server WebSocket URLs require appServer.authToken or an Authorization header");
591
- }
592
- /** Applies the canonical remote-auth boundary to any Codex AppServer transport. */
593
- function assertCodexAppServerConnectionSecurity(params) {
594
- assertCodexAppServerConnectionClassConfig({
595
- connectionClass: inferCodexAppServerConnectionClass(params),
596
- authToken: params.authToken,
597
- headers: params.headers
598
- });
599
- }
600
- function isLoopbackWebSocketUrl(value) {
601
- let parsed;
602
- try {
603
- parsed = new URL(value);
604
- } catch {
605
- return false;
606
- }
607
- if (parsed.protocol !== "ws:" && parsed.protocol !== "wss:") return false;
608
- return isLoopbackHost(parsed.hostname);
609
- }
610
- function hasIdentityBearingWebSocketAuth(params) {
611
- if (readNonEmptyString(params.authToken)) return true;
612
- return Object.entries(params.headers).some(([key, value]) => key.trim().toLowerCase() === "authorization" && Boolean(readNonEmptyString(value)));
613
- }
614
- function resolvePolicyMode(value) {
615
- return value === "guardian" || value === "yolo" ? value : void 0;
616
- }
617
- function resolveDefaultCodexAppServerPolicy(params) {
618
- if (params.transport !== "stdio") return {
619
- mode: "yolo",
620
- dangerFullAccessAllowed: true
621
- };
622
- const content = readCodexRequirementsToml(params);
623
- if (content === void 0) {
624
- if (!params.forceGuardian) return {
625
- mode: "yolo",
626
- dangerFullAccessAllowed: true
627
- };
628
- return {
629
- mode: "guardian",
630
- dangerFullAccessAllowed: true,
631
- approvalPolicy: selectGuardianApprovalPolicy(void 0, params.execModeRequiringPromptingApprovals),
632
- approvalsReviewer: params.forceUserReviewer ? selectUserApprovalsReviewer(void 0, params.execModeRequiringUserReviewer) : selectGuardianApprovalsReviewer(void 0, params.execModeRequiringPromptingApprovals === "auto" ? "auto" : void 0),
633
- sandbox: selectGuardianSandbox(void 0)
634
- };
635
- }
636
- const allowedSandboxModes = parseAllowedSandboxModesFromCodexRequirements(content, readNonEmptyString(params.hostName) ?? hostname());
637
- const allowedApprovalPolicies = parseAllowedApprovalPoliciesFromCodexRequirements(content);
638
- const allowedApprovalsReviewers = parseAllowedApprovalsReviewersFromCodexRequirements(content);
639
- const yoloSandboxAllowed = allowedSandboxModes === void 0 || allowedSandboxModes.has("danger-full-access");
640
- const yoloApprovalAllowed = allowedApprovalPolicies === void 0 || allowedApprovalPolicies.has("never") && !allowedApprovalPolicies.has("untrusted");
641
- const yoloReviewerAllowed = allowedApprovalsReviewers === void 0 || allowedApprovalsReviewers.has("user");
642
- if (!params.forceGuardian && yoloSandboxAllowed && yoloApprovalAllowed && yoloReviewerAllowed) return {
643
- mode: "yolo",
644
- dangerFullAccessAllowed: true
645
- };
646
- return {
647
- mode: "guardian",
648
- dangerFullAccessAllowed: yoloSandboxAllowed,
649
- approvalPolicy: selectGuardianApprovalPolicy(allowedApprovalPolicies, params.execModeRequiringPromptingApprovals),
650
- approvalsReviewer: params.forceUserReviewer ? selectUserApprovalsReviewer(allowedApprovalsReviewers, params.execModeRequiringUserReviewer) : selectGuardianApprovalsReviewer(allowedApprovalsReviewers, params.execModeRequiringPromptingApprovals === "auto" ? "auto" : void 0),
651
- sandbox: selectGuardianSandbox(allowedSandboxModes)
652
- };
653
- }
654
- //#endregion
655
254
  //#region extensions/codex/src/app-server/config-options.ts
656
255
  /**
657
256
  * Sole owner of the app-server home-scope decision. Ordinary harness connections
@@ -776,7 +375,7 @@ function createCodexAppServerConfig({ resolveProviderIdForAuth }) {
776
375
  env
777
376
  });
778
377
  const managedCommandOrder = params.managedCommandOrder ?? (homeScope === "user" || computerUseConfig.enabled ? "desktop-first" : "package-first");
779
- const includeManagedCommandOrder = commandSource === "managed" && (managedCommandOrder === "desktop-first" || params.managedCommandOrder === "package-first");
378
+ const includeManagedCommandOrder = commandSource === "managed" && (managedCommandOrder === "desktop-first" || params.managedCommandOrder !== void 0);
780
379
  const managedComputerUsePluginNames = [.../* @__PURE__ */ new Set([DEFAULT_CODEX_COMPUTER_USE_PLUGIN_NAME, computerUseConfig.pluginName])];
781
380
  return {
782
381
  start: {
@@ -845,8 +444,10 @@ function resolveCodexAppServerStartOptionsForAgent(params) {
845
444
  ...startOptions,
846
445
  managedCommandOrder: "desktop-first"
847
446
  };
447
+ if (!params.agentDir) throw new Error("Agent-scoped Codex requires an OpenClaw agent directory");
848
448
  return codexConfigEnablesNativeComputerUse({
849
449
  agentDir: params.agentDir,
450
+ codexHome: startOptions.codexHome,
850
451
  codexConfigToml: params.codexConfigToml,
851
452
  env: params.env,
852
453
  homeScope: "agent",
@@ -910,7 +511,10 @@ function codexAppServerStartOptionsKey(options, params = {}) {
910
511
  url: options.url ?? null,
911
512
  authToken: hashSecretForKey(options.authToken, "authToken"),
912
513
  headers: Object.entries(options.headers).toSorted(([left], [right]) => left.localeCompare(right)).map(([key, value]) => [key, hashSecretForKey(value, `header:${key}`)]),
913
- env: Object.entries(options.env ?? {}).toSorted(([left], [right]) => left.localeCompare(right)).map(([key, value]) => [key, hashSecretForKey(value, `env:${key}`)]),
514
+ env: Object.entries({
515
+ ...options.env,
516
+ ...options.codexHome ? { CODEX_HOME: options.codexHome } : {}
517
+ }).toSorted(([left], [right]) => left.localeCompare(right)).map(([key, value]) => [key, hashSecretForKey(value, `env:${key}`)]),
914
518
  clearEnv: [...options.clearEnv ?? []].toSorted(),
915
519
  authProfileId: params.authProfileId ?? null,
916
520
  authBindingFingerprint: params.authBindingFingerprint ?? null,
@@ -952,4 +556,4 @@ function codexSandboxPolicyForTurn(mode, cwd, nativeArgs = []) {
952
556
  };
953
557
  }
954
558
  //#endregion
955
- export { selectUserApprovalsReviewer as C, selectGuardianApprovalsReviewer as S, parseAllowedApprovalPoliciesFromCodexRequirements as _, resolveCodexAppServerStartOptionsForAgent as a, readCodexRequirementsToml as b, hasCodexMcpToolApprovalOverrides as c, withMcpElicitationsApprovalPolicy as d, assertCodexModelBackedReviewerEffectiveConfig as f, readCodexEffectiveConfig as g, CODEX_SESSION_OVERRIDABLE_LAYER_TYPES as h, resolveCodexAppServerHomeScope as i, resolveCodexAppServerNetworkProxy as l, resolveCodexModelBackedReviewerPolicyContext as m, codexSandboxPolicyForTurn as n, resolveCodexComputerUseConfig as o, canUseCodexModelBackedApprovalsReviewerForModel as p, createCodexAppServerConfig as r, assertCodexAppServerConnectionSecurity as s, codexAppServerStartOptionsKey as t, shouldAutoApproveCodexAppServerApprovals as u, parseAllowedApprovalsReviewersFromCodexRequirements as v, selectGuardianSandbox as w, selectGuardianApprovalPolicy as x, parseAllowedSandboxModesFromCodexRequirements as y };
559
+ export { resolveCodexAppServerStartOptionsForAgent as a, canUseCodexModelBackedApprovalsReviewerForModel as c, readCodexEffectiveConfig as d, resolveCodexAppServerHomeScope as i, resolveCodexModelBackedReviewerPolicyContext as l, codexSandboxPolicyForTurn as n, resolveCodexComputerUseConfig as o, createCodexAppServerConfig as r, assertCodexModelBackedReviewerEffectiveConfig as s, codexAppServerStartOptionsKey as t, CODEX_SESSION_OVERRIDABLE_LAYER_TYPES as u };