@openclaw/codex 2026.9.2 → 2026.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +2 -0
  2. package/dist/api.js +14 -19
  3. package/dist/apply-B6el6hdO.js +357 -0
  4. package/dist/{attempt-client-cleanup-Bp1ZOnk2.js → attempt-client-cleanup-D6cR54TV.js} +39 -19
  5. package/dist/{attempt-context-CSazkWns.js → attempt-context-AO4DSjE0.js} +8 -6
  6. package/dist/{event-projector-usage-ZqEVbAEY.js → attempt-notifications--H8zXR5-.js} +3 -106
  7. package/dist/auth-cache-key-Kq6oerr6.js +498 -0
  8. package/dist/auth-profile-CwzO4_RG.js +43 -0
  9. package/dist/auth-profile-selection-DFu9e167.js +45 -0
  10. package/dist/binding-connection-QqgcPCgk.js +60 -0
  11. package/dist/{bounded-turn-DxGJRYbY.js → bounded-turn-lRpmZHFv.js} +25 -122
  12. package/dist/build-state-6RL6qohz.js +19 -0
  13. package/dist/{capabilities-B1mgvpP8.js → capabilities-BeqLPbtM.js} +1 -1
  14. package/dist/cli-metadata.js +1 -1
  15. package/dist/client-BEKu4yDx.js +3983 -0
  16. package/dist/command-dispatch-CisT9Jqq.js +21 -0
  17. package/dist/{command-formatters-DSbGMXA0.js → command-formatters-DeTfrapr.js} +2 -2
  18. package/dist/{command-handlers-DOJvGv6-.js → command-handlers-BfIsJEuA.js} +31 -21
  19. package/dist/command-rpc-BMqRQOFX.js +226 -0
  20. package/dist/{compact-Y_xBqrHN.js → compact-CGJZ2rlb.js} +19 -14
  21. package/dist/config-JDfTI4VI.js +106 -0
  22. package/dist/{config-CyapYSji.js → config-options-jnIFvwxD.js} +204 -592
  23. package/dist/config-runtime-BWf6JLWG.js +11 -0
  24. package/dist/conversation-binding-CxOlHiix.js +889 -0
  25. package/dist/{plugin-marketplace-discovery-B7gHXJ3d.js → conversation-control-CUCrSIQI.js} +10 -142
  26. package/dist/doctor-contract-api.js +5 -5
  27. package/dist/{dynamic-tools-BwpvTxaX.js → dynamic-tools-D-JBoaLt.js} +66 -70
  28. package/dist/{effective-mcp-catalog-CY9Jn4bA.js → effective-mcp-catalog-J_5Ep5Um.js} +3 -3
  29. package/dist/{elicitation-input-DMkeki8d.js → elicitation-input-DPoK8F7w.js} +8 -22
  30. package/dist/ephemeral-turn-DSwzP8YY.js +101 -0
  31. package/dist/{event-projector-assistant-message-B9kp6iGC.js → event-projector-assistant-message-BmBM4qBV.js} +12 -25
  32. package/dist/event-projector-usage-CIyrYYid.js +102 -0
  33. package/dist/{harness-Czh2Sdoc.js → harness-FR6eQgyO.js} +31 -24
  34. package/dist/harness.js +1 -1
  35. package/dist/history-rejection-B4nOXNXF.js +13 -0
  36. package/dist/incognito-session-uhrBF6wJ.js +15 -0
  37. package/dist/index.js +411 -2875
  38. package/dist/{isolated-completion-CRh-51AK.js → isolated-completion-DHBefrzg.js} +7 -4
  39. package/dist/launch-args-RXQwn8zV.js +90 -0
  40. package/dist/{managed-binary-DcpnJF9x.js → managed-binary-DrjjRRUD.js} +4 -103
  41. package/dist/managed-thread-store-D1t5jh3G.js +66 -0
  42. package/dist/media-understanding-provider.js +4 -1
  43. package/dist/{model-catalog-DT5vo6qo.js → model-catalog-B_6M04Wo.js} +6 -5
  44. package/dist/{models-CcrgSMQR.js → models-P9k2qAof.js} +3 -3
  45. package/dist/native-execution-policy-umd0tgh4.js +128 -0
  46. package/dist/{native-subagent-monitor-B3bvQGcg.js → native-subagent-monitor-BbCUKRwC.js} +69 -42
  47. package/dist/node-cli-sessions-rj0ysJwM.js +527 -0
  48. package/dist/{node-exec-server.runtime-nfbUOtUB.js → node-exec-server.runtime-BY_ctYnT.js} +53 -22
  49. package/dist/plan-BMJdMOEF.js +711 -0
  50. package/dist/plugin-activation-BQK-f5sV.js +133 -0
  51. package/dist/{thread-resume-BLgqkUc1.js → plugin-app-cache-key-CdSQzWyX.js} +4 -52
  52. package/dist/{plugin-approval-roundtrip-aQVdyL5g.js → plugin-approval-roundtrip-DeW95wB5.js} +1 -1
  53. package/dist/plugin-inventory-CoRCzWW4.js +325 -0
  54. package/dist/plugin-marketplace-discovery-3akBizzF.js +134 -0
  55. package/dist/{plugin-metadata-cache-BwCLTY_U.js → plugin-metadata-cache-DgNfRAGA.js} +13 -9
  56. package/dist/protocol-CAAcVIKF.js +275 -0
  57. package/dist/{provider-capabilities-BpG9Ltc5.js → provider-capabilities-W4tfK5Y5.js} +2 -2
  58. package/dist/{rate-limits-Fx_l4eNa.js → rate-limits-Bqnx1N4z.js} +1 -1
  59. package/dist/request-CGvGOpeR.js +198 -0
  60. package/dist/{run-attempt-BzthFQSM.js → run-attempt-DwKds3DN.js} +589 -373
  61. package/dist/{runtime-artifact-Bh_gf6-t.js → runtime-artifact-T-NwqeSH.js} +27 -27
  62. package/dist/sandbox-guard-BcT66fWy.js +165 -0
  63. package/dist/{session-binding-4Ki04sW-.js → session-binding-CKSepwIC.js} +29 -47
  64. package/dist/{session-binding-record-CyaXZvTe.js → session-binding-record-CaZjYwNS.js} +11 -25
  65. package/dist/session-catalog-HaDcp7Sv.js +1533 -0
  66. package/dist/session-catalog-adoption-BKLtSrwi.js +251 -0
  67. package/dist/session-catalog-archive-D0i2pGj2.js +56 -0
  68. package/dist/session-catalog-home-id-D7-aLiNt.js +190 -0
  69. package/dist/session-catalog-node-adoption-BUuDYY8R.js +182 -0
  70. package/dist/session-catalog-node-continue-CBtc4wkI.js +238 -0
  71. package/dist/session-catalog-parsing-CdD3JhdM.js +280 -0
  72. package/dist/session-catalog-provenance-DkJHo735.js +124 -0
  73. package/dist/{session-cli-BjLhpmS1.js → session-cli-CbgaHh0f.js} +3 -2
  74. package/dist/{session-history-DWmMqiqW.js → session-history-Cz-tOOYj.js} +6 -3
  75. package/dist/{session-upstream-marker-DReTpGz6.js → session-history-import-DFN7sWRU.js} +5 -50
  76. package/dist/{session-history-read-LHldwvyh.js → session-history-read-cxPUxyVV.js} +21 -7
  77. package/dist/session-history-worker-runtime.js +18 -6
  78. package/dist/{session-history.worker-zZVcx0ME.js → session-history.worker-CNEvGaU5.js} +58 -51
  79. package/dist/session-history.worker.js +1 -1
  80. package/dist/{session-initialization-BCFVnLL4.js → session-initialization-Jo86C60I.js} +2 -2
  81. package/dist/{session-permission-policy-BaueHmSj.js → session-permission-policy-B22InTp_.js} +4 -7
  82. package/dist/{session-retirement-DNdmYdFc.js → session-retirement-BSNG_mhf.js} +6 -5
  83. package/dist/session-upstream-marker-D15C9NHp.js +46 -0
  84. package/dist/{settled-turn-context-BOM3Y1pl.js → settled-turn-context-Du6gdUDd.js} +9 -9
  85. package/dist/{settled-turn-finalizer-BI-b1sry.js → settled-turn-finalizer-BuLUrZl2.js} +7 -6
  86. package/dist/shared-client-CVhez2Uo.js +2911 -0
  87. package/dist/{side-question-B6DWAw1A.js → side-question-DLbr2vUU.js} +64 -169
  88. package/dist/source-Da-h6f7e.js +518 -0
  89. package/dist/thread-archive-guard-D1bP04Tf.js +53 -0
  90. package/dist/{thread-lifecycle-DPK30jad.js → thread-lifecycle-D1pzRwHB.js} +112 -616
  91. package/dist/{thread-ownership-CbucAmmp.js → thread-ownership-D6oASVRu.js} +13 -15
  92. package/dist/thread-policy-D8kI7yAO.js +54 -0
  93. package/dist/thread-resume-T5cveyxA.js +52 -0
  94. package/dist/timeout-BVw8aaM1.js +33 -0
  95. package/dist/{transcript-mirror-attestation-Byl34PC-.js → transcript-mirror-attestation-DibE0krH.js} +17 -4
  96. package/dist/{transcript-mirror-_njEB84z.js → transcript-mirror-t5TOccct.js} +50 -260
  97. package/dist/{transport-stdio-CzTngV0j.js → transport-stdio-BGjHoYLr.js} +73 -43
  98. package/dist/{upstream-session-fork-1fwbNKzQ.js → upstream-session-fork-De-sLJ2r.js} +26 -18
  99. package/dist/{usage-i9fv5-4m.js → usage-CPPTmBvZ.js} +4 -3
  100. package/dist/version-omm6IPI3.js +12 -0
  101. package/dist/{web-search-provider.runtime-DKQn67A7.js → web-search-provider.runtime-CSVgQL0w.js} +3 -3
  102. package/openclaw.plugin.json +22 -1
  103. package/package.json +4 -4
  104. package/dist/request-C8H22rPi.js +0 -475
  105. package/dist/session-catalog-B47uwekb.js +0 -3272
  106. package/dist/shared-client-CKhX2kFt.js +0 -7505
  107. package/dist/thread-policy-CTalhWFy.js +0 -105
  108. package/dist/{auth-binding-Ds_QVm-X.js → auth-binding-Co2Vfcf_.js} +1 -1
@@ -1,11 +1,15 @@
1
- import { M as resolveCodexAppServerHomeDir, i as resolveCodexAppServerRuntimeOptions, o as resolveCodexComputerUseConfig } from "./config-CyapYSji.js";
2
- import { B as isCodexAppServerIndeterminateRequestCancellationError, D as acquireCodexNativeConfigFence, Jt as assertNotSymlink, S as waitForCodexAppServerClientDesktopGenerationDrain, V as isCodexAppServerIndeterminateTransportError, c as getLeasedSharedCodexAppServerClient, d as readCodexAppServerClientDesktopGeneration, g as resolveCodexNativeConfigFenceKey, h as releaseLeasedSharedCodexAppServerClient, p as readCodexAppServerClientProcessIdentity, qt as resolveCodexManagedBundledMarketplacePath, t as assertCodexAppServerClientStartSelectionCurrent, u as isCodexAppServerStartSelectionChangedError, z as isCodexAppServerConnectionClosedError, zt as reconcileCodexComputerUseStartArtifacts } from "./shared-client-CKhX2kFt.js";
3
- import { c as resolveFirstExistingMacOSDesktopCodexBundledMarketplacePath, t as isManagedCodexDesktopCommand, u as resolveMacOSDesktopCodexBundledMarketplaceCandidates } from "./managed-binary-DcpnJF9x.js";
4
- import { i as requestCodexAppServerJson } from "./request-C8H22rPi.js";
5
- import { n as describeControlFailure } from "./capabilities-B1mgvpP8.js";
6
- import fs from "node:fs/promises";
7
- import path from "node:path";
1
+ import { o as resolveCodexComputerUseConfig } from "./config-options-jnIFvwxD.js";
2
+ import { s as resolveCodexAppServerHomeDir } from "./protocol-CAAcVIKF.js";
3
+ import { c as isCodexAppServerIndeterminateTransportError, o as isCodexAppServerConnectionClosedError, s as isCodexAppServerIndeterminateRequestCancellationError } from "./client-BEKu4yDx.js";
4
+ import { c as resolveMacOSDesktopCodexBundledMarketplaceCandidates, o as resolveFirstExistingMacOSDesktopCodexBundledMarketplacePath, t as isManagedCodexDesktopCommand } from "./managed-binary-DrjjRRUD.js";
5
+ import { n as describeControlFailure } from "./capabilities-BeqLPbtM.js";
6
+ import { i as requestCodexAppServerJson } from "./request-CGvGOpeR.js";
7
+ import "./config-JDfTI4VI.js";
8
+ import { n as resolveCodexAppServerRuntimeOptions } from "./config-runtime-BWf6JLWG.js";
9
+ import { $ as assertNotSymlink, Q as resolveCodexManagedBundledMarketplacePath, T as acquireCodexNativeConfigFence, Y as reconcileCodexComputerUseStartArtifacts, b as waitForCodexAppServerClientDesktopGenerationDrain, c as getLeasedSharedCodexAppServerClient, d as readCodexAppServerClientDesktopGeneration, g as resolveCodexNativeConfigFenceKey, h as releaseLeasedSharedCodexAppServerClient, p as readCodexAppServerClientProcessIdentity, t as assertCodexAppServerClientStartSelectionCurrent, u as isCodexAppServerStartSelectionChangedError } from "./shared-client-CVhez2Uo.js";
8
10
  import { existsSync } from "node:fs";
11
+ import path from "node:path";
12
+ import fs$1 from "node:fs/promises";
9
13
  //#region extensions/codex/src/app-server/computer-use.ts
10
14
  /**
11
15
  * Computer Use plugin/MCP readiness checks and optional install flow for Codex
@@ -232,7 +236,7 @@ async function resolveExplicitManagedComputerUseInstallContext(params) {
232
236
  const desktopGeneration = readCodexAppServerClientDesktopGeneration(params.client);
233
237
  if (!desktopGeneration) throw new Error("Codex Computer Use install requires a desktop-generation-bound client; reconnect and retry.");
234
238
  const expectedHome = resolveCodexAppServerHomeDir(params.agentDir);
235
- const [actualRealHome, expectedRealHome] = await Promise.all([fs.realpath(codexHome).catch(() => void 0), fs.realpath(expectedHome).catch(() => void 0)]);
239
+ const [actualRealHome, expectedRealHome] = await Promise.all([fs$1.realpath(codexHome).catch(() => void 0), fs$1.realpath(expectedHome).catch(() => void 0)]);
236
240
  if (!actualRealHome || actualRealHome !== expectedRealHome) return;
237
241
  return {
238
242
  client: params.client,
@@ -245,7 +249,7 @@ async function resolveExplicitManagedComputerUseInstallContext(params) {
245
249
  async function resolveClientManagedBundledMarketplacePath(client, agentDir) {
246
250
  const codexHome = client?.getRuntimeIdentity()?.codexHome;
247
251
  if (!codexHome || !agentDir) return;
248
- const [actualRealHome, expectedRealHome] = await Promise.all([fs.realpath(codexHome).catch(() => void 0), fs.realpath(resolveCodexAppServerHomeDir(agentDir)).catch(() => void 0)]);
252
+ const [actualRealHome, expectedRealHome] = await Promise.all([fs$1.realpath(codexHome).catch(() => void 0), fs$1.realpath(resolveCodexAppServerHomeDir(agentDir)).catch(() => void 0)]);
249
253
  if (!actualRealHome || actualRealHome !== expectedRealHome) return;
250
254
  const managedPath = resolveCodexManagedBundledMarketplacePath(codexHome);
251
255
  return existsSync(managedPath) ? managedPath : void 0;
@@ -0,0 +1,275 @@
1
+ import { g as CODEX_PLUGIN_MARKETPLACE_NAME_PATTERN, i as normalizeCodexServiceTier } from "./config-utils-C57JiJrU.js";
2
+ import { n as normalizeCodexAppServerArgs } from "./launch-args-RXQwn8zV.js";
3
+ import { asNullableRecord, isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
+ import { z } from "zod";
5
+ import { buildSecretInputSchema } from "openclaw/plugin-sdk/secret-input";
6
+ import { detectWindowsSpawnCommandInlineArgs } from "openclaw/plugin-sdk/windows-spawn";
7
+ import path from "node:path";
8
+ import { homedir } from "node:os";
9
+ //#region extensions/codex/src/app-server/session-discovery-config.ts
10
+ const codexSessionCatalogHomeSchema = z.union([z.string().trim().min(1), z.object({
11
+ path: z.string().trim().min(1),
12
+ label: z.string().trim().min(1).optional()
13
+ }).strict()]);
14
+ const codexSessionCatalogConfigSchema = z.object({
15
+ enabled: z.boolean().optional(),
16
+ homes: z.array(codexSessionCatalogHomeSchema).optional()
17
+ }).strict();
18
+ const codexDiscoveryConfigSchema = z.object({
19
+ enabled: z.boolean().optional(),
20
+ timeoutMs: z.number().positive().optional()
21
+ }).strict();
22
+ //#endregion
23
+ //#region extensions/codex/src/app-server/config-parsing.ts
24
+ const DEFAULT_CODEX_COMPUTER_USE_PLUGIN_NAME = "computer-use";
25
+ const DEFAULT_CODEX_COMPUTER_USE_MCP_SERVER_NAME = "computer-use";
26
+ const DEFAULT_CODEX_COMPUTER_USE_MARKETPLACE_DISCOVERY_TIMEOUT_MS = 6e4;
27
+ const DEFAULT_CODEX_COMPUTER_USE_LIVE_TEST_TIMEOUT_MS = 6e4;
28
+ const DEFAULT_CODEX_COMPUTER_USE_TOOL_CALL_TIMEOUT_MS = 6e4;
29
+ const DEFAULT_CODEX_APP_SERVER_NETWORK_PROXY_PROFILE_PREFIX = "openclaw-network";
30
+ const codexAppServerTransportSchema = z.enum([
31
+ "stdio",
32
+ "websocket",
33
+ "unix"
34
+ ]);
35
+ const codexAppServerHomeScopeSchema = z.enum(["agent", "user"]);
36
+ const SecretInputSchema = buildSecretInputSchema();
37
+ const codexAppServerPolicyModeSchema = z.enum(["yolo", "guardian"]);
38
+ const codexAppServerApprovalPolicySchema = z.preprocess((value) => value === "on-failure" ? "on-request" : value, z.enum(["never", "on-request"]));
39
+ const codexAppServerSandboxSchema = z.enum([
40
+ "read-only",
41
+ "workspace-write",
42
+ "danger-full-access"
43
+ ]);
44
+ const codexAppServerApprovalsReviewerSchema = z.enum([
45
+ "user",
46
+ "auto_review",
47
+ "guardian_subagent"
48
+ ]);
49
+ const codexDynamicToolsLoadingSchema = z.enum(["searchable", "direct"]);
50
+ const codexComputerUseHealthIntervalSchema = z.union([
51
+ z.literal(30),
52
+ z.literal(60),
53
+ z.literal(120),
54
+ z.literal(240)
55
+ ]);
56
+ const codexComputerUsePluginCacheModeSchema = z.enum(["shared", "independent"]);
57
+ const codexPluginDestructivePolicySchema = z.union([
58
+ z.boolean(),
59
+ z.literal("auto"),
60
+ z.literal("ask")
61
+ ]);
62
+ const codexAppServerServiceTierSchema = z.preprocess((value) => value === null ? null : normalizeCodexServiceTier(value), z.string().trim().min(1).nullable().optional()).optional();
63
+ const codexAppServerExperimentalSchema = z.object({ sandboxExecServer: z.boolean().optional() }).strict();
64
+ const codexAppServerRemoteWorkspaceRootSchema = z.string().trim().min(1);
65
+ const codexAppServerNetworkProxyDomainPermissionSchema = z.enum(["allow", "deny"]);
66
+ const codexAppServerNetworkProxyUnixSocketPermissionSchema = z.enum(["allow", "none"]);
67
+ const codexAppServerNetworkProxySchema = z.object({
68
+ enabled: z.boolean().optional(),
69
+ profileName: z.string().trim().min(1).optional(),
70
+ baseProfile: z.enum(["read-only", "workspace"]).optional(),
71
+ mode: z.enum(["limited", "full"]).optional(),
72
+ domains: z.record(z.string(), codexAppServerNetworkProxyDomainPermissionSchema).optional(),
73
+ unixSockets: z.record(z.string(), codexAppServerNetworkProxyUnixSocketPermissionSchema).optional(),
74
+ proxyUrl: z.string().trim().min(1).optional(),
75
+ socksUrl: z.string().trim().min(1).optional(),
76
+ enableSocks5: z.boolean().optional(),
77
+ enableSocks5Udp: z.boolean().optional(),
78
+ allowUpstreamProxy: z.boolean().optional(),
79
+ allowLocalBinding: z.boolean().optional(),
80
+ dangerouslyAllowNonLoopbackProxy: z.boolean().optional(),
81
+ dangerouslyAllowAllUnixSockets: z.boolean().optional()
82
+ }).strict();
83
+ const codexPluginEntryConfigSchema = z.object({
84
+ enabled: z.boolean().optional(),
85
+ marketplaceName: z.string().regex(CODEX_PLUGIN_MARKETPLACE_NAME_PATTERN).optional(),
86
+ pluginName: z.string().trim().min(1).optional(),
87
+ allow_destructive_actions: codexPluginDestructivePolicySchema.optional()
88
+ }).strict();
89
+ const codexPluginsConfigSchema = z.object({
90
+ enabled: z.boolean().optional(),
91
+ allow_all_plugins: z.boolean().optional(),
92
+ allow_destructive_actions: codexPluginDestructivePolicySchema.optional(),
93
+ plugins: z.record(z.string(), codexPluginEntryConfigSchema).optional()
94
+ }).strict();
95
+ const codexSupervisionEndpointSchema = z.union([z.object({
96
+ id: z.string().optional(),
97
+ label: z.string().optional(),
98
+ transport: z.literal("stdio-proxy").optional(),
99
+ command: z.string().optional(),
100
+ args: z.array(z.string()).optional(),
101
+ cwd: z.string().optional()
102
+ }).strict(), z.object({
103
+ id: z.string().optional(),
104
+ label: z.string().optional(),
105
+ transport: z.literal("websocket"),
106
+ url: z.string(),
107
+ authTokenEnv: z.string().optional()
108
+ }).strict()]);
109
+ const codexSupervisionConfigSchema = z.object({
110
+ enabled: z.boolean().optional(),
111
+ endpoints: z.array(codexSupervisionEndpointSchema).optional(),
112
+ allowRawTranscripts: z.boolean().optional(),
113
+ allowWriteControls: z.boolean().optional()
114
+ }).strict();
115
+ const codexPluginConfigSchema = z.object({
116
+ codexDynamicToolsLoading: codexDynamicToolsLoadingSchema.optional(),
117
+ codexDynamicToolsExclude: z.array(z.string()).optional(),
118
+ sessionCatalog: codexSessionCatalogConfigSchema.optional(),
119
+ discovery: codexDiscoveryConfigSchema.optional(),
120
+ computerUse: z.object({
121
+ enabled: z.boolean().optional(),
122
+ autoInstall: z.boolean().optional(),
123
+ marketplaceDiscoveryTimeoutMs: z.number().positive().optional(),
124
+ liveTestTimeoutMs: z.number().positive().optional(),
125
+ toolCallTimeoutMs: z.number().positive().optional(),
126
+ healthCheckEnabled: z.boolean().optional(),
127
+ healthCheckIntervalMinutes: codexComputerUseHealthIntervalSchema.optional(),
128
+ pluginCacheMode: codexComputerUsePluginCacheModeSchema.optional(),
129
+ strictReadiness: z.boolean().optional(),
130
+ autoRepair: z.boolean().optional(),
131
+ marketplaceSource: z.string().optional(),
132
+ marketplacePath: z.string().optional(),
133
+ marketplaceName: z.string().optional(),
134
+ pluginName: z.string().optional(),
135
+ mcpServerName: z.string().optional()
136
+ }).strict().optional(),
137
+ codexPlugins: z.unknown().optional(),
138
+ supervision: codexSupervisionConfigSchema.optional(),
139
+ appServer: z.object({
140
+ mode: codexAppServerPolicyModeSchema.optional(),
141
+ transport: codexAppServerTransportSchema.optional(),
142
+ homeScope: codexAppServerHomeScopeSchema.optional(),
143
+ command: z.string().optional(),
144
+ args: z.union([z.array(z.string()), z.string()]).optional(),
145
+ url: z.string().optional(),
146
+ authToken: SecretInputSchema.optional(),
147
+ headers: z.record(z.string(), SecretInputSchema).optional(),
148
+ clearEnv: z.array(z.string()).optional(),
149
+ remoteWorkspaceRoot: codexAppServerRemoteWorkspaceRootSchema.optional(),
150
+ codeModeOnly: z.boolean().optional(),
151
+ loopDetectionPreToolUseRelay: z.boolean().optional(),
152
+ requestTimeoutMs: z.number().positive().optional(),
153
+ approvalPolicy: codexAppServerApprovalPolicySchema.optional(),
154
+ sandbox: codexAppServerSandboxSchema.optional(),
155
+ approvalsReviewer: codexAppServerApprovalsReviewerSchema.optional(),
156
+ serviceTier: codexAppServerServiceTierSchema,
157
+ networkProxy: codexAppServerNetworkProxySchema.optional(),
158
+ defaultWorkspaceDir: z.string().optional(),
159
+ experimental: codexAppServerExperimentalSchema.optional()
160
+ }).strict().optional()
161
+ }).strict();
162
+ function readCodexPluginConfig(value) {
163
+ if (asNullableRecord(asNullableRecord(value)?.appServer)?.approvalPolicy === "untrusted") throw new Error("plugins.entries.codex.config.appServer.approvalPolicy=\"untrusted\" is retired; run \"openclaw doctor --fix\" to migrate it to \"on-request\".");
164
+ const parsed = codexPluginConfigSchema.safeParse(value);
165
+ if (!parsed.success) return {};
166
+ const { codexPlugins: rawCodexPlugins, ...config } = parsed.data;
167
+ const plugins = codexPluginsConfigSchema.safeParse(rawCodexPlugins);
168
+ if (!plugins.success) return config;
169
+ return {
170
+ ...config,
171
+ ...plugins.data ? { codexPlugins: plugins.data } : {}
172
+ };
173
+ }
174
+ function isCodexSandboxExecServerEnabled(pluginConfig, sandbox) {
175
+ return isCodexRemoteExecPlacementSandbox(sandbox) || readCodexPluginConfig(pluginConfig).appServer?.experimental?.sandboxExecServer === true;
176
+ }
177
+ function isCodexRemoteExecPlacementSandbox(sandbox) {
178
+ return typeof sandbox === "object" && sandbox !== null && "placementExecutionMode" in sandbox && sandbox.placementExecutionMode === "remote-exec";
179
+ }
180
+ function isCodexPairedNodeRemoteExecPlacementSandbox(sandbox) {
181
+ return isCodexRemoteExecPlacementSandbox(sandbox) && typeof sandbox === "object" && sandbox !== null && "placementNodeId" in sandbox && typeof sandbox.placementNodeId === "string" && sandbox.placementNodeId.length > 0;
182
+ }
183
+ function assertCodexAppServerCommandHasNoInlineArgs(params) {
184
+ const inlineArgs = detectWindowsSpawnCommandInlineArgs(params.command);
185
+ if (!inlineArgs) return;
186
+ const sourceLabel = params.source === "env" ? "OPENCLAW_CODEX_APP_SERVER_BIN" : "plugins.entries.codex.config.appServer.command";
187
+ const argsLabel = params.source === "env" ? "OPENCLAW_CODEX_APP_SERVER_ARGS" : "plugins.entries.codex.config.appServer.args";
188
+ throw new Error(`${sourceLabel} must be only the Codex app-server executable path; "${inlineArgs.executable}" was configured with inline arguments "${inlineArgs.arguments}". Move those arguments to ${argsLabel}, or remove the override to use the managed Codex startup path.`);
189
+ }
190
+ function resolveCodexPluginsPolicy(pluginConfig) {
191
+ const config = readCodexPluginConfig(pluginConfig).codexPlugins;
192
+ const configured = config !== void 0;
193
+ const enabled = config?.enabled === true;
194
+ const destructivePolicy = resolveCodexPluginDestructivePolicy(config?.allow_destructive_actions ?? true);
195
+ const pluginPolicies = Object.entries(config?.plugins ?? {}).flatMap(([configKey, entry]) => {
196
+ if (!isCodexPluginMarketplaceName(entry.marketplaceName) || !entry.pluginName) return [];
197
+ const entryDestructivePolicy = resolveCodexPluginDestructivePolicy(entry.allow_destructive_actions ?? config?.allow_destructive_actions ?? true);
198
+ return [{
199
+ configKey,
200
+ marketplaceName: entry.marketplaceName,
201
+ pluginName: entry.pluginName,
202
+ enabled: enabled && entry.enabled !== false,
203
+ allowDestructiveActions: entryDestructivePolicy.allowDestructiveActions,
204
+ destructiveApprovalMode: entryDestructivePolicy.destructiveApprovalMode
205
+ }];
206
+ }).toSorted((left, right) => left.configKey.localeCompare(right.configKey));
207
+ return {
208
+ configured,
209
+ enabled,
210
+ allowAllPlugins: enabled && config?.allow_all_plugins === true,
211
+ allowDestructiveActions: destructivePolicy.allowDestructiveActions,
212
+ destructiveApprovalMode: destructivePolicy.destructiveApprovalMode,
213
+ pluginPolicies
214
+ };
215
+ }
216
+ function isCodexPluginMarketplaceName(value) {
217
+ return typeof value === "string" && CODEX_PLUGIN_MARKETPLACE_NAME_PATTERN.test(value);
218
+ }
219
+ function resolveCodexPluginDestructivePolicy(policy) {
220
+ if (policy === "auto" || policy === "ask") return {
221
+ allowDestructiveActions: true,
222
+ destructiveApprovalMode: policy
223
+ };
224
+ return {
225
+ allowDestructiveActions: policy,
226
+ destructiveApprovalMode: policy ? "allow" : "deny"
227
+ };
228
+ }
229
+ //#endregion
230
+ //#region extensions/codex/src/app-server/auth-start-options.ts
231
+ const CODEX_APP_SERVER_HOME_DIRNAME = "codex-home";
232
+ const CODEX_EPHEMERAL_AUTH_STORE_OVERRIDE = "cli_auth_credentials_store=\"ephemeral\"";
233
+ function resolveCodexAppServerHomeDir(agentDir) {
234
+ return path.join(path.resolve(agentDir), CODEX_APP_SERVER_HOME_DIRNAME);
235
+ }
236
+ /** Resolves the native user Codex home used by Desktop and the CLI. */
237
+ function resolveCodexAppServerUserHomeDir(env = process.env, homedir$1 = homedir) {
238
+ const configured = normalizeOptionalString(env.CODEX_HOME);
239
+ return path.resolve(configured ?? path.join(homedir$1(), ".codex"));
240
+ }
241
+ /** Resolves the local CODEX_HOME used when starting one app-server connection. */
242
+ function resolveCodexAppServerLocalHomeDir(startOptions, agentDir, env = process.env) {
243
+ const configured = startOptions.env?.CODEX_HOME;
244
+ if (configured?.trim()) return configured;
245
+ return startOptions.homeScope === "user" ? resolveCodexAppServerUserHomeDir(env) : resolveCodexAppServerHomeDir(agentDir);
246
+ }
247
+ /** Forces OpenClaw-owned Codex auth to remain process-local. */
248
+ function withEphemeralCodexAuthStore(params) {
249
+ const { startOptions } = params;
250
+ if (!params.preparedAuth && params.authProfileId === null) return startOptions;
251
+ const args = normalizeCodexAppServerArgs(startOptions.args, CODEX_EPHEMERAL_AUTH_STORE_OVERRIDE);
252
+ return args === startOptions.args ? startOptions : {
253
+ ...startOptions,
254
+ args
255
+ };
256
+ }
257
+ //#endregion
258
+ //#region extensions/codex/src/app-server/protocol.ts
259
+ /** Namespace Codex keeps directly model-visible without exposing it to Code Mode guests. */
260
+ const CODEX_OPENCLAW_DIRECT_DYNAMIC_TOOL_NAMESPACE = "openclaw_direct";
261
+ function flattenCodexDynamicToolFunctions(tools) {
262
+ return (tools ?? []).flatMap((tool) => tool.type === "namespace" ? tool.tools : [tool]);
263
+ }
264
+ /** Asserts the experimental beforeTurnId request field before it crosses the app-server boundary. */
265
+ function assertCodexThreadForkParams(value) {
266
+ if (!isRecord(value) || typeof value.threadId !== "string" || !value.threadId.trim() || value.beforeTurnId !== void 0 && value.beforeTurnId !== null && typeof value.beforeTurnId !== "string") throw new Error("Invalid Codex app-server thread/fork params");
267
+ return value;
268
+ }
269
+ const CODEX_INTERACTIVE_THREAD_SOURCE_KINDS = ["cli", "vscode"];
270
+ const CODEX_INTERACTIVE_CUSTOM_THREAD_SOURCES = ["atlas", "chatgpt"];
271
+ function isJsonObject(value) {
272
+ return isRecord(value);
273
+ }
274
+ //#endregion
275
+ export { resolveCodexPluginsPolicy as S, assertCodexAppServerCommandHasNoInlineArgs as _, flattenCodexDynamicToolFunctions as a, isCodexSandboxExecServerEnabled as b, resolveCodexAppServerLocalHomeDir as c, DEFAULT_CODEX_APP_SERVER_NETWORK_PROXY_PROFILE_PREFIX as d, DEFAULT_CODEX_COMPUTER_USE_LIVE_TEST_TIMEOUT_MS as f, DEFAULT_CODEX_COMPUTER_USE_TOOL_CALL_TIMEOUT_MS as g, DEFAULT_CODEX_COMPUTER_USE_PLUGIN_NAME as h, assertCodexThreadForkParams as i, resolveCodexAppServerUserHomeDir as l, DEFAULT_CODEX_COMPUTER_USE_MCP_SERVER_NAME as m, CODEX_INTERACTIVE_THREAD_SOURCE_KINDS as n, isJsonObject as o, DEFAULT_CODEX_COMPUTER_USE_MARKETPLACE_DISCOVERY_TIMEOUT_MS as p, CODEX_OPENCLAW_DIRECT_DYNAMIC_TOOL_NAMESPACE as r, resolveCodexAppServerHomeDir as s, CODEX_INTERACTIVE_CUSTOM_THREAD_SOURCES as t, withEphemeralCodexAuthStore as u, isCodexPairedNodeRemoteExecPlacementSandbox as v, readCodexPluginConfig as x, isCodexRemoteExecPlacementSandbox as y };
@@ -1,5 +1,5 @@
1
- import { h as releaseLeasedSharedCodexAppServerClient } from "./shared-client-CKhX2kFt.js";
2
- import { ut as normalizeCodexDynamicToolName } from "./thread-lifecycle-DPK30jad.js";
1
+ import { h as releaseLeasedSharedCodexAppServerClient } from "./shared-client-CVhez2Uo.js";
2
+ import { st as normalizeCodexDynamicToolName } from "./thread-lifecycle-D1pzRwHB.js";
3
3
  import { pinExecToolTarget } from "openclaw/plugin-sdk/codex-mcp-projection";
4
4
  import { loadNodeExecAvailability } from "openclaw/plugin-sdk/node-selection-runtime";
5
5
  //#region extensions/codex/src/app-server/shell-dynamic-tools.ts
@@ -1,4 +1,4 @@
1
- import { B as isJsonObject } from "./config-CyapYSji.js";
1
+ import { o as isJsonObject } from "./protocol-CAAcVIKF.js";
2
2
  import { asBoolean, asFiniteNumber, normalizeOptionalString, parseStrictFiniteNumber } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  import { MAX_DATE_TIMESTAMP_MS, resolveExpiresAtMsFromEpochSeconds } from "openclaw/plugin-sdk/number-runtime";
4
4
  import { expectDefined } from "openclaw/plugin-sdk/expect-runtime";
@@ -0,0 +1,198 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
+ import { n as withTimeout } from "./timeout-BVw8aaM1.js";
3
+ //#region extensions/codex/src/app-server/request.ts
4
+ var request_exports = /* @__PURE__ */ __exportAll({
5
+ CodexAppServerScopedRequestRejectedError: () => CodexAppServerScopedRequestRejectedError,
6
+ readCodexAppServerUsage: () => readCodexAppServerUsage,
7
+ requestCodexAppServerClientJson: () => requestCodexAppServerClientJson,
8
+ requestCodexAppServerJson: () => requestCodexAppServerJson,
9
+ withCodexAppServerJsonClient: () => withCodexAppServerJsonClient
10
+ });
11
+ /** Sends one guarded request over a client lease owned by the caller. */
12
+ async function requestCodexAppServerClientJson(params) {
13
+ const { resolveCodexAppServerDirectSandboxBypassBlock } = await import("./sandbox-guard-BcT66fWy.js").then((n) => n.r);
14
+ const sandboxBlock = resolveCodexAppServerDirectSandboxBypassBlock({
15
+ method: params.method,
16
+ requestParams: params.requestParams,
17
+ config: params.config,
18
+ sessionKey: params.sessionKey,
19
+ sessionId: params.sessionId
20
+ });
21
+ if (sandboxBlock) throw new Error(sandboxBlock);
22
+ const timeoutMs = params.timeoutMs ?? 6e4;
23
+ return await withTimeout(params.client.request(params.method, params.requestParams, {
24
+ timeoutMs,
25
+ signal: params.signal,
26
+ ...params.assertCurrent ? { assertCurrent: () => assertRequestOwnerCurrent(params.assertCurrent) } : {}
27
+ }), timeoutMs, `codex app-server ${params.method} timed out`);
28
+ }
29
+ async function requestCodexAppServerJson(params) {
30
+ const { resolveCodexAppServerDirectSandboxBypassBlock } = await import("./sandbox-guard-BcT66fWy.js").then((n) => n.r);
31
+ const sandboxBlock = resolveCodexAppServerDirectSandboxBypassBlock({
32
+ method: params.method,
33
+ requestParams: params.requestParams,
34
+ config: params.config,
35
+ sessionKey: params.sessionKey,
36
+ sessionId: params.sessionId
37
+ });
38
+ if (sandboxBlock) throw new Error(sandboxBlock);
39
+ return await withCodexAppServerJsonClient({
40
+ ...params,
41
+ timeoutMessage: `codex app-server ${params.method} timed out`
42
+ }, async (request) => await request({
43
+ method: params.method,
44
+ requestParams: params.requestParams
45
+ }));
46
+ }
47
+ /** A scoped guard rejected the request before a physical write. */
48
+ var CodexAppServerScopedRequestRejectedError = class extends Error {
49
+ constructor(message, options) {
50
+ super(message, options);
51
+ this.name = "CodexAppServerScopedRequestRejectedError";
52
+ }
53
+ };
54
+ function assertRequestOwnerCurrent(assertCurrent) {
55
+ try {
56
+ assertCurrent?.();
57
+ } catch (cause) {
58
+ throw new CodexAppServerScopedRequestRejectedError(cause instanceof Error ? cause.message : String(cause), { cause });
59
+ }
60
+ }
61
+ const CODEX_USAGE_ISOLATED_SHUTDOWN = {
62
+ forceKillDelayMs: 200,
63
+ exitTimeoutMs: 300
64
+ };
65
+ const CODEX_ACCOUNT_READ_MAX_TIMEOUT_MS = 4e3;
66
+ const CODEX_USAGE_DEADLINE_RESERVE_MS = CODEX_USAGE_ISOLATED_SHUTDOWN.forceKillDelayMs + CODEX_USAGE_ISOLATED_SHUTDOWN.exitTimeoutMs + 250;
67
+ /** Reads rate limits and best-effort account identity from one isolated app-server session. */
68
+ async function readCodexAppServerUsage(options) {
69
+ const deadline = Date.now() + options.timeoutMs;
70
+ return await withCodexAppServerJsonClient({
71
+ timeoutMs: options.timeoutMs,
72
+ timeoutMessage: "codex app-server usage read timed out",
73
+ agentDir: options.agentDir,
74
+ ...options.authProfileId ? { authProfileId: options.authProfileId } : {},
75
+ config: options.config,
76
+ startOptions: options.startOptions,
77
+ isolated: true,
78
+ isolatedShutdown: CODEX_USAGE_ISOLATED_SHUTDOWN
79
+ }, async (request) => {
80
+ const rateLimits = await request({ method: "account/rateLimits/read" });
81
+ const accountEmail = await readCodexAccountEmailBestEffort(request, deadline);
82
+ return {
83
+ rateLimits,
84
+ ...accountEmail ? { accountEmail } : {}
85
+ };
86
+ });
87
+ }
88
+ function extractCodexAccountEmail(value) {
89
+ if (!value || typeof value !== "object") return;
90
+ const record = value;
91
+ const account = record.account && typeof record.account === "object" ? record.account : record;
92
+ const email = account.email ?? account.accountEmail;
93
+ return typeof email === "string" && email.trim() ? email.trim() : void 0;
94
+ }
95
+ async function readCodexAccountEmailBestEffort(request, deadline) {
96
+ const boundMs = Math.min(CODEX_ACCOUNT_READ_MAX_TIMEOUT_MS, deadline - Date.now() - CODEX_USAGE_DEADLINE_RESERVE_MS);
97
+ if (boundMs <= 0) return;
98
+ const read = request({
99
+ method: "account/read",
100
+ requestParams: {}
101
+ }).then((account) => extractCodexAccountEmail(account), () => void 0);
102
+ let timer;
103
+ const timeout = new Promise((resolve) => {
104
+ timer = setTimeout(() => resolve(void 0), boundMs);
105
+ timer.unref?.();
106
+ });
107
+ try {
108
+ return await Promise.race([read, timeout]);
109
+ } finally {
110
+ if (timer) clearTimeout(timer);
111
+ }
112
+ }
113
+ /**
114
+ * Runs several guarded requests over one acquired client (shared lease or
115
+ * isolated child) so related reads see the same app-server session. The whole
116
+ * callback re-runs once when the client's start selection changed underneath it.
117
+ */
118
+ async function withCodexAppServerJsonClient(params, run) {
119
+ const timeoutMs = params.timeoutMs ?? 6e4;
120
+ const timeoutMessage = params.timeoutMessage ?? "codex app-server request timed out";
121
+ const timeoutController = new AbortController();
122
+ const deadline = Number.isFinite(timeoutMs) && timeoutMs > 0 ? Date.now() + timeoutMs : void 0;
123
+ const isPastDeadline = () => deadline !== void 0 && Date.now() >= deadline;
124
+ const throwIfAbandoned = () => {
125
+ if (timeoutController.signal.aborted || isPastDeadline()) throw new CodexAppServerScopedRequestRejectedError(timeoutMessage);
126
+ };
127
+ const remainingTimeoutMs = () => {
128
+ throwIfAbandoned();
129
+ return deadline === void 0 ? timeoutMs : Math.max(1, deadline - Date.now());
130
+ };
131
+ try {
132
+ return await withTimeout((async () => {
133
+ const { resolveCodexAppServerDirectSandboxBypassBlock } = await import("./sandbox-guard-BcT66fWy.js").then((n) => n.r);
134
+ const { createIsolatedCodexAppServerClient, getLeasedSharedCodexAppServerClient, isCodexAppServerStartSelectionChangedError, releaseLeasedSharedCodexAppServerClient, retireSharedCodexAppServerClientIfCurrent } = await import("./shared-client-CVhez2Uo.js").then((n) => n.y);
135
+ for (let attempt = 0; attempt < 2; attempt += 1) {
136
+ throwIfAbandoned();
137
+ const client = await (params.isolated ? createIsolatedCodexAppServerClient : getLeasedSharedCodexAppServerClient)({
138
+ startOptions: params.startOptions,
139
+ pluginConfig: params.pluginConfig,
140
+ timeoutMs: remainingTimeoutMs(),
141
+ authProfileId: params.authProfileId,
142
+ authProfileStore: params.authProfileStore,
143
+ authBindingFingerprint: params.authBindingFingerprint,
144
+ preparedAuth: params.preparedAuth,
145
+ authRequirement: params.authRequirement,
146
+ agentDir: params.agentDir,
147
+ config: params.config,
148
+ abandonSignal: timeoutController.signal
149
+ });
150
+ let scopeActive = true;
151
+ const assertCurrent = () => {
152
+ throwIfAbandoned();
153
+ if (!scopeActive) throw new CodexAppServerScopedRequestRejectedError("Codex app-server request scope is closed");
154
+ assertRequestOwnerCurrent(params.assertCurrent);
155
+ };
156
+ try {
157
+ assertCurrent();
158
+ const scopedRequest = async (request) => {
159
+ const sandboxBlock = resolveCodexAppServerDirectSandboxBypassBlock({
160
+ method: request.method,
161
+ requestParams: request.requestParams,
162
+ config: params.config,
163
+ sessionKey: params.sessionKey,
164
+ sessionId: params.sessionId
165
+ });
166
+ if (sandboxBlock) throw new CodexAppServerScopedRequestRejectedError(sandboxBlock);
167
+ assertCurrent();
168
+ return await client.request(request.method, request.requestParams, {
169
+ timeoutMs: remainingTimeoutMs(),
170
+ signal: timeoutController.signal,
171
+ assertCurrent
172
+ });
173
+ };
174
+ return await run(scopedRequest, client, { assertCurrent });
175
+ } catch (error) {
176
+ if (!isCodexAppServerStartSelectionChangedError(error) || attempt > 0) throw error;
177
+ if (!params.isolated) retireSharedCodexAppServerClientIfCurrent(client);
178
+ throwIfAbandoned();
179
+ } finally {
180
+ scopeActive = false;
181
+ if (params.isolated) await client.closeAndWait({
182
+ exitTimeoutMs: params.isolatedShutdown?.exitTimeoutMs ?? 2e3,
183
+ forceKillDelayMs: params.isolatedShutdown?.forceKillDelayMs ?? 250
184
+ });
185
+ else releaseLeasedSharedCodexAppServerClient(client);
186
+ }
187
+ }
188
+ throw new Error("Codex app-server selection retry loop exited unexpectedly");
189
+ })(), timeoutMs, timeoutMessage);
190
+ } catch (error) {
191
+ if (isPastDeadline()) throw new Error(timeoutMessage, { cause: error });
192
+ throw error;
193
+ } finally {
194
+ timeoutController.abort();
195
+ }
196
+ }
197
+ //#endregion
198
+ export { request_exports as a, requestCodexAppServerJson as i, readCodexAppServerUsage as n, withCodexAppServerJsonClient as o, requestCodexAppServerClientJson as r, CodexAppServerScopedRequestRejectedError as t };