@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.
- package/assets/activity.svg +30 -0
- package/assets/icon.png +0 -0
- package/dist/.setup/account-usage-runtime-Eem_WGqY.mjs +75 -0
- package/dist/{apply-CvT8tW5i.js → .setup/apply-DDOi8uNx.mjs} +24 -30
- package/dist/.setup/async-questions-DdhOCwGi.mjs +27 -0
- package/dist/{attempt-client-cleanup-DKHzbwt5.js → .setup/attempt-client-cleanup-CEv1cKwF.mjs} +79 -49
- package/dist/.setup/attempt-terminal-gZrxQ35N.mjs +5 -0
- package/dist/.setup/attempt-workspace-context-DUVEn_CS.mjs +331 -0
- package/dist/{auth-binding-CWlKVccJ.js → .setup/auth-binding-DhLWa_7K.mjs} +1 -1
- package/dist/{auth-cache-key-7orQae_j.js → .setup/auth-cache-key-B2mpaI9D.mjs} +9 -81
- package/dist/{auth-profile-CwzO4_RG.js → .setup/auth-profile-WqZtZfXN.mjs} +1 -1
- package/dist/.setup/auth-profile-health-oHizqgye.mjs +53 -0
- package/dist/.setup/auth-profile-recovery-BREezV0L.mjs +14 -0
- package/dist/.setup/binding-connection-ThoatDcb.mjs +50 -0
- package/dist/.setup/binding-connection.runtime-yoHrABt-.mjs +48 -0
- package/dist/{bounded-turn-C_Hneydj.js → .setup/bounded-turn-B2HScEgT.mjs} +143 -32
- package/dist/{build-state-BCmg9-5p.js → .setup/build-state-C7EnDVgr.mjs} +1 -1
- package/dist/{capabilities-8vx68WLH.js → .setup/capabilities-CDXOOFdZ.mjs} +1 -1
- package/dist/{client-B57KWPQx.js → .setup/client-Cs08OXVQ.mjs} +705 -512
- package/dist/.setup/client-catalog-response-BMgt_4q4.mjs +285 -0
- package/dist/{command-dispatch-BpduNGVf.js → .setup/command-dispatch-B4JuOsOk.mjs} +8 -4
- package/dist/{command-formatters-lxlkNZgU.js → .setup/command-formatters-Bmqvr9tO.mjs} +8 -4
- package/dist/{command-handlers-tiL9iWj7.js → .setup/command-handlers-DW7Lx9oH.mjs} +137 -186
- package/dist/{command-rpc-CR5EOEZX.js → .setup/command-rpc-DixIj3HW.mjs} +47 -23
- package/dist/{compact-B_H3AOd7.js → .setup/compact-Du5UvtxA.mjs} +29 -51
- package/dist/{config-oIORaQ5T.js → .setup/config-BoTP_mrL.mjs} +5 -4
- package/dist/{config-options-CXMq1T-C.js → .setup/config-options-BvaRs51b.mjs} +50 -446
- package/dist/{protocol-5bh1G-H7.js → .setup/config-parsing-CcB9iPoq.mjs} +9 -51
- package/dist/{config-runtime-D0zGNIHu.js → .setup/config-runtime-C8Rw1m1m.mjs} +2 -2
- package/dist/.setup/config-security-BEReZ6go.mjs +380 -0
- package/dist/{conversation-binding-DsB4-O7U.js → .setup/conversation-binding-DP-gMrBP.mjs} +29 -38
- package/dist/{conversation-binding-data-BiodpIzq.js → .setup/conversation-binding-data-CrcyZk6O.mjs} +1 -1
- package/dist/{conversation-control-CtUu1b3m.js → .setup/conversation-control-uK9Jomlc.mjs} +32 -67
- package/dist/.setup/cyber-failover-DYwbmf1o.mjs +123 -0
- package/dist/.setup/cyber-failover-notice-e9G3J9-e.mjs +17 -0
- package/dist/{dynamic-tools-CmN5RAip.js → .setup/dynamic-tools-BDXl-8Cw.mjs} +936 -620
- package/dist/{effective-mcp-catalog-Bd73bqA8.js → .setup/effective-mcp-catalog-CvnvnGIe.mjs} +3 -3
- package/dist/{ephemeral-turn-D78_VmzO.js → .setup/ephemeral-turn-poidXgek.mjs} +9 -7
- package/dist/{event-projector-assistant-message-BmBM4qBV.js → .setup/event-projector-assistant-message-BsruvNrH.mjs} +8 -7
- package/dist/{event-projector-items-5VhsECCO.js → .setup/event-projector-items-C6L_5ZiT.mjs} +42 -8
- package/dist/{attempt-notifications-C9XufG6l.js → .setup/event-projector-usage-CnBS8Wa3.mjs} +102 -9
- package/dist/{harness-C7rRa7bm.js → .setup/harness-a_MsE4-_.mjs} +81 -21
- package/dist/{inference-context-Dr_mzvk4.js → .setup/inference-context-D96l9-ew.mjs} +1 -1
- package/dist/.setup/inference-proxy-b-aJMSxm.mjs +601 -0
- package/dist/{isolated-completion-DWVb5U2J.js → .setup/isolated-completion-BIZFhTNG.mjs} +18 -11
- package/dist/.setup/launch-args-DbFCehO7.mjs +196 -0
- package/dist/{managed-binary-D22rNEcR.js → .setup/managed-binary-BnshlFag.mjs} +14 -3
- package/dist/{managed-thread-store-D1t5jh3G.js → .setup/managed-thread-store-BMqgThVL.mjs} +48 -14
- package/dist/{model-catalog-Dq2n8f_p.js → .setup/model-catalog-CfXJf9Ay.mjs} +36 -12
- package/dist/{models-PCKOim-h.js → .setup/models-KnqBv0hE.mjs} +3 -3
- package/dist/.setup/native-auth-rWbGbMn3.mjs +57 -0
- package/dist/{native-subagent-history-DjtPloaU.js → .setup/native-subagent-history-0nYYgo0k.mjs} +43 -35
- package/dist/.setup/native-subagent-monitor-D3filLY2.mjs +4859 -0
- package/dist/{native-subagent-task-ids-BzTdT0Uw.js → .setup/native-subagent-task-ids-wb8CKZGN.mjs} +98 -44
- package/dist/{node-cli-sessions-DKaOmVUh.js → .setup/node-cli-sessions-r3avj02l.mjs} +86 -68
- package/dist/.setup/node-exec-server.runtime-BDwWXVpK.mjs +247 -0
- package/dist/{plan-7uG-Fp36.js → .setup/plan-CN3VwfNU.mjs} +133 -119
- package/dist/{plugin-activation-BYQculil.js → .setup/plugin-activation-DT3MNtqj.mjs} +7 -16
- package/dist/{plugin-app-cache-key-d0eKxy7b.js → .setup/plugin-app-cache-key-B2CsSdnV.mjs} +32 -44
- package/dist/{plugin-approval-roundtrip-Bz3FT8W5.js → .setup/plugin-approval-roundtrip-C0MZzCuP.mjs} +1 -1
- package/dist/{plugin-inventory-oL4Na1ZG.js → .setup/plugin-inventory-BoRei8Z4.mjs} +21 -11
- package/dist/{plugin-marketplace-discovery-P-Vndfqq.js → .setup/plugin-marketplace-discovery-CDOi8IFs.mjs} +4 -1
- package/dist/{plugin-metadata-cache-ClPJpRio.js → .setup/plugin-metadata-cache-Ctmo83k_.mjs} +226 -141
- package/dist/.setup/protocol-CANUwXJ3.mjs +17 -0
- package/dist/{provider-MQ8PVkuE.js → .setup/provider-BOsxQHOM.mjs} +9 -5
- package/dist/{provider-capabilities-BvCUL69A.js → .setup/provider-capabilities-BfE88FZ5.mjs} +31 -3
- package/dist/{rate-limits-CBMmWBr9.js → .setup/rate-limits-CMU3DUD0.mjs} +174 -151
- package/dist/{request-B7hEkBGq.js → .setup/request-D2L0zMrq.mjs} +130 -42
- package/dist/{run-attempt-CvsAAGa0.js → .setup/run-attempt-BHu11r7h.mjs} +1628 -966
- package/dist/.setup/run-attempt-lifecycle-B7JbY4-F.mjs +71 -0
- package/dist/{runtime-artifact-BJ0rXBZ_.js → .setup/runtime-artifact-CLZ8udh-.mjs} +29 -45
- package/dist/{sandbox-guard-BxgyoM8M.js → .setup/sandbox-guard-C2sRMOEY.mjs} +3 -3
- package/dist/{session-binding-CI8UuilT.js → .setup/session-binding-Cm0apEbd.mjs} +36 -83
- package/dist/{session-binding-record-Bcvslnhf.js → .setup/session-binding-record-BGoz8wOK.mjs} +202 -5
- package/dist/.setup/session-binding-sidecars-BlB5EvIS.mjs +546 -0
- package/dist/.setup/session-catalog-Pno1xGcl.mjs +2764 -0
- package/dist/{session-catalog-adoption-tcZi1IfX.js → .setup/session-catalog-adoption-BI6UTDZT.mjs} +58 -26
- package/dist/{session-catalog-archive-CwKg8Xz2.js → .setup/session-catalog-archive-lHBqzhaO.mjs} +6 -6
- package/dist/.setup/session-catalog-events-Bj6j94E_.mjs +347 -0
- package/dist/.setup/session-catalog-index-B9_VQIUz.mjs +1170 -0
- package/dist/.setup/session-catalog-index-order-hcdz07yN.mjs +48 -0
- package/dist/.setup/session-catalog-index-state-Dgh8ORJm.mjs +183 -0
- package/dist/{thread-history-page-D0JIp48V.js → .setup/session-catalog-native-projection-DowriLid.mjs} +223 -95
- package/dist/{session-catalog-node-adoption-B1tgDW-m.js → .setup/session-catalog-node-adoption-ITddWx_X.mjs} +25 -13
- package/dist/{session-catalog-node-continue-Ci-DXyJP.js → .setup/session-catalog-node-continue-6g6qi4A9.mjs} +24 -15
- package/dist/.setup/session-catalog-projection-zK_PUsiE.mjs +422 -0
- package/dist/{session-cli-DNN_jhGc.js → .setup/session-cli-irrD-uo7.mjs} +3 -3
- package/dist/{session-history-Cz-tOOYj.js → .setup/session-history-BrqhSCf9.mjs} +19 -19
- package/dist/{session-history-import-DwyijFI6.js → .setup/session-history-import-D-3wAgOP.mjs} +4 -4
- package/dist/{session-history-read-cxPUxyVV.js → .setup/session-history-read-B3ZfSUbF.mjs} +2 -2
- package/dist/{session-history.worker-BeK1YOyT.js → .setup/session-history.worker-CaCh0xF_.mjs} +10 -24
- package/dist/{session-initialization-Ct0_Hzmg.js → .setup/session-initialization-rcgbZiid.mjs} +2 -2
- package/dist/{session-permission-policy-BBmXA8Eg.js → .setup/session-permission-policy-BI1QK_98.mjs} +2 -2
- package/dist/{session-retirement-B2YfbAAT.js → .setup/session-retirement-BH-S6qkJ.mjs} +26 -7
- package/dist/{settled-turn-context-Du6gdUDd.js → .setup/settled-turn-context-fmwouT5I.mjs} +2 -2
- package/dist/{settled-turn-finalizer-Dn91stmc.js → .setup/settled-turn-finalizer-DiAi6Kx6.mjs} +12 -12
- package/dist/{shared-client-CscigXXL.js → .setup/shared-client-DA4VR4Eb.mjs} +332 -221
- package/dist/{side-question-BGMJQf4U.js → .setup/side-question-BJ1wSDcB.mjs} +183 -230
- package/dist/{source-CElXU0Oy.js → .setup/source-CUzJq5WN.mjs} +11 -10
- package/dist/.setup/spawn-error-CL3n6MAa.mjs +57 -0
- package/dist/{thread-archive-guard-DfpBr-Sz.js → .setup/thread-archive-guard-C9frICzX.mjs} +10 -3
- package/dist/.setup/thread-history-page-DoVpnHim.mjs +83 -0
- package/dist/{thread-lifecycle-DXl1-I6b.js → .setup/thread-lifecycle-B3mfz1TG.mjs} +347 -2318
- package/dist/{thread-ownership-BsDRTsyp.js → .setup/thread-ownership-DcTtAcXj.mjs} +6 -4
- package/dist/{thread-policy-BuEQfE0g.js → .setup/thread-policy-DGuQsuFC.mjs} +19 -3
- package/dist/.setup/thread-requests-BLvGkP2R.mjs +2205 -0
- package/dist/{thread-resume-DsDOZpFg.js → .setup/thread-resume-DIBXwOpE.mjs} +8 -5
- package/dist/.setup/timeout-C910MdAB.mjs +80 -0
- package/dist/{transcript-history-projection-v17wXgdK.js → .setup/transcript-history-projection-ZZpkFkJ_.mjs} +96 -61
- package/dist/{transcript-mirror-C5CKgNy6.js → .setup/transcript-mirror-BtHDBp1G.mjs} +224 -195
- package/dist/{transcript-mirror-attestation-DibE0krH.js → .setup/transcript-mirror-attestation-CzM-94NC.mjs} +4 -1
- package/dist/{transport-stdio-BGjHoYLr.js → .setup/transport-stdio-h2VHOskC.mjs} +274 -89
- package/dist/{upstream-session-fork-BZerMte_.js → .setup/upstream-session-fork-BUr4OUbC.mjs} +51 -42
- package/dist/{usage-tCk-mg_x.js → .setup/usage-BML0r-ua.mjs} +5 -4
- package/dist/.setup/usage-limit-error-DUMbefVY.mjs +166 -0
- package/dist/{web-search-provider.runtime-B7bGbGWq.js → .setup/web-search-provider.runtime-CDKlN-Rv.mjs} +4 -3
- package/dist/api.js +23 -12
- package/dist/catalog-page-worker-entrypoint.js +12 -0
- package/dist/catalog-page.worker.js +9 -0
- package/dist/cli-metadata.js +1 -1
- package/dist/doctor-contract-api.js +8 -528
- package/dist/harness.js +1 -1
- package/dist/index.js +306 -215
- package/dist/media-understanding-provider.js +3 -3
- package/dist/migration-provider-api.js +1 -1
- package/dist/native-tool-policy.js +12 -0
- package/dist/provider-discovery.js +18 -0
- package/dist/session-history-worker-runtime.js +36 -35
- package/dist/session-history.worker.js +2 -2
- package/dist/web-search-contract-api.js +1 -1
- package/openclaw.plugin.json +354 -69
- package/package.json +14 -8
- package/dist/attempt-context-D44yeDII.js +0 -636
- package/dist/binding-connection-D3udKbIE.js +0 -60
- package/dist/event-projector-usage-BfXmpOec.js +0 -102
- package/dist/inference-proxy-HGXKUIre.js +0 -311
- package/dist/launch-args-RXQwn8zV.js +0 -90
- package/dist/native-subagent-history-owner-Pcp7JuVF.js +0 -34
- package/dist/native-subagent-monitor-fQ7eIXEf.js +0 -2978
- package/dist/node-exec-server.runtime-Cl2vapEi.js +0 -226
- package/dist/rpc-error-ttN_QjEm.js +0 -30
- package/dist/session-catalog-ct-AH01I.js +0 -1477
- package/dist/session-catalog-home-id-CwhLdC03.js +0 -18
- package/dist/session-catalog-provenance-D-dIfRAH.js +0 -96
- package/dist/timeout-BVw8aaM1.js +0 -33
- package/dist/version-omm6IPI3.js +0 -12
- /package/dist/{auth-profile-selection-DFu9e167.js → .setup/auth-profile-selection-DFu9e167.mjs} +0 -0
- /package/dist/{config-utils-DujwEnhg.js → .setup/config-utils-DujwEnhg.mjs} +0 -0
- /package/dist/{context-compaction-activity-CMla5FPJ.js → .setup/context-compaction-activity-CMla5FPJ.mjs} +0 -0
- /package/dist/{elicitation-input-DPoK8F7w.js → .setup/elicitation-input-DPoK8F7w.mjs} +0 -0
- /package/dist/{history-rejection-B4nOXNXF.js → .setup/history-rejection-B4nOXNXF.mjs} +0 -0
- /package/dist/{image-payload-sanitizer-tupAr-2o.js → .setup/image-payload-sanitizer-tupAr-2o.mjs} +0 -0
- /package/dist/{incognito-session-uhrBF6wJ.js → .setup/incognito-session-uhrBF6wJ.mjs} +0 -0
- /package/dist/{local-runtime-attribution-B_2mnqhb.js → .setup/local-runtime-attribution-B_2mnqhb.mjs} +0 -0
- /package/dist/{native-execution-policy-umd0tgh4.js → .setup/native-execution-policy-umd0tgh4.mjs} +0 -0
- /package/dist/{rolldown-runtime-8H4AJuhK.js → .setup/rolldown-runtime-8H4AJuhK.mjs} +0 -0
- /package/dist/{session-binding-meta-B7aEMU7g.js → .setup/session-binding-meta-B7aEMU7g.mjs} +0 -0
- /package/dist/{session-upstream-marker-D15C9NHp.js → .setup/session-upstream-marker-D15C9NHp.mjs} +0 -0
- /package/dist/{upstream-prompt-provenance-LphB8slG.js → .setup/upstream-prompt-provenance-LphB8slG.mjs} +0 -0
- /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.
|
|
2
|
-
import {
|
|
3
|
-
import { r as
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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(
|
|
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 {
|
|
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 };
|