@openclaw/codex 2026.9.5 → 2026.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/dist/.setup/{account-usage-runtime-C2MOIvfq.mjs → account-usage-runtime-Eem_WGqY.mjs} +5 -5
  2. package/dist/.setup/{apply-CJ0ZfmBG.mjs → apply-DDOi8uNx.mjs} +22 -28
  3. package/dist/.setup/{attempt-client-cleanup-BpYKdTA0.mjs → attempt-client-cleanup-CEv1cKwF.mjs} +58 -43
  4. package/dist/.setup/attempt-workspace-context-DUVEn_CS.mjs +331 -0
  5. package/dist/.setup/{auth-cache-key-QirmgiCo.mjs → auth-cache-key-B2mpaI9D.mjs} +9 -81
  6. package/dist/.setup/auth-profile-health-oHizqgye.mjs +53 -0
  7. package/dist/.setup/auth-profile-recovery-BREezV0L.mjs +14 -0
  8. package/dist/.setup/{binding-connection-Bm38niE8.mjs → binding-connection-ThoatDcb.mjs} +1 -1
  9. package/dist/.setup/{binding-connection.runtime-CnRMC0ta.mjs → binding-connection.runtime-yoHrABt-.mjs} +4 -4
  10. package/dist/.setup/{bounded-turn-BtlZcivC.mjs → bounded-turn-B2HScEgT.mjs} +138 -32
  11. package/dist/.setup/{build-state-Xx9ybZqa.mjs → build-state-C7EnDVgr.mjs} +1 -1
  12. package/dist/.setup/{capabilities-_vXcZGSx.mjs → capabilities-CDXOOFdZ.mjs} +1 -1
  13. package/dist/.setup/{client-vXs2929Q.mjs → client-Cs08OXVQ.mjs} +583 -559
  14. package/dist/.setup/client-catalog-response-BMgt_4q4.mjs +285 -0
  15. package/dist/.setup/{command-dispatch-naHIZwwF.mjs → command-dispatch-B4JuOsOk.mjs} +8 -4
  16. package/dist/.setup/{command-formatters-CGEkdawF.mjs → command-formatters-Bmqvr9tO.mjs} +8 -4
  17. package/dist/.setup/{command-handlers-BtAJEW1X.mjs → command-handlers-DW7Lx9oH.mjs} +106 -172
  18. package/dist/.setup/{command-rpc-DHFpn4le.mjs → command-rpc-DixIj3HW.mjs} +36 -21
  19. package/dist/.setup/{compact-C3i3qlzj.mjs → compact-Du5UvtxA.mjs} +14 -21
  20. package/dist/.setup/{config-CedDWjM-.mjs → config-BoTP_mrL.mjs} +3 -3
  21. package/dist/.setup/{config-options-BsanJ8QG.mjs → config-options-BvaRs51b.mjs} +46 -30
  22. package/dist/.setup/{config-runtime-CeAhl_h4.mjs → config-runtime-C8Rw1m1m.mjs} +1 -1
  23. package/dist/.setup/{config-security-BRQ2mgW9.mjs → config-security-BEReZ6go.mjs} +35 -120
  24. package/dist/.setup/{conversation-binding-DhzrpTM6.mjs → conversation-binding-DP-gMrBP.mjs} +21 -32
  25. package/dist/.setup/{conversation-control-DN53ns41.mjs → conversation-control-uK9Jomlc.mjs} +28 -67
  26. package/dist/.setup/{dynamic-tools-D16lOp67.mjs → dynamic-tools-BDXl-8Cw.mjs} +848 -578
  27. package/dist/.setup/{effective-mcp-catalog-K6kLCN8X.mjs → effective-mcp-catalog-CvnvnGIe.mjs} +3 -3
  28. package/dist/.setup/{ephemeral-turn-R1gA8Sn6.mjs → ephemeral-turn-poidXgek.mjs} +9 -6
  29. package/dist/.setup/{event-projector-assistant-message-DNUR1s0A.mjs → event-projector-assistant-message-BsruvNrH.mjs} +2 -4
  30. package/dist/.setup/{event-projector-items-DyTQ_XqL.mjs → event-projector-items-C6L_5ZiT.mjs} +42 -8
  31. package/dist/.setup/{event-projector-usage-C7Ntzs-f.mjs → event-projector-usage-CnBS8Wa3.mjs} +1 -1
  32. package/dist/.setup/{harness-rxaaoN-o.mjs → harness-a_MsE4-_.mjs} +23 -17
  33. package/dist/.setup/{inference-context-fulhZuz8.mjs → inference-context-D96l9-ew.mjs} +1 -1
  34. package/dist/.setup/inference-proxy-b-aJMSxm.mjs +601 -0
  35. package/dist/.setup/{isolated-completion-B6srt48J.mjs → isolated-completion-BIZFhTNG.mjs} +17 -10
  36. package/dist/.setup/launch-args-DbFCehO7.mjs +196 -0
  37. package/dist/.setup/{managed-binary-DP6Rib3P.mjs → managed-binary-BnshlFag.mjs} +13 -2
  38. package/dist/.setup/{model-catalog-DkvUuBey.mjs → model-catalog-CfXJf9Ay.mjs} +9 -10
  39. package/dist/.setup/{models-BDFgm_G-.mjs → models-KnqBv0hE.mjs} +3 -3
  40. package/dist/.setup/{native-auth-BLZGqFjw.mjs → native-auth-rWbGbMn3.mjs} +4 -4
  41. package/dist/.setup/{native-subagent-history-YXaL6dMd.mjs → native-subagent-history-0nYYgo0k.mjs} +26 -13
  42. package/dist/.setup/{native-subagent-monitor-B1hxzIOy.mjs → native-subagent-monitor-D3filLY2.mjs} +145 -317
  43. package/dist/.setup/{native-subagent-task-ids-DsuOonKv.mjs → native-subagent-task-ids-wb8CKZGN.mjs} +69 -39
  44. package/dist/.setup/{node-cli-sessions-Cl8b2ZF3.mjs → node-cli-sessions-r3avj02l.mjs} +86 -68
  45. package/dist/.setup/node-exec-server.runtime-BDwWXVpK.mjs +247 -0
  46. package/dist/.setup/{plan-xD7WKYTM.mjs → plan-CN3VwfNU.mjs} +74 -76
  47. package/dist/.setup/{plugin-activation-r8nq5Jzp.mjs → plugin-activation-DT3MNtqj.mjs} +7 -16
  48. package/dist/.setup/{plugin-app-cache-key-BOxKP7db.mjs → plugin-app-cache-key-B2CsSdnV.mjs} +4 -20
  49. package/dist/.setup/{plugin-approval-roundtrip-CjfzafAZ.mjs → plugin-approval-roundtrip-C0MZzCuP.mjs} +1 -1
  50. package/dist/.setup/{plugin-inventory-DUle8DLz.mjs → plugin-inventory-BoRei8Z4.mjs} +16 -7
  51. package/dist/.setup/{plugin-marketplace-discovery-P-Vndfqq.mjs → plugin-marketplace-discovery-CDOi8IFs.mjs} +4 -1
  52. package/dist/.setup/{plugin-metadata-cache-DsS5buNa.mjs → plugin-metadata-cache-Ctmo83k_.mjs} +224 -154
  53. package/dist/.setup/protocol-CANUwXJ3.mjs +17 -0
  54. package/dist/.setup/{provider-fFh_-VR3.mjs → provider-BOsxQHOM.mjs} +9 -5
  55. package/dist/.setup/{provider-capabilities-B8J4Dy-O.mjs → provider-capabilities-BfE88FZ5.mjs} +31 -3
  56. package/dist/.setup/{rate-limits-DOEGYRNs.mjs → rate-limits-CMU3DUD0.mjs} +116 -137
  57. package/dist/.setup/{request-BioXJLYa.mjs → request-D2L0zMrq.mjs} +23 -15
  58. package/dist/.setup/{run-attempt-rlA07pUv.mjs → run-attempt-BHu11r7h.mjs} +1197 -617
  59. package/dist/.setup/{runtime-artifact-Dy38Z5iU.mjs → runtime-artifact-CLZ8udh-.mjs} +29 -45
  60. package/dist/.setup/{sandbox-guard-BBP-RbTf.mjs → sandbox-guard-C2sRMOEY.mjs} +1 -1
  61. package/dist/.setup/{session-binding-_0W_fHRr.mjs → session-binding-Cm0apEbd.mjs} +3 -32
  62. package/dist/.setup/{session-binding-record-TH3xA0zj.mjs → session-binding-record-BGoz8wOK.mjs} +22 -3
  63. package/dist/.setup/{session-binding-sidecars-CKYEcfNn.mjs → session-binding-sidecars-BlB5EvIS.mjs} +48 -45
  64. package/dist/.setup/{session-catalog-fUdWDx-U.mjs → session-catalog-Pno1xGcl.mjs} +482 -182
  65. package/dist/.setup/{session-catalog-adoption-CR_whkEW.mjs → session-catalog-adoption-BI6UTDZT.mjs} +57 -25
  66. package/dist/.setup/{session-catalog-archive-CwZaPacf.mjs → session-catalog-archive-lHBqzhaO.mjs} +6 -6
  67. package/dist/.setup/{session-catalog-events-jMcYfQyd.mjs → session-catalog-events-Bj6j94E_.mjs} +122 -25
  68. package/dist/.setup/{session-catalog-index-B141u15s.mjs → session-catalog-index-B9_VQIUz.mjs} +178 -78
  69. package/dist/.setup/{session-catalog-index-order-Cc5BzlQr.mjs → session-catalog-index-order-hcdz07yN.mjs} +2 -2
  70. package/dist/.setup/{session-catalog-index-state-BAuDztHN.mjs → session-catalog-index-state-Dgh8ORJm.mjs} +5 -2
  71. package/dist/.setup/{session-catalog-native-projection-ChV3cCtm.mjs → session-catalog-native-projection-DowriLid.mjs} +30 -13
  72. package/dist/.setup/{session-catalog-node-adoption-BVRsYOSh.mjs → session-catalog-node-adoption-ITddWx_X.mjs} +24 -12
  73. package/dist/.setup/{session-catalog-node-continue-Dowv8osw.mjs → session-catalog-node-continue-6g6qi4A9.mjs} +22 -13
  74. package/dist/.setup/{session-catalog-projection-C1Bj9Jl-.mjs → session-catalog-projection-zK_PUsiE.mjs} +13 -5
  75. package/dist/.setup/{session-cli-DIj-IE-E.mjs → session-cli-irrD-uo7.mjs} +4 -4
  76. package/dist/.setup/{session-history-C--SrLI8.mjs → session-history-BrqhSCf9.mjs} +17 -22
  77. package/dist/.setup/{session-history-import-JHXT5Xfi.mjs → session-history-import-D-3wAgOP.mjs} +4 -4
  78. package/dist/.setup/{session-history.worker-CpNj7H_P.mjs → session-history.worker-CaCh0xF_.mjs} +5 -18
  79. package/dist/.setup/{session-initialization-DH1z6fXn.mjs → session-initialization-rcgbZiid.mjs} +2 -2
  80. package/dist/.setup/{session-permission-policy-DhurXY0l.mjs → session-permission-policy-BI1QK_98.mjs} +2 -2
  81. package/dist/.setup/{session-retirement-CU87AOg9.mjs → session-retirement-BH-S6qkJ.mjs} +25 -6
  82. package/dist/.setup/{settled-turn-finalizer-CiY2bLFK.mjs → settled-turn-finalizer-DiAi6Kx6.mjs} +8 -8
  83. package/dist/.setup/{shared-client-BpTtuLQ5.mjs → shared-client-DA4VR4Eb.mjs} +59 -89
  84. package/dist/.setup/{side-question-DSCZyoBD.mjs → side-question-BJ1wSDcB.mjs} +147 -211
  85. package/dist/.setup/{source-Bjp4UQij.mjs → source-CUzJq5WN.mjs} +9 -9
  86. package/dist/.setup/spawn-error-CL3n6MAa.mjs +57 -0
  87. package/dist/.setup/{thread-archive-guard-jmecf6OJ.mjs → thread-archive-guard-C9frICzX.mjs} +10 -3
  88. package/dist/.setup/{thread-history-page-BTx-4xsg.mjs → thread-history-page-DoVpnHim.mjs} +1 -1
  89. package/dist/.setup/{thread-lifecycle-Cik28qWn.mjs → thread-lifecycle-B3mfz1TG.mjs} +172 -2271
  90. package/dist/.setup/{thread-ownership-skomxnIt.mjs → thread-ownership-DcTtAcXj.mjs} +4 -2
  91. package/dist/.setup/{thread-policy-Cjs4B8xf.mjs → thread-policy-DGuQsuFC.mjs} +19 -3
  92. package/dist/.setup/thread-requests-BLvGkP2R.mjs +2205 -0
  93. package/dist/.setup/{thread-resume-BkNpj9Pz.mjs → thread-resume-DIBXwOpE.mjs} +6 -6
  94. package/dist/.setup/{timeout-DZF05XrR.mjs → timeout-C910MdAB.mjs} +19 -2
  95. package/dist/.setup/{transcript-history-projection-DHNBDhCU.mjs → transcript-history-projection-ZZpkFkJ_.mjs} +94 -64
  96. package/dist/.setup/{transcript-mirror-D4qp_leP.mjs → transcript-mirror-BtHDBp1G.mjs} +218 -198
  97. package/dist/.setup/{transport-stdio-Cmx94Oiy.mjs → transport-stdio-h2VHOskC.mjs} +135 -55
  98. package/dist/.setup/{upstream-session-fork-D3UKxgVD.mjs → upstream-session-fork-BUr4OUbC.mjs} +44 -36
  99. package/dist/.setup/{usage-BOgBEKso.mjs → usage-BML0r-ua.mjs} +5 -4
  100. package/dist/.setup/{usage-limit-error-C0ow7DOc.mjs → usage-limit-error-DUMbefVY.mjs} +4 -4
  101. package/dist/.setup/{web-search-provider.runtime-CTGuJt6i.mjs → web-search-provider.runtime-CDKlN-Rv.mjs} +4 -3
  102. package/dist/api.js +23 -12
  103. package/dist/catalog-page-worker-entrypoint.js +12 -0
  104. package/dist/catalog-page.worker.js +9 -0
  105. package/dist/cli-metadata.js +1 -1
  106. package/dist/doctor-contract-api.js +2 -2
  107. package/dist/harness.js +1 -1
  108. package/dist/index.js +221 -170
  109. package/dist/media-understanding-provider.js +2 -2
  110. package/dist/migration-provider-api.js +1 -1
  111. package/dist/provider-discovery.js +1 -1
  112. package/dist/session-history-worker-runtime.js +15 -32
  113. package/dist/session-history.worker.js +1 -1
  114. package/package.json +9 -6
  115. package/dist/.setup/attempt-context-VXVwTCfS.mjs +0 -636
  116. package/dist/.setup/inference-proxy-CC15HuSi.mjs +0 -311
  117. package/dist/.setup/launch-args-DnMak49W.mjs +0 -111
  118. package/dist/.setup/node-exec-server.runtime-BaViBKNz.mjs +0 -226
  119. package/dist/.setup/version-CoqzXPgK.mjs +0 -12
  120. package/dist/.setup/{native-execution-policy-YBMHSzC4.mjs → native-execution-policy-umd0tgh4.mjs} +1 -1
@@ -1,311 +0,0 @@
1
- import { m as isJsonObject } from "./config-security-BRQ2mgW9.mjs";
2
- import { n as createCodexInferenceContext } from "./inference-context-fulhZuz8.mjs";
3
- import { promisify } from "node:util";
4
- import { zstdCompress, zstdDecompress } from "node:zlib";
5
- import { Writable } from "node:stream";
6
- import { WebSocket, WebSocketServer } from "openclaw/plugin-sdk/websocket-runtime";
7
- import { createServer } from "node:http";
8
- import { createNodeProxyAgent } from "openclaw/plugin-sdk/fetch-runtime";
9
- import { generateSecureToken } from "openclaw/plugin-sdk/secure-random-runtime";
10
- import { fetchWithSsrFGuard, isBlockedHostnameOrIp, resolvePinnedHostnameWithPolicy } from "openclaw/plugin-sdk/ssrf-runtime";
11
- //#region extensions/codex/src/app-server/inference-proxy.ts
12
- const MAX_BODY_BYTES = 33554432;
13
- const MAX_ERROR_BODY_BYTES = 1048576;
14
- const MAX_CONNECTIONS = 16;
15
- const compress = promisify(zstdCompress);
16
- const decompress = promisify(zstdDecompress);
17
- const HOP_HEADERS = /* @__PURE__ */ new Set([
18
- "connection",
19
- "keep-alive",
20
- "proxy-authenticate",
21
- "proxy-authorization",
22
- "te",
23
- "trailer",
24
- "transfer-encoding",
25
- "upgrade",
26
- "host",
27
- "content-length"
28
- ]);
29
- const FAILURE = "Codex parent-local inference transport failed; retry on a fresh connection.";
30
- /** Private, fixed-destination relay. No upstream credentials or model content are retained. */
31
- async function createCodexInferenceProxy(params) {
32
- const upstream = new URL(params.upstream);
33
- if (upstream.protocol !== "https:" || upstream.username || upstream.password || upstream.hash) throw new Error("Codex inference requires a credential-free HTTPS upstream URL");
34
- const lifetime = new AbortController();
35
- const assertCurrent = () => {
36
- lifetime.signal.throwIfAborted();
37
- params.assertCurrent();
38
- };
39
- const context = createCodexInferenceContext(assertCurrent);
40
- const pathPrefix = "/" + generateSecureToken({
41
- bytes: 32,
42
- redact: true
43
- }) + upstream.pathname.replace(/\/$/, "");
44
- const active = /* @__PURE__ */ new Set();
45
- const sockets = /* @__PURE__ */ new Set();
46
- const wss = new WebSocketServer({
47
- noServer: true,
48
- maxPayload: MAX_BODY_BYTES,
49
- perMessageDeflate: false
50
- });
51
- const handshakeHeaders = /* @__PURE__ */ new WeakMap();
52
- wss.on("headers", (headers, request) => {
53
- for (const [key, value] of Object.entries(handshakeHeaders.get(request) ?? {})) if (!key.startsWith("sec-websocket-")) headers.push(key + ": " + value);
54
- handshakeHeaders.delete(request);
55
- });
56
- const resolveTarget = (request) => {
57
- assertCurrent();
58
- if (request.headers.origin || !request.url?.startsWith(pathPrefix + "/") || isBlockedHostnameOrIp(upstream.hostname)) throw new Error(FAILURE);
59
- const suffix = request.url.slice(pathPrefix.length);
60
- if (suffix.startsWith("//") || suffix.includes("\\") || /%2e|%2f|%5c|(?:^|\/)\.\.?(?:\/|\?|$)/i.test(suffix)) throw new Error(FAILURE);
61
- const target = new URL(upstream);
62
- const incoming = new URL(suffix, "http://localhost");
63
- target.pathname = upstream.pathname.replace(/\/$/, "") + incoming.pathname;
64
- for (const [key, value] of incoming.searchParams) target.searchParams.append(key, value);
65
- return {
66
- target,
67
- sampling: incoming.pathname === "/responses"
68
- };
69
- };
70
- const prepare = (bytes, sampling) => {
71
- assertCurrent();
72
- if (!sampling) return {
73
- bytes,
74
- assertCurrent,
75
- signal: void 0
76
- };
77
- const value = JSON.parse(bytes.toString("utf8"));
78
- if (!isJsonObject(value)) throw new Error(FAILURE);
79
- const prepared = context.prepare(value);
80
- const rewritten = Buffer.from(JSON.stringify(prepared.body));
81
- if (rewritten.length > MAX_BODY_BYTES) throw new Error(FAILURE);
82
- return {
83
- ...prepared,
84
- bytes: rewritten
85
- };
86
- };
87
- const server = createServer((req, res) => {
88
- const controller = new AbortController();
89
- let guarded;
90
- const abort = () => controller.abort();
91
- req.once("aborted", abort);
92
- res.once("close", abort);
93
- (async () => {
94
- try {
95
- const { target, sampling } = resolveTarget(req);
96
- if (req.method !== "POST" || active.size >= MAX_CONNECTIONS) throw new Error(FAILURE);
97
- active.add(controller);
98
- const wire = await readProxyBody(req, MAX_BODY_BYTES);
99
- const encoding = req.headers["content-encoding"];
100
- if (encoding && encoding !== "identity" && encoding !== "zstd") throw new Error(FAILURE);
101
- const decoded = encoding === "zstd" ? await decompress(wire, { maxOutputLength: MAX_BODY_BYTES }) : wire;
102
- assertCurrent();
103
- const prepared = prepare(decoded, sampling);
104
- const body = Buffer.from(encoding === "zstd" ? await compress(prepared.bytes) : prepared.bytes);
105
- prepared.assertCurrent();
106
- const signal = AbortSignal.any([
107
- lifetime.signal,
108
- controller.signal,
109
- ...prepared.signal ? [prepared.signal] : []
110
- ]);
111
- guarded = await fetchWithSsrFGuard({
112
- url: target.toString(),
113
- init: {
114
- method: "POST",
115
- headers: relayHeaders(req.headers),
116
- body,
117
- signal
118
- },
119
- signal,
120
- beforeRequest: prepared.assertCurrent,
121
- requireHttps: true,
122
- maxRedirects: 0,
123
- capture: false,
124
- mode: "trusted_env_proxy",
125
- auditContext: "codex-parent-local-inference"
126
- });
127
- prepared.assertCurrent();
128
- const headers = Object.fromEntries(guarded.response.headers);
129
- delete headers["content-encoding"];
130
- res.writeHead(guarded.response.status, relayHeaders(headers));
131
- if (!guarded.response.body) res.end();
132
- else await guarded.response.body.pipeTo(Writable.toWeb(res), { signal });
133
- } catch {
134
- if (!res.headersSent && !res.destroyed) res.writeHead(502, { "content-type": "text/plain" }).end(FAILURE);
135
- else res.destroy();
136
- } finally {
137
- active.delete(controller);
138
- req.off("aborted", abort);
139
- res.off("close", abort);
140
- await guarded?.release().catch(() => void 0);
141
- }
142
- })();
143
- });
144
- server.maxConnections = MAX_CONNECTIONS;
145
- server.requestTimeout = 3e4;
146
- server.headersTimeout = 1e4;
147
- server.on("upgrade", (req, socket, head) => {
148
- (async () => {
149
- let remote;
150
- let local;
151
- let proxyAgent;
152
- const controller = new AbortController();
153
- const close = () => {
154
- controller.abort();
155
- active.delete(controller);
156
- remote?.terminate();
157
- local?.terminate();
158
- proxyAgent?.destroy();
159
- if (remote) sockets.delete(remote);
160
- if (local) sockets.delete(local);
161
- socket.destroy();
162
- };
163
- try {
164
- const { target, sampling } = resolveTarget(req);
165
- if (!sampling || active.size >= MAX_CONNECTIONS) throw new Error(FAILURE);
166
- active.add(controller);
167
- socket.once("close", close);
168
- socket.once("error", close);
169
- const signal = AbortSignal.any([lifetime.signal, controller.signal]);
170
- proxyAgent = createNodeProxyAgent({
171
- mode: "env",
172
- targetUrl: target.href
173
- });
174
- const lookup = proxyAgent ? void 0 : (await resolvePinnedHostnameWithPolicy(target.hostname, { signal })).lookup;
175
- assertCurrent();
176
- signal.throwIfAborted();
177
- target.protocol = "wss:";
178
- const headers = relayHeaders(req.headers);
179
- for (const key of Object.keys(headers)) if (key.startsWith("sec-websocket-")) delete headers[key];
180
- remote = new WebSocket(target, {
181
- headers,
182
- ...proxyAgent ? { agent: proxyAgent } : { lookup },
183
- followRedirects: false,
184
- perMessageDeflate: false,
185
- maxPayload: MAX_BODY_BYTES,
186
- handshakeTimeout: 1e4
187
- });
188
- sockets.add(remote);
189
- remote.once("upgrade", (response) => {
190
- handshakeHeaders.set(req, relayHeaders(response.headers));
191
- });
192
- remote.once("error", close);
193
- remote.once("close", close);
194
- remote.once("unexpected-response", (_request, response) => {
195
- (async () => {
196
- try {
197
- const body = await readProxyBody(response, MAX_ERROR_BODY_BYTES);
198
- assertCurrent();
199
- signal.throwIfAborted();
200
- const failureHeaders = Object.entries(relayHeaders(response.headers)).map(([key, value]) => key + ": " + value);
201
- failureHeaders.push("Connection: close", "Content-Length: " + body.length);
202
- const status = "HTTP/1.1 " + response.statusCode + " " + (response.statusMessage ?? "Upstream refused");
203
- socket.end(Buffer.concat([Buffer.from(status + "\r\n" + failureHeaders.join("\r\n") + "\r\n\r\n"), body]), close);
204
- } catch {
205
- close();
206
- }
207
- })();
208
- });
209
- remote.once("open", () => {
210
- try {
211
- assertCurrent();
212
- signal.throwIfAborted();
213
- wss.handleUpgrade(req, socket, head, (accepted) => {
214
- local = accepted;
215
- sockets.add(accepted);
216
- accepted.once("error", close);
217
- accepted.once("close", close);
218
- let releaseFrame = () => {};
219
- accepted.on("message", (data, binary) => {
220
- try {
221
- if (binary) throw new Error(FAILURE);
222
- const prepared = prepare(rawBytes(data), true);
223
- prepared.assertCurrent();
224
- releaseFrame();
225
- const onAbort = () => close();
226
- prepared.signal?.addEventListener("abort", onAbort, { once: true });
227
- releaseFrame = () => prepared.signal?.removeEventListener("abort", onAbort);
228
- if (!remote || remote.readyState !== WebSocket.OPEN || remote.bufferedAmount + prepared.bytes.length > MAX_BODY_BYTES) throw new Error(FAILURE);
229
- remote.send(prepared.bytes, { binary: false }, (error) => {
230
- if (error) close();
231
- });
232
- } catch {
233
- close();
234
- }
235
- });
236
- accepted.once("close", () => releaseFrame());
237
- remote.on("message", (data, binary) => {
238
- if (accepted.readyState !== WebSocket.OPEN || accepted.bufferedAmount + rawBytes(data).length > MAX_BODY_BYTES) {
239
- close();
240
- return;
241
- }
242
- accepted.send(data, { binary }, (error) => {
243
- if (error) close();
244
- });
245
- });
246
- });
247
- } catch {
248
- close();
249
- }
250
- });
251
- } catch {
252
- close();
253
- }
254
- })();
255
- });
256
- const close = () => {
257
- lifetime.abort();
258
- context.close();
259
- for (const controller of active) controller.abort();
260
- for (const socket of sockets) socket.terminate();
261
- server.close();
262
- server.closeAllConnections();
263
- wss.close();
264
- };
265
- try {
266
- await new Promise((resolve, reject) => {
267
- server.once("error", reject);
268
- server.listen(0, "127.0.0.1", () => {
269
- server.off("error", reject);
270
- resolve();
271
- });
272
- });
273
- assertCurrent();
274
- server.on("error", close);
275
- const address = server.address();
276
- if (!address || typeof address === "string") throw new Error(FAILURE);
277
- return {
278
- context,
279
- upstream: upstream.toString(),
280
- baseUrl: "http://127.0.0.1:" + address.port + pathPrefix,
281
- assertCurrent,
282
- close
283
- };
284
- } catch (error) {
285
- close();
286
- throw error;
287
- }
288
- }
289
- async function readProxyBody(stream, maxBytes) {
290
- const chunks = [];
291
- let size = 0;
292
- for await (const chunk of stream) {
293
- const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
294
- size += bytes.length;
295
- if (size > maxBytes) throw new Error(FAILURE);
296
- chunks.push(bytes);
297
- }
298
- return Buffer.concat(chunks);
299
- }
300
- function rawBytes(data) {
301
- return Array.isArray(data) ? Buffer.concat(data) : Buffer.isBuffer(data) ? data : Buffer.from(data);
302
- }
303
- function relayHeaders(input) {
304
- const excluded = new Set(HOP_HEADERS);
305
- for (const token of (input.connection ?? "").split(",")) excluded.add(token.trim().toLowerCase());
306
- const output = {};
307
- for (const [key, value] of Object.entries(input)) if (value !== void 0 && !excluded.has(key.toLowerCase())) output[key.toLowerCase()] = Array.isArray(value) ? value.join(", ") : value;
308
- return output;
309
- }
310
- //#endregion
311
- export { createCodexInferenceProxy };
@@ -1,111 +0,0 @@
1
- //#region extensions/codex/src/app-server/launch-args.ts
2
- const CODEX_VALUE_OPTIONS = /* @__PURE__ */ new Set([
3
- "-m",
4
- "--model",
5
- "--local-provider",
6
- "-p",
7
- "--profile",
8
- "-s",
9
- "--sandbox",
10
- "-a",
11
- "--ask-for-approval",
12
- "-C",
13
- "--cd",
14
- "--add-dir",
15
- "--remote",
16
- "--remote-auth-token-env",
17
- "-c",
18
- "--config",
19
- "--enable",
20
- "--disable",
21
- "--listen",
22
- "--code-mode-host",
23
- "--ws-auth",
24
- "--ws-token-file",
25
- "--ws-token-sha256",
26
- "--ws-shared-secret-file",
27
- "--ws-issuer",
28
- "--ws-audience",
29
- "--ws-max-clock-skew-seconds"
30
- ]);
31
- /** One tokenization owner for launch, turn policy, reviewer trust, and private turns. */
32
- function readCodexArgs(args) {
33
- const tokens = [];
34
- let nativeSubcommand = false;
35
- let end = 0;
36
- for (const [index, arg] of args.entries()) {
37
- if (index < end) continue;
38
- end = index + 1;
39
- const attached = /^(--[^=]+)=([\s\S]*)$/u.exec(arg) ?? /^(-[cmpisaC])=?([\s\S]+)$/u.exec(arg);
40
- const name = attached?.[1] ?? arg;
41
- let value = attached?.[2];
42
- if (name === "-i" || name === "--image") while (args[end]?.startsWith("-") === false) end += 1;
43
- else if (!attached && CODEX_VALUE_OPTIONS.has(name)) {
44
- value = args[end];
45
- if (value !== void 0) end += 1;
46
- }
47
- tokens.push({
48
- index,
49
- end,
50
- name,
51
- value
52
- });
53
- if (name === "app-server") nativeSubcommand = true;
54
- if (name === "--" && nativeSubcommand) break;
55
- }
56
- return tokens;
57
- }
58
- /** Uses the native CLI configuration for status without starting its transport. */
59
- function buildCodexLoginStatusArgs(args) {
60
- const options = /* @__PURE__ */ new Set([
61
- "-c",
62
- "--config",
63
- "-p",
64
- "--profile",
65
- "--enable",
66
- "--disable"
67
- ]);
68
- const tokens = readCodexArgs(args);
69
- const subcommandIndex = tokens.findLast(({ name }) => name === "app-server")?.index ?? -1;
70
- const prefix = subcommandIndex < 0 ? [] : args.slice(0, subcommandIndex);
71
- const configArgs = tokens.filter(({ index, name }) => index > subcommandIndex && options.has(name)).flatMap(({ index, end }) => args.slice(index, end));
72
- return [
73
- ...prefix,
74
- ...configArgs,
75
- "login",
76
- "status"
77
- ];
78
- }
79
- function readCodexAppServerConfigOptions(args) {
80
- return readCodexArgs(args).filter(({ name }) => name === "-c" || name === "--config" || name === "-p" || name === "--profile");
81
- }
82
- /** The stdio proxy forwards to an external server; it does not own that runtime. */
83
- function isCodexAppServerProxyLaunch(args) {
84
- const tokens = readCodexArgs(args);
85
- const server = tokens.findLastIndex(({ name }) => name === "app-server");
86
- return server >= 0 && tokens.slice(server + 1).find(({ name }) => !name.startsWith("-"))?.name === "proxy";
87
- }
88
- /** Keeps Codex overrides in one CLI scope without rewriting raw TOML or wrapper prefixes. */
89
- function normalizeCodexAppServerArgs(rawArgs, enforcedOverride) {
90
- const tokens = readCodexArgs(rawArgs);
91
- const subcommandIndex = tokens.findLast(({ name }) => name === "app-server")?.index ?? -1;
92
- const prefix = subcommandIndex < 0 ? [...rawArgs] : rawArgs.slice(0, subcommandIndex);
93
- const suffix = [];
94
- if (subcommandIndex >= 0) for (const token of tokens) {
95
- if (token.index <= subcommandIndex) continue;
96
- if (token.name === "--") {
97
- suffix.push(...rawArgs.slice(token.index));
98
- break;
99
- }
100
- (token.name === "-c" || token.name === "--config" ? prefix : suffix).push(...rawArgs.slice(token.index, token.end));
101
- }
102
- if (enforcedOverride && !(prefix.at(-2) === "-c" && prefix.at(-1) === enforcedOverride)) prefix.push("-c", enforcedOverride);
103
- const normalized = subcommandIndex < 0 ? prefix : [
104
- ...prefix,
105
- "app-server",
106
- ...suffix
107
- ];
108
- return normalized.length === rawArgs.length && normalized.every((arg, index) => arg === rawArgs[index]) ? rawArgs : normalized;
109
- }
110
- //#endregion
111
- export { readCodexAppServerConfigOptions as i, isCodexAppServerProxyLaunch as n, normalizeCodexAppServerArgs as r, buildCodexLoginStatusArgs as t };
@@ -1,226 +0,0 @@
1
- import { i as resolveManagedCodexNativeCommand, r as resolveManagedCodexAppServerStartOptions, t as isManagedCodexDesktopCommand } from "./managed-binary-DP6Rib3P.mjs";
2
- import { i as closeCodexAppServerTransportAndWait, t as createStdioTransport } from "./transport-stdio-Cmx94Oiy.mjs";
3
- import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
4
- import { stripVTControlCharacters } from "node:util";
5
- import { killProcessTree } from "openclaw/plugin-sdk/process-runtime";
6
- import path from "node:path";
7
- import { mkdir } from "node:fs/promises";
8
- import { once } from "node:events";
9
- import { resolvePreferredOpenClawTmpDir, withTempWorkspace } from "openclaw/plugin-sdk/temp-path";
10
- import { createDeferred } from "openclaw/plugin-sdk/extension-shared";
11
- import { StringDecoder } from "node:string_decoder";
12
- import { sanitizeEnvVars } from "openclaw/plugin-sdk/sandbox";
13
- //#region extensions/codex/src/node-exec-server.runtime.ts
14
- const MAX_CODEX_EXEC_SERVER_MESSAGE_BYTES = 67108864;
15
- const MAX_CODEX_EXEC_SERVER_STDERR_BYTES = 4096;
16
- const CODEX_EXEC_SERVER_READY_LINE = "codex_exec_server::server::transport: codex-exec-server listening on stdio";
17
- const CODEX_EXEC_SERVER_TERMINATION_GRACE_MS = 1e3;
18
- const CODEX_EXEC_SERVER_REAP_TIMEOUT_MS = 5e3;
19
- const NODE_EXEC_SERVER_PLATFORM_ENVIRONMENT = /^(?:SYSTEMROOT|WINDIR|COMSPEC|PATHEXT|TEMP|TMP|TMPDIR)$/iu;
20
- function validateNodeExecServerMessage(message) {
21
- if (message.byteLength === 0 || message.byteLength > MAX_CODEX_EXEC_SERVER_MESSAGE_BYTES) throw new Error("Codex exec-server JSON-RPC message exceeds its 64 MiB limit.");
22
- const encoded = Buffer.from(message.buffer, message.byteOffset, message.byteLength);
23
- if (encoded.includes(10) || encoded.includes(13)) throw new Error("Codex exec-server JSON-RPC frames must contain exactly one message.");
24
- let decoded;
25
- try {
26
- const text = new TextDecoder("utf-8", { fatal: true }).decode(encoded);
27
- decoded = JSON.parse(text);
28
- } catch {
29
- throw new Error("Codex exec-server received malformed UTF-8 or JSON-RPC.");
30
- }
31
- if (!isRecord(decoded) || decoded.jsonrpc !== void 0 && decoded.jsonrpc !== "2.0" || typeof decoded.method !== "string" && !("id" in decoded && ("result" in decoded || "error" in decoded))) throw new Error("Codex exec-server received an invalid JSON-RPC message.");
32
- return encoded;
33
- }
34
- function nodeExecServerAbortError(signal) {
35
- return signal.reason instanceof Error ? signal.reason : /* @__PURE__ */ new Error("Codex node exec-server connection closed.");
36
- }
37
- function writeNodeExecServerMessage(child, message, signal) {
38
- if (signal.aborted) throw nodeExecServerAbortError(signal);
39
- const payload = Buffer.concat([message, Buffer.from("\n")]);
40
- if (!child.stdin.write(payload)) return once(child.stdin, "drain", { signal }).then(() => void 0);
41
- }
42
- async function relayNodeExecServerOutput(child, send) {
43
- let fragments = [];
44
- let pendingBytes = 0;
45
- for await (const rawChunk of child.stdout) {
46
- const chunk = Buffer.isBuffer(rawChunk) ? rawChunk : Buffer.from(rawChunk);
47
- let offset = 0;
48
- while (offset < chunk.byteLength) {
49
- const newline = chunk.indexOf(10, offset);
50
- const fragment = chunk.subarray(offset, newline === -1 ? chunk.byteLength : newline);
51
- const nextLength = pendingBytes + fragment.byteLength;
52
- if (nextLength > 67108865) throw new Error("Codex exec-server stdout message exceeds its 64 MiB limit.");
53
- if (fragment.byteLength > 0) fragments.push(fragment);
54
- pendingBytes = nextLength;
55
- if (newline === -1) {
56
- if (pendingBytes > MAX_CODEX_EXEC_SERVER_MESSAGE_BYTES && fragment[fragment.byteLength - 1] !== 13) throw new Error("Codex exec-server stdout message exceeds its 64 MiB limit.");
57
- break;
58
- }
59
- const trailing = fragments.at(-1);
60
- if (trailing?.[trailing.byteLength - 1] === 13) {
61
- pendingBytes -= 1;
62
- if (trailing.byteLength === 1) fragments.pop();
63
- else fragments[fragments.length - 1] = trailing.subarray(0, trailing.byteLength - 1);
64
- }
65
- const message = validateNodeExecServerMessage(fragments.length === 1 ? fragments[0] : Buffer.concat(fragments, pendingBytes));
66
- fragments = [];
67
- pendingBytes = 0;
68
- await send(message);
69
- offset = newline + 1;
70
- }
71
- }
72
- if (pendingBytes > 0) throw new Error("Codex exec-server stdout ended with an unterminated JSON-RPC message.");
73
- }
74
- function createNodeExecServerProcessOwner(child, closed) {
75
- let termination;
76
- return { terminate: () => termination ??= (async () => {
77
- if (process.platform === "win32" && child.pid) killProcessTree(child.pid, { graceMs: CODEX_EXEC_SERVER_TERMINATION_GRACE_MS });
78
- const { exited } = await closeCodexAppServerTransportAndWait(child, {
79
- forceKillDelayMs: CODEX_EXEC_SERVER_TERMINATION_GRACE_MS,
80
- exitTimeoutMs: CODEX_EXEC_SERVER_REAP_TIMEOUT_MS
81
- });
82
- if (!exited) throw new Error("Codex node exec-server process tree did not terminate.");
83
- await closed;
84
- })() };
85
- }
86
- /** Runs the one-connection paired-node exec-server after lightweight command admission. */
87
- async function runCodexNodeExecServer(params) {
88
- const { io } = params;
89
- const frames = io.frames;
90
- if (!frames) throw new Error("Codex node exec-server requires duplex frames.");
91
- const cwd = params.workspaceDir;
92
- let writes;
93
- let rejectDisconnected;
94
- const disconnected = new Promise((_resolve, reject) => {
95
- rejectDisconnected = reject;
96
- });
97
- disconnected.catch(() => {});
98
- const onAbort = () => {
99
- const error = nodeExecServerAbortError(io.signal);
100
- rejectDisconnected(error);
101
- };
102
- io.signal.addEventListener("abort", onAbort, { once: true });
103
- try {
104
- if (io.signal.aborted) throw nodeExecServerAbortError(io.signal);
105
- return await withTempWorkspace({
106
- rootDir: resolvePreferredOpenClawTmpDir(),
107
- prefix: "codex-node-exec-server-"
108
- }, async ({ dir }) => {
109
- const codexHome = path.join(dir, ".codex");
110
- await mkdir(codexHome, {
111
- recursive: true,
112
- mode: 448
113
- });
114
- const resolved = await resolveManagedCodexAppServerStartOptions({
115
- transport: "stdio",
116
- command: "codex",
117
- commandSource: "managed",
118
- managedCommandOrder: "package-first",
119
- args: [
120
- "exec-server",
121
- "--listen",
122
- "stdio"
123
- ],
124
- headers: {}
125
- });
126
- const native = resolveManagedCodexNativeCommand(resolved.command);
127
- if (!native || isManagedCodexDesktopCommand(resolved.command)) throw new Error("Codex node exec-server requires the pinned managed package binary.");
128
- const baseEnv = sanitizeEnvVars(process.env, {
129
- strictMode: true,
130
- customAllowedPatterns: [NODE_EXEC_SERVER_PLATFORM_ENVIRONMENT]
131
- }).allowed;
132
- if (io.signal.aborted) throw nodeExecServerAbortError(io.signal);
133
- params.assertExecAuthorized();
134
- const nativeReady = createDeferred();
135
- const exit = createDeferred();
136
- let stderr = Buffer.alloc(0);
137
- let startupSettled = false;
138
- let pendingLine = "";
139
- const decoder = new StringDecoder("utf8");
140
- const child = await createStdioTransport({
141
- transport: "stdio",
142
- command: native,
143
- commandSource: "resolved-managed",
144
- args: resolved.args,
145
- headers: {},
146
- cwd,
147
- env: {
148
- HOME: params.homeDir ?? dir,
149
- CODEX_HOME: codexHome,
150
- RUST_LOG: "error,opentelemetry_sdk=off,opentelemetry_otlp=off,codex_exec_server::server::transport=info",
151
- ...process.platform === "win32" ? { USERPROFILE: params.homeDir ?? dir } : {}
152
- },
153
- clearEnv: ["NODE_OPTIONS"]
154
- }, baseEnv, () => {
155
- if (io.signal.aborted) throw nodeExecServerAbortError(io.signal);
156
- params.assertExecAuthorized();
157
- }, (spawned) => {
158
- spawned.once("close", (code, signal) => exit.resolve({
159
- code,
160
- signal
161
- }));
162
- spawned.once("error", rejectDisconnected);
163
- spawned.stdin.on("error", rejectDisconnected);
164
- spawned.stderr.on("data", (chunk) => {
165
- const next = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
166
- stderr = Buffer.concat([stderr, next.subarray(-4096)]).subarray(-4096);
167
- if (startupSettled) return;
168
- const lines = (pendingLine + decoder.write(next)).split("\n");
169
- pendingLine = lines.pop();
170
- for (const line of [...lines, pendingLine]) if (Buffer.byteLength(line, "utf8") > MAX_CODEX_EXEC_SERVER_STDERR_BYTES) {
171
- startupSettled = true;
172
- pendingLine = "";
173
- rejectDisconnected(/* @__PURE__ */ new Error("Codex node startup diagnostic line exceeded 4 KiB."));
174
- return;
175
- }
176
- if (lines.some((line) => stripVTControlCharacters(line).trimEnd().endsWith(CODEX_EXEC_SERVER_READY_LINE))) {
177
- startupSettled = true;
178
- pendingLine = "";
179
- nativeReady.resolve();
180
- }
181
- });
182
- });
183
- const closed = exit.promise;
184
- const stopped = closed.then((outcome) => {
185
- const diagnostic = stderr.toString("utf8").trim();
186
- throw new Error(`Codex node exec-server exited (code ${outcome.code ?? "none"}, signal ${outcome.signal ?? "none"})${diagnostic ? `: ${diagnostic}` : "."}`);
187
- });
188
- const owner = createNodeExecServerProcessOwner(child, closed);
189
- params.activeProcesses.add(owner.terminate);
190
- const output = relayNodeExecServerOutput(child, frames.send.bind(frames));
191
- output.catch((error) => {
192
- rejectDisconnected(error instanceof Error ? error : new Error(String(error)));
193
- });
194
- try {
195
- await Promise.race([
196
- nativeReady.promise,
197
- stopped,
198
- disconnected
199
- ]);
200
- if (io.signal.aborted) throw nodeExecServerAbortError(io.signal);
201
- if (child.exitCode !== null || child.signalCode !== null) await stopped;
202
- params.assertExecAuthorized();
203
- params.onFrameReceiver((message) => {
204
- const encoded = validateNodeExecServerMessage(message);
205
- const operation = writes ? writes.then(() => writeNodeExecServerMessage(child, encoded, io.signal)) : writeNodeExecServerMessage(child, encoded, io.signal);
206
- if (!operation) return;
207
- const observed = operation.catch(() => {});
208
- writes = observed;
209
- observed.then(() => {
210
- if (writes === observed) writes = void 0;
211
- });
212
- return operation;
213
- });
214
- return await Promise.race([stopped, disconnected]);
215
- } finally {
216
- await owner.terminate();
217
- params.activeProcesses.delete(owner.terminate);
218
- await Promise.allSettled([output, ...writes ? [writes] : []]);
219
- }
220
- });
221
- } finally {
222
- io.signal.removeEventListener("abort", onAbort);
223
- }
224
- }
225
- //#endregion
226
- export { runCodexNodeExecServer };
@@ -1,12 +0,0 @@
1
- //#region extensions/codex/src/app-server/version.ts
2
- /**
3
- * Version and package pins for the managed Codex app-server runtime.
4
- */
5
- /** Exact Codex app-server version shipped by the OpenClaw Codex bridge. */
6
- const CODEX_APP_SERVER_VERSION = "0.154.0";
7
- /** Inclusive runtime compatibility floor for external app-server binaries. */
8
- const MIN_SUPPORTED_CODEX_APP_SERVER_VERSION = "0.149.0";
9
- /** npm package name for the managed Codex app-server binary. */
10
- const MANAGED_CODEX_APP_SERVER_PACKAGE = "@openai/codex";
11
- //#endregion
12
- export { MANAGED_CODEX_APP_SERVER_PACKAGE as n, MIN_SUPPORTED_CODEX_APP_SERVER_VERSION as r, CODEX_APP_SERVER_VERSION as t };
@@ -1,6 +1,6 @@
1
1
  import { resolveAgentConfig, tryResolveDefaultAgentId } from "openclaw/plugin-sdk/agent-scope-runtime";
2
- import { getSessionEntry } from "openclaw/plugin-sdk/session-store-runtime";
3
2
  import { normalizeAgentId, parseAgentSessionKey } from "openclaw/plugin-sdk/routing";
3
+ import { getSessionEntry } from "openclaw/plugin-sdk/session-store-runtime";
4
4
  import { resolveSandboxRuntimeStatus } from "openclaw/plugin-sdk/sandbox";
5
5
  //#region extensions/codex/src/app-server/native-execution-policy.ts
6
6
  /** Projects node execution ownership into the runtime tool factory options. */