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