@openclaw/codex 2026.5.7-beta.1 → 2026.5.9-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,242 +0,0 @@
1
- import { createHmac, randomBytes } from "node:crypto";
2
- import { z } from "zod";
3
- //#region extensions/codex/src/app-server/config.ts
4
- const START_OPTIONS_KEY_SECRET = randomBytes(32);
5
- const DEFAULT_CODEX_COMPUTER_USE_PLUGIN_NAME = "computer-use";
6
- const DEFAULT_CODEX_COMPUTER_USE_MCP_SERVER_NAME = "computer-use";
7
- const DEFAULT_CODEX_COMPUTER_USE_MARKETPLACE_DISCOVERY_TIMEOUT_MS = 6e4;
8
- const codexAppServerTransportSchema = z.enum(["stdio", "websocket"]);
9
- const codexAppServerPolicyModeSchema = z.enum(["yolo", "guardian"]);
10
- const codexAppServerApprovalPolicySchema = z.enum([
11
- "never",
12
- "on-request",
13
- "on-failure",
14
- "untrusted"
15
- ]);
16
- const codexAppServerSandboxSchema = z.enum([
17
- "read-only",
18
- "workspace-write",
19
- "danger-full-access"
20
- ]);
21
- const codexAppServerApprovalsReviewerSchema = z.enum([
22
- "user",
23
- "auto_review",
24
- "guardian_subagent"
25
- ]);
26
- const codexDynamicToolsProfileSchema = z.enum(["native-first", "openclaw-compat"]);
27
- const codexAppServerServiceTierSchema = z.preprocess((value) => value === null ? null : resolveServiceTier(value), z.enum(["fast", "flex"]).nullable().optional()).optional();
28
- const codexPluginConfigSchema = z.object({
29
- codexDynamicToolsProfile: codexDynamicToolsProfileSchema.optional(),
30
- codexDynamicToolsExclude: z.array(z.string()).optional(),
31
- discovery: z.object({
32
- enabled: z.boolean().optional(),
33
- timeoutMs: z.number().positive().optional()
34
- }).strict().optional(),
35
- computerUse: z.object({
36
- enabled: z.boolean().optional(),
37
- autoInstall: z.boolean().optional(),
38
- marketplaceDiscoveryTimeoutMs: z.number().positive().optional(),
39
- marketplaceSource: z.string().optional(),
40
- marketplacePath: z.string().optional(),
41
- marketplaceName: z.string().optional(),
42
- pluginName: z.string().optional(),
43
- mcpServerName: z.string().optional()
44
- }).strict().optional(),
45
- appServer: z.object({
46
- mode: codexAppServerPolicyModeSchema.optional(),
47
- transport: codexAppServerTransportSchema.optional(),
48
- command: z.string().optional(),
49
- args: z.union([z.array(z.string()), z.string()]).optional(),
50
- url: z.string().optional(),
51
- authToken: z.string().optional(),
52
- headers: z.record(z.string(), z.string()).optional(),
53
- clearEnv: z.array(z.string()).optional(),
54
- requestTimeoutMs: z.number().positive().optional(),
55
- approvalPolicy: codexAppServerApprovalPolicySchema.optional(),
56
- sandbox: codexAppServerSandboxSchema.optional(),
57
- approvalsReviewer: codexAppServerApprovalsReviewerSchema.optional(),
58
- serviceTier: codexAppServerServiceTierSchema,
59
- defaultWorkspaceDir: z.string().optional()
60
- }).strict().optional()
61
- }).strict();
62
- function readCodexPluginConfig(value) {
63
- const parsed = codexPluginConfigSchema.safeParse(value);
64
- return parsed.success ? parsed.data : {};
65
- }
66
- function resolveCodexAppServerRuntimeOptions(params = {}) {
67
- const env = params.env ?? process.env;
68
- const config = readCodexPluginConfig(params.pluginConfig).appServer ?? {};
69
- const transport = resolveTransport(config.transport);
70
- const configCommand = readNonEmptyString(config.command);
71
- const envCommand = readNonEmptyString(env.OPENCLAW_CODEX_APP_SERVER_BIN);
72
- const command = configCommand ?? envCommand ?? "codex";
73
- const commandSource = configCommand ? "config" : envCommand ? "env" : "managed";
74
- const args = resolveArgs(config.args, env.OPENCLAW_CODEX_APP_SERVER_ARGS);
75
- const headers = normalizeHeaders(config.headers);
76
- const clearEnv = normalizeStringList(config.clearEnv);
77
- const authToken = readNonEmptyString(config.authToken);
78
- const url = readNonEmptyString(config.url);
79
- const policyMode = resolvePolicyMode(config.mode) ?? resolvePolicyMode(env.OPENCLAW_CODEX_APP_SERVER_MODE) ?? "yolo";
80
- const serviceTier = resolveServiceTier(config.serviceTier);
81
- if (transport === "websocket" && !url) throw new Error("plugins.entries.codex.config.appServer.url is required when appServer.transport is websocket");
82
- return {
83
- start: {
84
- transport,
85
- command,
86
- commandSource,
87
- args: args.length > 0 ? args : [
88
- "app-server",
89
- "--listen",
90
- "stdio://"
91
- ],
92
- ...url ? { url } : {},
93
- ...authToken ? { authToken } : {},
94
- headers,
95
- ...transport === "stdio" && clearEnv.length > 0 ? { clearEnv } : {}
96
- },
97
- requestTimeoutMs: normalizePositiveNumber(config.requestTimeoutMs, 6e4),
98
- approvalPolicy: resolveApprovalPolicy(config.approvalPolicy) ?? resolveApprovalPolicy(env.OPENCLAW_CODEX_APP_SERVER_APPROVAL_POLICY) ?? (policyMode === "guardian" ? "on-request" : "never"),
99
- sandbox: resolveSandbox(config.sandbox) ?? resolveSandbox(env.OPENCLAW_CODEX_APP_SERVER_SANDBOX) ?? (policyMode === "guardian" ? "workspace-write" : "danger-full-access"),
100
- approvalsReviewer: resolveApprovalsReviewer(config.approvalsReviewer) ?? (policyMode === "guardian" ? "auto_review" : "user"),
101
- ...serviceTier ? { serviceTier } : {}
102
- };
103
- }
104
- function resolveCodexComputerUseConfig(params = {}) {
105
- const env = params.env ?? process.env;
106
- const config = readCodexPluginConfig(params.pluginConfig).computerUse ?? {};
107
- const marketplaceSource = readNonEmptyString(params.overrides?.marketplaceSource) ?? readNonEmptyString(config.marketplaceSource) ?? readNonEmptyString(env.OPENCLAW_CODEX_COMPUTER_USE_MARKETPLACE_SOURCE);
108
- const marketplacePath = readNonEmptyString(params.overrides?.marketplacePath) ?? readNonEmptyString(config.marketplacePath) ?? readNonEmptyString(env.OPENCLAW_CODEX_COMPUTER_USE_MARKETPLACE_PATH);
109
- const marketplaceName = readNonEmptyString(params.overrides?.marketplaceName) ?? readNonEmptyString(config.marketplaceName) ?? readNonEmptyString(env.OPENCLAW_CODEX_COMPUTER_USE_MARKETPLACE_NAME);
110
- const autoInstall = params.overrides?.autoInstall ?? config.autoInstall ?? readBooleanEnv(env.OPENCLAW_CODEX_COMPUTER_USE_AUTO_INSTALL) ?? false;
111
- const marketplaceDiscoveryTimeoutMs = normalizePositiveNumber(params.overrides?.marketplaceDiscoveryTimeoutMs ?? config.marketplaceDiscoveryTimeoutMs ?? readNumberEnv(env.OPENCLAW_CODEX_COMPUTER_USE_MARKETPLACE_DISCOVERY_TIMEOUT_MS), DEFAULT_CODEX_COMPUTER_USE_MARKETPLACE_DISCOVERY_TIMEOUT_MS);
112
- return {
113
- enabled: params.overrides?.enabled ?? config.enabled ?? readBooleanEnv(env.OPENCLAW_CODEX_COMPUTER_USE) ?? Boolean(autoInstall || marketplaceSource || marketplacePath || marketplaceName),
114
- autoInstall,
115
- marketplaceDiscoveryTimeoutMs,
116
- pluginName: readNonEmptyString(params.overrides?.pluginName) ?? readNonEmptyString(config.pluginName) ?? readNonEmptyString(env.OPENCLAW_CODEX_COMPUTER_USE_PLUGIN_NAME) ?? DEFAULT_CODEX_COMPUTER_USE_PLUGIN_NAME,
117
- mcpServerName: readNonEmptyString(params.overrides?.mcpServerName) ?? readNonEmptyString(config.mcpServerName) ?? readNonEmptyString(env.OPENCLAW_CODEX_COMPUTER_USE_MCP_SERVER_NAME) ?? DEFAULT_CODEX_COMPUTER_USE_MCP_SERVER_NAME,
118
- ...marketplaceSource ? { marketplaceSource } : {},
119
- ...marketplacePath ? { marketplacePath } : {},
120
- ...marketplaceName ? { marketplaceName } : {}
121
- };
122
- }
123
- function codexAppServerStartOptionsKey(options, params = {}) {
124
- return JSON.stringify({
125
- transport: options.transport,
126
- command: options.command,
127
- commandSource: options.commandSource ?? null,
128
- args: options.args,
129
- url: options.url ?? null,
130
- authToken: hashSecretForKey(options.authToken, "authToken"),
131
- headers: Object.entries(options.headers).toSorted(([left], [right]) => left.localeCompare(right)),
132
- env: Object.entries(options.env ?? {}).toSorted(([left], [right]) => left.localeCompare(right)).map(([key, value]) => [key, hashSecretForKey(value, `env:${key}`)]),
133
- clearEnv: [...options.clearEnv ?? []].toSorted(),
134
- authProfileId: params.authProfileId ?? null,
135
- agentDir: params.agentDir ?? null
136
- });
137
- }
138
- function codexSandboxPolicyForTurn(mode, cwd) {
139
- if (mode === "danger-full-access") return { type: "dangerFullAccess" };
140
- if (mode === "read-only") return {
141
- type: "readOnly",
142
- networkAccess: false
143
- };
144
- return {
145
- type: "workspaceWrite",
146
- writableRoots: [cwd],
147
- networkAccess: false,
148
- excludeTmpdirEnvVar: false,
149
- excludeSlashTmp: false
150
- };
151
- }
152
- function resolveTransport(value) {
153
- return value === "websocket" ? "websocket" : "stdio";
154
- }
155
- function resolvePolicyMode(value) {
156
- return value === "guardian" || value === "yolo" ? value : void 0;
157
- }
158
- function resolveApprovalPolicy(value) {
159
- return value === "on-request" || value === "on-failure" || value === "untrusted" || value === "never" ? value : void 0;
160
- }
161
- function resolveSandbox(value) {
162
- return value === "read-only" || value === "workspace-write" || value === "danger-full-access" ? value : void 0;
163
- }
164
- function resolveApprovalsReviewer(value) {
165
- return value === "auto_review" || value === "guardian_subagent" || value === "user" ? value : void 0;
166
- }
167
- function resolveServiceTier(value) {
168
- return value === "fast" || value === "flex" ? value : void 0;
169
- }
170
- function normalizePositiveNumber(value, fallback) {
171
- return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : fallback;
172
- }
173
- function normalizeHeaders(value) {
174
- if (!value || typeof value !== "object" || Array.isArray(value)) return {};
175
- return Object.fromEntries(Object.entries(value).map(([key, child]) => [key.trim(), readNonEmptyString(child)]).filter((entry) => Boolean(entry[0] && entry[1])));
176
- }
177
- function normalizeStringList(value) {
178
- if (!Array.isArray(value)) return [];
179
- return value.map((entry) => readNonEmptyString(entry)).filter((entry) => entry !== void 0);
180
- }
181
- function readBooleanEnv(value) {
182
- if (value === void 0) return;
183
- const normalized = value.trim().toLowerCase();
184
- if ([
185
- "1",
186
- "true",
187
- "yes",
188
- "on"
189
- ].includes(normalized)) return true;
190
- if ([
191
- "0",
192
- "false",
193
- "no",
194
- "off"
195
- ].includes(normalized)) return false;
196
- }
197
- function readNumberEnv(value) {
198
- if (value === void 0) return;
199
- const parsed = Number(value);
200
- return Number.isFinite(parsed) ? parsed : void 0;
201
- }
202
- function resolveArgs(configArgs, envArgs) {
203
- if (Array.isArray(configArgs)) return configArgs.map((entry) => readNonEmptyString(entry)).filter((entry) => entry !== void 0);
204
- if (typeof configArgs === "string") return splitShellWords(configArgs);
205
- return splitShellWords(envArgs ?? "");
206
- }
207
- function readNonEmptyString(value) {
208
- if (typeof value !== "string") return;
209
- return value.trim() || void 0;
210
- }
211
- function hashSecretForKey(value, label) {
212
- if (!value) return null;
213
- return createHmac("sha256", START_OPTIONS_KEY_SECRET).update(label).update("\0").update(value).digest("hex");
214
- }
215
- function splitShellWords(value) {
216
- const words = [];
217
- let current = "";
218
- let quote = null;
219
- for (const char of value) {
220
- if (quote) {
221
- if (char === quote) quote = null;
222
- else current += char;
223
- continue;
224
- }
225
- if (char === "\"" || char === "'") {
226
- quote = char;
227
- continue;
228
- }
229
- if (/\s/.test(char)) {
230
- if (current) {
231
- words.push(current);
232
- current = "";
233
- }
234
- continue;
235
- }
236
- current += char;
237
- }
238
- if (current) words.push(current);
239
- return words;
240
- }
241
- //#endregion
242
- export { resolveCodexComputerUseConfig as a, resolveCodexAppServerRuntimeOptions as i, codexSandboxPolicyForTurn as n, readCodexPluginConfig as r, codexAppServerStartOptionsKey as t };