@openclaw/codex 2026.9.4 → 2026.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/assets/activity.svg +30 -0
  2. package/assets/icon.png +0 -0
  3. package/dist/.setup/account-usage-runtime-Eem_WGqY.mjs +75 -0
  4. package/dist/{apply-CvT8tW5i.js → .setup/apply-DDOi8uNx.mjs} +24 -30
  5. package/dist/.setup/async-questions-DdhOCwGi.mjs +27 -0
  6. package/dist/{attempt-client-cleanup-DKHzbwt5.js → .setup/attempt-client-cleanup-CEv1cKwF.mjs} +79 -49
  7. package/dist/.setup/attempt-terminal-gZrxQ35N.mjs +5 -0
  8. package/dist/.setup/attempt-workspace-context-DUVEn_CS.mjs +331 -0
  9. package/dist/{auth-binding-CWlKVccJ.js → .setup/auth-binding-DhLWa_7K.mjs} +1 -1
  10. package/dist/{auth-cache-key-7orQae_j.js → .setup/auth-cache-key-B2mpaI9D.mjs} +9 -81
  11. package/dist/{auth-profile-CwzO4_RG.js → .setup/auth-profile-WqZtZfXN.mjs} +1 -1
  12. package/dist/.setup/auth-profile-health-oHizqgye.mjs +53 -0
  13. package/dist/.setup/auth-profile-recovery-BREezV0L.mjs +14 -0
  14. package/dist/.setup/binding-connection-ThoatDcb.mjs +50 -0
  15. package/dist/.setup/binding-connection.runtime-yoHrABt-.mjs +48 -0
  16. package/dist/{bounded-turn-C_Hneydj.js → .setup/bounded-turn-B2HScEgT.mjs} +143 -32
  17. package/dist/{build-state-BCmg9-5p.js → .setup/build-state-C7EnDVgr.mjs} +1 -1
  18. package/dist/{capabilities-8vx68WLH.js → .setup/capabilities-CDXOOFdZ.mjs} +1 -1
  19. package/dist/{client-B57KWPQx.js → .setup/client-Cs08OXVQ.mjs} +705 -512
  20. package/dist/.setup/client-catalog-response-BMgt_4q4.mjs +285 -0
  21. package/dist/{command-dispatch-BpduNGVf.js → .setup/command-dispatch-B4JuOsOk.mjs} +8 -4
  22. package/dist/{command-formatters-lxlkNZgU.js → .setup/command-formatters-Bmqvr9tO.mjs} +8 -4
  23. package/dist/{command-handlers-tiL9iWj7.js → .setup/command-handlers-DW7Lx9oH.mjs} +137 -186
  24. package/dist/{command-rpc-CR5EOEZX.js → .setup/command-rpc-DixIj3HW.mjs} +47 -23
  25. package/dist/{compact-B_H3AOd7.js → .setup/compact-Du5UvtxA.mjs} +29 -51
  26. package/dist/{config-oIORaQ5T.js → .setup/config-BoTP_mrL.mjs} +5 -4
  27. package/dist/{config-options-CXMq1T-C.js → .setup/config-options-BvaRs51b.mjs} +50 -446
  28. package/dist/{protocol-5bh1G-H7.js → .setup/config-parsing-CcB9iPoq.mjs} +9 -51
  29. package/dist/{config-runtime-D0zGNIHu.js → .setup/config-runtime-C8Rw1m1m.mjs} +2 -2
  30. package/dist/.setup/config-security-BEReZ6go.mjs +380 -0
  31. package/dist/{conversation-binding-DsB4-O7U.js → .setup/conversation-binding-DP-gMrBP.mjs} +29 -38
  32. package/dist/{conversation-binding-data-BiodpIzq.js → .setup/conversation-binding-data-CrcyZk6O.mjs} +1 -1
  33. package/dist/{conversation-control-CtUu1b3m.js → .setup/conversation-control-uK9Jomlc.mjs} +32 -67
  34. package/dist/.setup/cyber-failover-DYwbmf1o.mjs +123 -0
  35. package/dist/.setup/cyber-failover-notice-e9G3J9-e.mjs +17 -0
  36. package/dist/{dynamic-tools-CmN5RAip.js → .setup/dynamic-tools-BDXl-8Cw.mjs} +936 -620
  37. package/dist/{effective-mcp-catalog-Bd73bqA8.js → .setup/effective-mcp-catalog-CvnvnGIe.mjs} +3 -3
  38. package/dist/{ephemeral-turn-D78_VmzO.js → .setup/ephemeral-turn-poidXgek.mjs} +9 -7
  39. package/dist/{event-projector-assistant-message-BmBM4qBV.js → .setup/event-projector-assistant-message-BsruvNrH.mjs} +8 -7
  40. package/dist/{event-projector-items-5VhsECCO.js → .setup/event-projector-items-C6L_5ZiT.mjs} +42 -8
  41. package/dist/{attempt-notifications-C9XufG6l.js → .setup/event-projector-usage-CnBS8Wa3.mjs} +102 -9
  42. package/dist/{harness-C7rRa7bm.js → .setup/harness-a_MsE4-_.mjs} +81 -21
  43. package/dist/{inference-context-Dr_mzvk4.js → .setup/inference-context-D96l9-ew.mjs} +1 -1
  44. package/dist/.setup/inference-proxy-b-aJMSxm.mjs +601 -0
  45. package/dist/{isolated-completion-DWVb5U2J.js → .setup/isolated-completion-BIZFhTNG.mjs} +18 -11
  46. package/dist/.setup/launch-args-DbFCehO7.mjs +196 -0
  47. package/dist/{managed-binary-D22rNEcR.js → .setup/managed-binary-BnshlFag.mjs} +14 -3
  48. package/dist/{managed-thread-store-D1t5jh3G.js → .setup/managed-thread-store-BMqgThVL.mjs} +48 -14
  49. package/dist/{model-catalog-Dq2n8f_p.js → .setup/model-catalog-CfXJf9Ay.mjs} +36 -12
  50. package/dist/{models-PCKOim-h.js → .setup/models-KnqBv0hE.mjs} +3 -3
  51. package/dist/.setup/native-auth-rWbGbMn3.mjs +57 -0
  52. package/dist/{native-subagent-history-DjtPloaU.js → .setup/native-subagent-history-0nYYgo0k.mjs} +43 -35
  53. package/dist/.setup/native-subagent-monitor-D3filLY2.mjs +4859 -0
  54. package/dist/{native-subagent-task-ids-BzTdT0Uw.js → .setup/native-subagent-task-ids-wb8CKZGN.mjs} +98 -44
  55. package/dist/{node-cli-sessions-DKaOmVUh.js → .setup/node-cli-sessions-r3avj02l.mjs} +86 -68
  56. package/dist/.setup/node-exec-server.runtime-BDwWXVpK.mjs +247 -0
  57. package/dist/{plan-7uG-Fp36.js → .setup/plan-CN3VwfNU.mjs} +133 -119
  58. package/dist/{plugin-activation-BYQculil.js → .setup/plugin-activation-DT3MNtqj.mjs} +7 -16
  59. package/dist/{plugin-app-cache-key-d0eKxy7b.js → .setup/plugin-app-cache-key-B2CsSdnV.mjs} +32 -44
  60. package/dist/{plugin-approval-roundtrip-Bz3FT8W5.js → .setup/plugin-approval-roundtrip-C0MZzCuP.mjs} +1 -1
  61. package/dist/{plugin-inventory-oL4Na1ZG.js → .setup/plugin-inventory-BoRei8Z4.mjs} +21 -11
  62. package/dist/{plugin-marketplace-discovery-P-Vndfqq.js → .setup/plugin-marketplace-discovery-CDOi8IFs.mjs} +4 -1
  63. package/dist/{plugin-metadata-cache-ClPJpRio.js → .setup/plugin-metadata-cache-Ctmo83k_.mjs} +226 -141
  64. package/dist/.setup/protocol-CANUwXJ3.mjs +17 -0
  65. package/dist/{provider-MQ8PVkuE.js → .setup/provider-BOsxQHOM.mjs} +9 -5
  66. package/dist/{provider-capabilities-BvCUL69A.js → .setup/provider-capabilities-BfE88FZ5.mjs} +31 -3
  67. package/dist/{rate-limits-CBMmWBr9.js → .setup/rate-limits-CMU3DUD0.mjs} +174 -151
  68. package/dist/{request-B7hEkBGq.js → .setup/request-D2L0zMrq.mjs} +130 -42
  69. package/dist/{run-attempt-CvsAAGa0.js → .setup/run-attempt-BHu11r7h.mjs} +1628 -966
  70. package/dist/.setup/run-attempt-lifecycle-B7JbY4-F.mjs +71 -0
  71. package/dist/{runtime-artifact-BJ0rXBZ_.js → .setup/runtime-artifact-CLZ8udh-.mjs} +29 -45
  72. package/dist/{sandbox-guard-BxgyoM8M.js → .setup/sandbox-guard-C2sRMOEY.mjs} +3 -3
  73. package/dist/{session-binding-CI8UuilT.js → .setup/session-binding-Cm0apEbd.mjs} +36 -83
  74. package/dist/{session-binding-record-Bcvslnhf.js → .setup/session-binding-record-BGoz8wOK.mjs} +202 -5
  75. package/dist/.setup/session-binding-sidecars-BlB5EvIS.mjs +546 -0
  76. package/dist/.setup/session-catalog-Pno1xGcl.mjs +2764 -0
  77. package/dist/{session-catalog-adoption-tcZi1IfX.js → .setup/session-catalog-adoption-BI6UTDZT.mjs} +58 -26
  78. package/dist/{session-catalog-archive-CwKg8Xz2.js → .setup/session-catalog-archive-lHBqzhaO.mjs} +6 -6
  79. package/dist/.setup/session-catalog-events-Bj6j94E_.mjs +347 -0
  80. package/dist/.setup/session-catalog-index-B9_VQIUz.mjs +1170 -0
  81. package/dist/.setup/session-catalog-index-order-hcdz07yN.mjs +48 -0
  82. package/dist/.setup/session-catalog-index-state-Dgh8ORJm.mjs +183 -0
  83. package/dist/{thread-history-page-D0JIp48V.js → .setup/session-catalog-native-projection-DowriLid.mjs} +223 -95
  84. package/dist/{session-catalog-node-adoption-B1tgDW-m.js → .setup/session-catalog-node-adoption-ITddWx_X.mjs} +25 -13
  85. package/dist/{session-catalog-node-continue-Ci-DXyJP.js → .setup/session-catalog-node-continue-6g6qi4A9.mjs} +24 -15
  86. package/dist/.setup/session-catalog-projection-zK_PUsiE.mjs +422 -0
  87. package/dist/{session-cli-DNN_jhGc.js → .setup/session-cli-irrD-uo7.mjs} +3 -3
  88. package/dist/{session-history-Cz-tOOYj.js → .setup/session-history-BrqhSCf9.mjs} +19 -19
  89. package/dist/{session-history-import-DwyijFI6.js → .setup/session-history-import-D-3wAgOP.mjs} +4 -4
  90. package/dist/{session-history-read-cxPUxyVV.js → .setup/session-history-read-B3ZfSUbF.mjs} +2 -2
  91. package/dist/{session-history.worker-BeK1YOyT.js → .setup/session-history.worker-CaCh0xF_.mjs} +10 -24
  92. package/dist/{session-initialization-Ct0_Hzmg.js → .setup/session-initialization-rcgbZiid.mjs} +2 -2
  93. package/dist/{session-permission-policy-BBmXA8Eg.js → .setup/session-permission-policy-BI1QK_98.mjs} +2 -2
  94. package/dist/{session-retirement-B2YfbAAT.js → .setup/session-retirement-BH-S6qkJ.mjs} +26 -7
  95. package/dist/{settled-turn-context-Du6gdUDd.js → .setup/settled-turn-context-fmwouT5I.mjs} +2 -2
  96. package/dist/{settled-turn-finalizer-Dn91stmc.js → .setup/settled-turn-finalizer-DiAi6Kx6.mjs} +12 -12
  97. package/dist/{shared-client-CscigXXL.js → .setup/shared-client-DA4VR4Eb.mjs} +332 -221
  98. package/dist/{side-question-BGMJQf4U.js → .setup/side-question-BJ1wSDcB.mjs} +183 -230
  99. package/dist/{source-CElXU0Oy.js → .setup/source-CUzJq5WN.mjs} +11 -10
  100. package/dist/.setup/spawn-error-CL3n6MAa.mjs +57 -0
  101. package/dist/{thread-archive-guard-DfpBr-Sz.js → .setup/thread-archive-guard-C9frICzX.mjs} +10 -3
  102. package/dist/.setup/thread-history-page-DoVpnHim.mjs +83 -0
  103. package/dist/{thread-lifecycle-DXl1-I6b.js → .setup/thread-lifecycle-B3mfz1TG.mjs} +347 -2318
  104. package/dist/{thread-ownership-BsDRTsyp.js → .setup/thread-ownership-DcTtAcXj.mjs} +6 -4
  105. package/dist/{thread-policy-BuEQfE0g.js → .setup/thread-policy-DGuQsuFC.mjs} +19 -3
  106. package/dist/.setup/thread-requests-BLvGkP2R.mjs +2205 -0
  107. package/dist/{thread-resume-DsDOZpFg.js → .setup/thread-resume-DIBXwOpE.mjs} +8 -5
  108. package/dist/.setup/timeout-C910MdAB.mjs +80 -0
  109. package/dist/{transcript-history-projection-v17wXgdK.js → .setup/transcript-history-projection-ZZpkFkJ_.mjs} +96 -61
  110. package/dist/{transcript-mirror-C5CKgNy6.js → .setup/transcript-mirror-BtHDBp1G.mjs} +224 -195
  111. package/dist/{transcript-mirror-attestation-DibE0krH.js → .setup/transcript-mirror-attestation-CzM-94NC.mjs} +4 -1
  112. package/dist/{transport-stdio-BGjHoYLr.js → .setup/transport-stdio-h2VHOskC.mjs} +274 -89
  113. package/dist/{upstream-session-fork-BZerMte_.js → .setup/upstream-session-fork-BUr4OUbC.mjs} +51 -42
  114. package/dist/{usage-tCk-mg_x.js → .setup/usage-BML0r-ua.mjs} +5 -4
  115. package/dist/.setup/usage-limit-error-DUMbefVY.mjs +166 -0
  116. package/dist/{web-search-provider.runtime-B7bGbGWq.js → .setup/web-search-provider.runtime-CDKlN-Rv.mjs} +4 -3
  117. package/dist/api.js +23 -12
  118. package/dist/catalog-page-worker-entrypoint.js +12 -0
  119. package/dist/catalog-page.worker.js +9 -0
  120. package/dist/cli-metadata.js +1 -1
  121. package/dist/doctor-contract-api.js +8 -528
  122. package/dist/harness.js +1 -1
  123. package/dist/index.js +306 -215
  124. package/dist/media-understanding-provider.js +3 -3
  125. package/dist/migration-provider-api.js +1 -1
  126. package/dist/native-tool-policy.js +12 -0
  127. package/dist/provider-discovery.js +18 -0
  128. package/dist/session-history-worker-runtime.js +36 -35
  129. package/dist/session-history.worker.js +2 -2
  130. package/dist/web-search-contract-api.js +1 -1
  131. package/openclaw.plugin.json +354 -69
  132. package/package.json +14 -8
  133. package/dist/attempt-context-D44yeDII.js +0 -636
  134. package/dist/binding-connection-D3udKbIE.js +0 -60
  135. package/dist/event-projector-usage-BfXmpOec.js +0 -102
  136. package/dist/inference-proxy-HGXKUIre.js +0 -311
  137. package/dist/launch-args-RXQwn8zV.js +0 -90
  138. package/dist/native-subagent-history-owner-Pcp7JuVF.js +0 -34
  139. package/dist/native-subagent-monitor-fQ7eIXEf.js +0 -2978
  140. package/dist/node-exec-server.runtime-Cl2vapEi.js +0 -226
  141. package/dist/rpc-error-ttN_QjEm.js +0 -30
  142. package/dist/session-catalog-ct-AH01I.js +0 -1477
  143. package/dist/session-catalog-home-id-CwhLdC03.js +0 -18
  144. package/dist/session-catalog-provenance-D-dIfRAH.js +0 -96
  145. package/dist/timeout-BVw8aaM1.js +0 -33
  146. package/dist/version-omm6IPI3.js +0 -12
  147. /package/dist/{auth-profile-selection-DFu9e167.js → .setup/auth-profile-selection-DFu9e167.mjs} +0 -0
  148. /package/dist/{config-utils-DujwEnhg.js → .setup/config-utils-DujwEnhg.mjs} +0 -0
  149. /package/dist/{context-compaction-activity-CMla5FPJ.js → .setup/context-compaction-activity-CMla5FPJ.mjs} +0 -0
  150. /package/dist/{elicitation-input-DPoK8F7w.js → .setup/elicitation-input-DPoK8F7w.mjs} +0 -0
  151. /package/dist/{history-rejection-B4nOXNXF.js → .setup/history-rejection-B4nOXNXF.mjs} +0 -0
  152. /package/dist/{image-payload-sanitizer-tupAr-2o.js → .setup/image-payload-sanitizer-tupAr-2o.mjs} +0 -0
  153. /package/dist/{incognito-session-uhrBF6wJ.js → .setup/incognito-session-uhrBF6wJ.mjs} +0 -0
  154. /package/dist/{local-runtime-attribution-B_2mnqhb.js → .setup/local-runtime-attribution-B_2mnqhb.mjs} +0 -0
  155. /package/dist/{native-execution-policy-umd0tgh4.js → .setup/native-execution-policy-umd0tgh4.mjs} +0 -0
  156. /package/dist/{rolldown-runtime-8H4AJuhK.js → .setup/rolldown-runtime-8H4AJuhK.mjs} +0 -0
  157. /package/dist/{session-binding-meta-B7aEMU7g.js → .setup/session-binding-meta-B7aEMU7g.mjs} +0 -0
  158. /package/dist/{session-upstream-marker-D15C9NHp.js → .setup/session-upstream-marker-D15C9NHp.mjs} +0 -0
  159. /package/dist/{upstream-prompt-provenance-LphB8slG.js → .setup/upstream-prompt-provenance-LphB8slG.mjs} +0 -0
  160. /package/dist/{web-search-provider.shared-BrZmlqyR.js → .setup/web-search-provider.shared-BrZmlqyR.mjs} +0 -0
@@ -0,0 +1,247 @@
1
+ import { i as resolveManagedCodexNativeCommand, r as resolveManagedCodexAppServerStartOptions, t as isManagedCodexDesktopCommand } from "./managed-binary-BnshlFag.mjs";
2
+ import { a as closeCodexAppServerTransportAndWait, t as createStdioTransport } from "./transport-stdio-h2VHOskC.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, tempWorkspace } 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, releaseResources, activeProcesses) {
75
+ let termination;
76
+ let hasClosed = false;
77
+ const settled = closed.then(async () => {
78
+ hasClosed = true;
79
+ await termination?.catch(() => {});
80
+ await releaseResources();
81
+ activeProcesses.delete(terminate);
82
+ });
83
+ settled.catch(() => {});
84
+ const terminate = async () => {
85
+ if (!hasClosed) await (termination ??= (async () => {
86
+ if (process.platform === "win32" && child.pid) killProcessTree(child.pid, { graceMs: CODEX_EXEC_SERVER_TERMINATION_GRACE_MS });
87
+ const { exited } = await closeCodexAppServerTransportAndWait(child, {
88
+ forceKillDelayMs: CODEX_EXEC_SERVER_TERMINATION_GRACE_MS,
89
+ exitTimeoutMs: CODEX_EXEC_SERVER_REAP_TIMEOUT_MS
90
+ });
91
+ if (!exited) throw new Error("Codex node exec-server process tree did not terminate.");
92
+ })());
93
+ await settled;
94
+ };
95
+ activeProcesses.add(terminate);
96
+ return terminate;
97
+ }
98
+ /** Runs the one-connection paired-node exec-server after lightweight command admission. */
99
+ async function runCodexNodeExecServer(params) {
100
+ const { io, workspace } = params;
101
+ const frames = io.frames;
102
+ const cwd = workspace.workspaceDir;
103
+ let writes;
104
+ let output;
105
+ let temporaryHome;
106
+ let unsubscribe;
107
+ const releaseResources = async () => {
108
+ try {
109
+ await Promise.allSettled([output, writes]);
110
+ await temporaryHome?.cleanup();
111
+ } finally {
112
+ workspace.release();
113
+ }
114
+ };
115
+ let close = releaseResources;
116
+ let rejectDisconnected;
117
+ const disconnected = new Promise((_resolve, reject) => {
118
+ rejectDisconnected = reject;
119
+ });
120
+ disconnected.catch(() => {});
121
+ const onAbort = () => {
122
+ const error = nodeExecServerAbortError(io.signal);
123
+ rejectDisconnected(error);
124
+ };
125
+ io.signal.addEventListener("abort", onAbort, { once: true });
126
+ try {
127
+ if (!frames) throw new Error("Codex node exec-server requires duplex frames.");
128
+ if (io.signal.aborted) throw nodeExecServerAbortError(io.signal);
129
+ temporaryHome = await tempWorkspace({
130
+ rootDir: resolvePreferredOpenClawTmpDir(),
131
+ prefix: "codex-node-exec-server-"
132
+ });
133
+ const { dir } = temporaryHome;
134
+ const codexHome = path.join(dir, ".codex");
135
+ await mkdir(codexHome, {
136
+ recursive: true,
137
+ mode: 448
138
+ });
139
+ const resolved = await resolveManagedCodexAppServerStartOptions({
140
+ transport: "stdio",
141
+ command: "codex",
142
+ commandSource: "managed",
143
+ managedCommandOrder: "package-first",
144
+ args: [
145
+ "exec-server",
146
+ "--listen",
147
+ "stdio"
148
+ ],
149
+ headers: {}
150
+ });
151
+ const native = resolveManagedCodexNativeCommand(resolved.command);
152
+ if (!native || isManagedCodexDesktopCommand(resolved.command)) throw new Error("Codex node exec-server requires the pinned managed package binary.");
153
+ const baseEnv = sanitizeEnvVars(process.env, {
154
+ strictMode: true,
155
+ customAllowedPatterns: [NODE_EXEC_SERVER_PLATFORM_ENVIRONMENT]
156
+ }).allowed;
157
+ if (io.signal.aborted) throw nodeExecServerAbortError(io.signal);
158
+ params.assertExecAuthorized();
159
+ const nativeReady = createDeferred();
160
+ const exit = createDeferred();
161
+ let stderr = Buffer.alloc(0);
162
+ let startupSettled = false;
163
+ let pendingLine = "";
164
+ const decoder = new StringDecoder("utf8");
165
+ const child = await createStdioTransport({
166
+ transport: "stdio",
167
+ command: native,
168
+ commandSource: "resolved-managed",
169
+ args: resolved.args,
170
+ headers: {},
171
+ cwd,
172
+ env: {
173
+ HOME: workspace.homeDir ?? dir,
174
+ CODEX_HOME: codexHome,
175
+ RUST_LOG: "error,opentelemetry_sdk=off,opentelemetry_otlp=off,codex_exec_server::server::transport=info",
176
+ ...process.platform === "win32" ? { USERPROFILE: workspace.homeDir ?? dir } : {}
177
+ },
178
+ clearEnv: ["NODE_OPTIONS"]
179
+ }, baseEnv, () => {
180
+ if (io.signal.aborted) throw nodeExecServerAbortError(io.signal);
181
+ params.assertExecAuthorized();
182
+ }, (spawned) => {
183
+ spawned.once("close", (code, signal) => exit.resolve({
184
+ code,
185
+ signal
186
+ }));
187
+ close = createNodeExecServerProcessOwner(spawned, exit.promise, releaseResources, params.activeProcesses);
188
+ output = relayNodeExecServerOutput(spawned, frames.send.bind(frames));
189
+ output.catch((error) => {
190
+ rejectDisconnected(error instanceof Error ? error : new Error(String(error)));
191
+ });
192
+ spawned.once("error", rejectDisconnected);
193
+ spawned.stdin.on("error", rejectDisconnected);
194
+ spawned.stderr.on("data", (chunk) => {
195
+ const next = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
196
+ stderr = Buffer.concat([stderr, next.subarray(-4096)]).subarray(-4096);
197
+ if (startupSettled) return;
198
+ const lines = (pendingLine + decoder.write(next)).split("\n");
199
+ pendingLine = lines.pop();
200
+ for (const line of [...lines, pendingLine]) if (Buffer.byteLength(line, "utf8") > MAX_CODEX_EXEC_SERVER_STDERR_BYTES) {
201
+ startupSettled = true;
202
+ pendingLine = "";
203
+ rejectDisconnected(/* @__PURE__ */ new Error("Codex node startup diagnostic line exceeded 4 KiB."));
204
+ return;
205
+ }
206
+ if (lines.some((line) => stripVTControlCharacters(line).trimEnd().endsWith(CODEX_EXEC_SERVER_READY_LINE))) {
207
+ startupSettled = true;
208
+ pendingLine = "";
209
+ nativeReady.resolve();
210
+ }
211
+ });
212
+ });
213
+ const stopped = exit.promise.then((outcome) => {
214
+ const diagnostic = stderr.toString("utf8").trim();
215
+ throw new Error(`Codex node exec-server exited (code ${outcome.code ?? "none"}, signal ${outcome.signal ?? "none"})${diagnostic ? `: ${diagnostic}` : "."}`);
216
+ });
217
+ await Promise.race([
218
+ nativeReady.promise,
219
+ stopped,
220
+ disconnected
221
+ ]);
222
+ if (io.signal.aborted) throw nodeExecServerAbortError(io.signal);
223
+ if (child.exitCode !== null || child.signalCode !== null) await stopped;
224
+ params.assertExecAuthorized();
225
+ unsubscribe = frames.onMessage((message) => {
226
+ const encoded = validateNodeExecServerMessage(message);
227
+ const operation = writes ? writes.then(() => writeNodeExecServerMessage(child, encoded, io.signal)) : writeNodeExecServerMessage(child, encoded, io.signal);
228
+ if (!operation) return;
229
+ const observed = operation.catch(() => {});
230
+ writes = observed;
231
+ observed.then(() => {
232
+ if (writes === observed) writes = void 0;
233
+ });
234
+ return operation;
235
+ });
236
+ return await Promise.race([stopped, disconnected]);
237
+ } finally {
238
+ io.signal.removeEventListener("abort", onAbort);
239
+ try {
240
+ unsubscribe?.();
241
+ } finally {
242
+ await close();
243
+ }
244
+ }
245
+ }
246
+ //#endregion
247
+ export { runCodexNodeExecServer };