@openclaw/codex 2026.9.4 → 2026.9.5

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 (148) hide show
  1. package/assets/activity.svg +30 -0
  2. package/assets/icon.png +0 -0
  3. package/dist/.setup/account-usage-runtime-C2MOIvfq.mjs +75 -0
  4. package/dist/{apply-CvT8tW5i.js → .setup/apply-CJ0ZfmBG.mjs} +11 -11
  5. package/dist/.setup/async-questions-DdhOCwGi.mjs +27 -0
  6. package/dist/{attempt-client-cleanup-DKHzbwt5.js → .setup/attempt-client-cleanup-BpYKdTA0.mjs} +29 -14
  7. package/dist/{attempt-context-D44yeDII.js → .setup/attempt-context-VXVwTCfS.mjs} +5 -5
  8. package/dist/.setup/attempt-terminal-gZrxQ35N.mjs +5 -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-QirmgiCo.mjs} +3 -3
  11. package/dist/{auth-profile-CwzO4_RG.js → .setup/auth-profile-WqZtZfXN.mjs} +1 -1
  12. package/dist/.setup/binding-connection-Bm38niE8.mjs +50 -0
  13. package/dist/.setup/binding-connection.runtime-CnRMC0ta.mjs +48 -0
  14. package/dist/{bounded-turn-C_Hneydj.js → .setup/bounded-turn-BtlZcivC.mjs} +16 -11
  15. package/dist/{build-state-BCmg9-5p.js → .setup/build-state-Xx9ybZqa.mjs} +1 -1
  16. package/dist/{capabilities-8vx68WLH.js → .setup/capabilities-_vXcZGSx.mjs} +1 -1
  17. package/dist/{client-B57KWPQx.js → .setup/client-vXs2929Q.mjs} +332 -163
  18. package/dist/{command-dispatch-BpduNGVf.js → .setup/command-dispatch-naHIZwwF.mjs} +3 -3
  19. package/dist/{command-formatters-lxlkNZgU.js → .setup/command-formatters-CGEkdawF.mjs} +2 -2
  20. package/dist/{command-handlers-tiL9iWj7.js → .setup/command-handlers-BtAJEW1X.mjs} +59 -42
  21. package/dist/{command-rpc-CR5EOEZX.js → .setup/command-rpc-DHFpn4le.mjs} +22 -13
  22. package/dist/{compact-B_H3AOd7.js → .setup/compact-C3i3qlzj.mjs} +28 -43
  23. package/dist/{config-oIORaQ5T.js → .setup/config-CedDWjM-.mjs} +5 -4
  24. package/dist/{config-options-CXMq1T-C.js → .setup/config-options-BsanJ8QG.mjs} +6 -418
  25. package/dist/{protocol-5bh1G-H7.js → .setup/config-parsing-CcB9iPoq.mjs} +9 -51
  26. package/dist/{config-runtime-D0zGNIHu.js → .setup/config-runtime-CeAhl_h4.mjs} +2 -2
  27. package/dist/.setup/config-security-BRQ2mgW9.mjs +465 -0
  28. package/dist/{conversation-binding-DsB4-O7U.js → .setup/conversation-binding-DhzrpTM6.mjs} +23 -21
  29. package/dist/{conversation-binding-data-BiodpIzq.js → .setup/conversation-binding-data-CrcyZk6O.mjs} +1 -1
  30. package/dist/{conversation-control-CtUu1b3m.js → .setup/conversation-control-DN53ns41.mjs} +17 -13
  31. package/dist/.setup/cyber-failover-DYwbmf1o.mjs +123 -0
  32. package/dist/.setup/cyber-failover-notice-e9G3J9-e.mjs +17 -0
  33. package/dist/{dynamic-tools-CmN5RAip.js → .setup/dynamic-tools-D16lOp67.mjs} +101 -55
  34. package/dist/{effective-mcp-catalog-Bd73bqA8.js → .setup/effective-mcp-catalog-K6kLCN8X.mjs} +3 -3
  35. package/dist/{ephemeral-turn-D78_VmzO.js → .setup/ephemeral-turn-R1gA8Sn6.mjs} +4 -5
  36. package/dist/{event-projector-assistant-message-BmBM4qBV.js → .setup/event-projector-assistant-message-DNUR1s0A.mjs} +6 -3
  37. package/dist/{event-projector-items-5VhsECCO.js → .setup/event-projector-items-DyTQ_XqL.mjs} +1 -1
  38. package/dist/{attempt-notifications-C9XufG6l.js → .setup/event-projector-usage-C7Ntzs-f.mjs} +102 -9
  39. package/dist/{harness-C7rRa7bm.js → .setup/harness-rxaaoN-o.mjs} +74 -20
  40. package/dist/{inference-context-Dr_mzvk4.js → .setup/inference-context-fulhZuz8.mjs} +1 -1
  41. package/dist/{inference-proxy-HGXKUIre.js → .setup/inference-proxy-CC15HuSi.mjs} +4 -4
  42. package/dist/{isolated-completion-DWVb5U2J.js → .setup/isolated-completion-B6srt48J.mjs} +7 -7
  43. package/dist/{launch-args-RXQwn8zV.js → .setup/launch-args-DnMak49W.mjs} +22 -1
  44. package/dist/{managed-binary-D22rNEcR.js → .setup/managed-binary-DP6Rib3P.mjs} +2 -2
  45. package/dist/{managed-thread-store-D1t5jh3G.js → .setup/managed-thread-store-BMqgThVL.mjs} +48 -14
  46. package/dist/{model-catalog-Dq2n8f_p.js → .setup/model-catalog-DkvUuBey.mjs} +35 -10
  47. package/dist/{models-PCKOim-h.js → .setup/models-BDFgm_G-.mjs} +3 -3
  48. package/dist/.setup/native-auth-BLZGqFjw.mjs +57 -0
  49. package/dist/{native-subagent-history-DjtPloaU.js → .setup/native-subagent-history-YXaL6dMd.mjs} +24 -29
  50. package/dist/.setup/native-subagent-monitor-B1hxzIOy.mjs +5031 -0
  51. package/dist/{native-subagent-task-ids-BzTdT0Uw.js → .setup/native-subagent-task-ids-DsuOonKv.mjs} +32 -8
  52. package/dist/{node-cli-sessions-DKaOmVUh.js → .setup/node-cli-sessions-Cl8b2ZF3.mjs} +1 -1
  53. package/dist/{node-exec-server.runtime-Cl2vapEi.js → .setup/node-exec-server.runtime-BaViBKNz.mjs} +3 -3
  54. package/dist/{plan-7uG-Fp36.js → .setup/plan-xD7WKYTM.mjs} +64 -48
  55. package/dist/{plugin-activation-BYQculil.js → .setup/plugin-activation-r8nq5Jzp.mjs} +3 -3
  56. package/dist/{plugin-app-cache-key-d0eKxy7b.js → .setup/plugin-app-cache-key-BOxKP7db.mjs} +29 -25
  57. package/dist/{plugin-approval-roundtrip-Bz3FT8W5.js → .setup/plugin-approval-roundtrip-CjfzafAZ.mjs} +1 -1
  58. package/dist/{plugin-inventory-oL4Na1ZG.js → .setup/plugin-inventory-DUle8DLz.mjs} +7 -6
  59. package/dist/{plugin-metadata-cache-ClPJpRio.js → .setup/plugin-metadata-cache-DsS5buNa.mjs} +29 -14
  60. package/dist/{provider-capabilities-BvCUL69A.js → .setup/provider-capabilities-B8J4Dy-O.mjs} +2 -2
  61. package/dist/{provider-MQ8PVkuE.js → .setup/provider-fFh_-VR3.mjs} +4 -4
  62. package/dist/{rate-limits-CBMmWBr9.js → .setup/rate-limits-DOEGYRNs.mjs} +90 -46
  63. package/dist/{request-B7hEkBGq.js → .setup/request-BioXJLYa.mjs} +113 -33
  64. package/dist/.setup/run-attempt-lifecycle-B7JbY4-F.mjs +71 -0
  65. package/dist/{run-attempt-CvsAAGa0.js → .setup/run-attempt-rlA07pUv.mjs} +580 -498
  66. package/dist/{runtime-artifact-BJ0rXBZ_.js → .setup/runtime-artifact-Dy38Z5iU.mjs} +2 -2
  67. package/dist/{sandbox-guard-BxgyoM8M.js → .setup/sandbox-guard-BBP-RbTf.mjs} +3 -3
  68. package/dist/{session-binding-CI8UuilT.js → .setup/session-binding-_0W_fHRr.mjs} +46 -64
  69. package/dist/{session-binding-record-Bcvslnhf.js → .setup/session-binding-record-TH3xA0zj.mjs} +181 -3
  70. package/dist/.setup/session-binding-sidecars-CKYEcfNn.mjs +543 -0
  71. package/dist/{session-catalog-adoption-tcZi1IfX.js → .setup/session-catalog-adoption-CR_whkEW.mjs} +6 -6
  72. package/dist/{session-catalog-archive-CwKg8Xz2.js → .setup/session-catalog-archive-CwZaPacf.mjs} +6 -6
  73. package/dist/.setup/session-catalog-events-jMcYfQyd.mjs +250 -0
  74. package/dist/.setup/session-catalog-fUdWDx-U.mjs +2464 -0
  75. package/dist/.setup/session-catalog-index-B141u15s.mjs +1070 -0
  76. package/dist/.setup/session-catalog-index-order-Cc5BzlQr.mjs +48 -0
  77. package/dist/.setup/session-catalog-index-state-BAuDztHN.mjs +180 -0
  78. package/dist/{thread-history-page-D0JIp48V.js → .setup/session-catalog-native-projection-ChV3cCtm.mjs} +206 -95
  79. package/dist/{session-catalog-node-adoption-B1tgDW-m.js → .setup/session-catalog-node-adoption-BVRsYOSh.mjs} +3 -3
  80. package/dist/{session-catalog-node-continue-Ci-DXyJP.js → .setup/session-catalog-node-continue-Dowv8osw.mjs} +7 -7
  81. package/dist/.setup/session-catalog-projection-C1Bj9Jl-.mjs +414 -0
  82. package/dist/{session-cli-DNN_jhGc.js → .setup/session-cli-DIj-IE-E.mjs} +4 -4
  83. package/dist/{session-history-Cz-tOOYj.js → .setup/session-history-C--SrLI8.mjs} +10 -5
  84. package/dist/{session-history-import-DwyijFI6.js → .setup/session-history-import-JHXT5Xfi.mjs} +4 -4
  85. package/dist/{session-history-read-cxPUxyVV.js → .setup/session-history-read-B3ZfSUbF.mjs} +2 -2
  86. package/dist/{session-history.worker-BeK1YOyT.js → .setup/session-history.worker-CpNj7H_P.mjs} +5 -6
  87. package/dist/{session-initialization-Ct0_Hzmg.js → .setup/session-initialization-DH1z6fXn.mjs} +2 -2
  88. package/dist/{session-permission-policy-BBmXA8Eg.js → .setup/session-permission-policy-DhurXY0l.mjs} +2 -2
  89. package/dist/{session-retirement-B2YfbAAT.js → .setup/session-retirement-CU87AOg9.mjs} +6 -6
  90. package/dist/{settled-turn-context-Du6gdUDd.js → .setup/settled-turn-context-fmwouT5I.mjs} +2 -2
  91. package/dist/{settled-turn-finalizer-Dn91stmc.js → .setup/settled-turn-finalizer-CiY2bLFK.mjs} +9 -9
  92. package/dist/{shared-client-CscigXXL.js → .setup/shared-client-BpTtuLQ5.mjs} +286 -145
  93. package/dist/{side-question-BGMJQf4U.js → .setup/side-question-DSCZyoBD.mjs} +64 -47
  94. package/dist/{source-CElXU0Oy.js → .setup/source-Bjp4UQij.mjs} +7 -6
  95. package/dist/{thread-archive-guard-DfpBr-Sz.js → .setup/thread-archive-guard-jmecf6OJ.mjs} +1 -1
  96. package/dist/.setup/thread-history-page-BTx-4xsg.mjs +83 -0
  97. package/dist/{thread-lifecycle-DXl1-I6b.js → .setup/thread-lifecycle-Cik28qWn.mjs} +256 -128
  98. package/dist/{thread-ownership-BsDRTsyp.js → .setup/thread-ownership-skomxnIt.mjs} +4 -4
  99. package/dist/{thread-policy-BuEQfE0g.js → .setup/thread-policy-Cjs4B8xf.mjs} +2 -2
  100. package/dist/{thread-resume-DsDOZpFg.js → .setup/thread-resume-BkNpj9Pz.mjs} +8 -5
  101. package/dist/.setup/timeout-DZF05XrR.mjs +63 -0
  102. package/dist/{transcript-history-projection-v17wXgdK.js → .setup/transcript-history-projection-DHNBDhCU.mjs} +8 -3
  103. package/dist/{transcript-mirror-C5CKgNy6.js → .setup/transcript-mirror-D4qp_leP.mjs} +15 -6
  104. package/dist/{transcript-mirror-attestation-DibE0krH.js → .setup/transcript-mirror-attestation-CzM-94NC.mjs} +4 -1
  105. package/dist/{transport-stdio-BGjHoYLr.js → .setup/transport-stdio-Cmx94Oiy.mjs} +149 -44
  106. package/dist/{upstream-session-fork-BZerMte_.js → .setup/upstream-session-fork-D3UKxgVD.mjs} +27 -26
  107. package/dist/{usage-tCk-mg_x.js → .setup/usage-BOgBEKso.mjs} +4 -4
  108. package/dist/.setup/usage-limit-error-C0ow7DOc.mjs +166 -0
  109. package/dist/{version-omm6IPI3.js → .setup/version-CoqzXPgK.mjs} +1 -1
  110. package/dist/{web-search-provider.runtime-B7bGbGWq.js → .setup/web-search-provider.runtime-CTGuJt6i.mjs} +3 -3
  111. package/dist/api.js +6 -6
  112. package/dist/cli-metadata.js +1 -1
  113. package/dist/doctor-contract-api.js +8 -528
  114. package/dist/harness.js +1 -1
  115. package/dist/index.js +123 -83
  116. package/dist/media-understanding-provider.js +3 -3
  117. package/dist/migration-provider-api.js +1 -1
  118. package/dist/native-tool-policy.js +12 -0
  119. package/dist/provider-discovery.js +18 -0
  120. package/dist/session-history-worker-runtime.js +23 -5
  121. package/dist/session-history.worker.js +2 -2
  122. package/dist/web-search-contract-api.js +1 -1
  123. package/openclaw.plugin.json +354 -69
  124. package/package.json +11 -8
  125. package/dist/binding-connection-D3udKbIE.js +0 -60
  126. package/dist/event-projector-usage-BfXmpOec.js +0 -102
  127. package/dist/native-subagent-history-owner-Pcp7JuVF.js +0 -34
  128. package/dist/native-subagent-monitor-fQ7eIXEf.js +0 -2978
  129. package/dist/rpc-error-ttN_QjEm.js +0 -30
  130. package/dist/session-catalog-ct-AH01I.js +0 -1477
  131. package/dist/session-catalog-home-id-CwhLdC03.js +0 -18
  132. package/dist/session-catalog-provenance-D-dIfRAH.js +0 -96
  133. package/dist/timeout-BVw8aaM1.js +0 -33
  134. package/dist/{auth-profile-selection-DFu9e167.js → .setup/auth-profile-selection-DFu9e167.mjs} +0 -0
  135. package/dist/{config-utils-DujwEnhg.js → .setup/config-utils-DujwEnhg.mjs} +0 -0
  136. package/dist/{context-compaction-activity-CMla5FPJ.js → .setup/context-compaction-activity-CMla5FPJ.mjs} +0 -0
  137. package/dist/{elicitation-input-DPoK8F7w.js → .setup/elicitation-input-DPoK8F7w.mjs} +0 -0
  138. package/dist/{history-rejection-B4nOXNXF.js → .setup/history-rejection-B4nOXNXF.mjs} +0 -0
  139. package/dist/{image-payload-sanitizer-tupAr-2o.js → .setup/image-payload-sanitizer-tupAr-2o.mjs} +0 -0
  140. package/dist/{incognito-session-uhrBF6wJ.js → .setup/incognito-session-uhrBF6wJ.mjs} +0 -0
  141. package/dist/{local-runtime-attribution-B_2mnqhb.js → .setup/local-runtime-attribution-B_2mnqhb.mjs} +0 -0
  142. package/dist/{native-execution-policy-umd0tgh4.js → .setup/native-execution-policy-YBMHSzC4.mjs} +1 -1
  143. /package/dist/{plugin-marketplace-discovery-P-Vndfqq.js → .setup/plugin-marketplace-discovery-P-Vndfqq.mjs} +0 -0
  144. /package/dist/{rolldown-runtime-8H4AJuhK.js → .setup/rolldown-runtime-8H4AJuhK.mjs} +0 -0
  145. /package/dist/{session-binding-meta-B7aEMU7g.js → .setup/session-binding-meta-B7aEMU7g.mjs} +0 -0
  146. /package/dist/{session-upstream-marker-D15C9NHp.js → .setup/session-upstream-marker-D15C9NHp.mjs} +0 -0
  147. /package/dist/{upstream-prompt-provenance-LphB8slG.js → .setup/upstream-prompt-provenance-LphB8slG.mjs} +0 -0
  148. /package/dist/{web-search-provider.shared-BrZmlqyR.js → .setup/web-search-provider.shared-BrZmlqyR.mjs} +0 -0
@@ -1,7 +1,7 @@
1
- import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { n as withCodexAppServerThreadMutation } from "./incognito-session-uhrBF6wJ.js";
3
- import { J as retainCodexAppServerLiveThread, U as isCodexAppServerLiveThreadClaimed, _ as retainSharedCodexAppServerClientByInstanceId, q as releaseCodexAppServerLiveThread } from "./shared-client-CscigXXL.js";
4
- import { a as closeCodexStartupClientBestEffort, d as unsubscribeCodexThreadBestEffort, r as CodexAppServerUnsafeSubscriptionError } from "./attempt-client-cleanup-DKHzbwt5.js";
1
+ import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
2
+ import { n as withCodexAppServerThreadMutation } from "./incognito-session-uhrBF6wJ.mjs";
3
+ import { U as releaseCodexAppServerLiveThread, W as retainCodexAppServerLiveThread, _ as retainSharedCodexAppServerClientByInstanceId, z as isCodexAppServerLiveThreadClaimed } from "./shared-client-BpTtuLQ5.mjs";
4
+ import { a as closeCodexStartupClientBestEffort, f as unsubscribeCodexThreadBestEffort, r as CodexAppServerUnsafeSubscriptionError } from "./attempt-client-cleanup-BpYKdTA0.mjs";
5
5
  //#region extensions/codex/src/app-server/thread-ownership.ts
6
6
  var thread_ownership_exports = /* @__PURE__ */ __exportAll({
7
7
  isSameCodexAppServerThreadOwner: () => isSameCodexAppServerThreadOwner,
@@ -1,5 +1,5 @@
1
- import { l as isCodexAppServerOverloadError, u as isCodexAppServerPrewriteRequestCancellationError } from "./client-B57KWPQx.js";
2
- import { r as requestCodexAppServerClientJson, t as CodexAppServerScopedRequestRejectedError } from "./request-B7hEkBGq.js";
1
+ import { l as isCodexAppServerOverloadError, u as isCodexAppServerPrewriteRequestCancellationError } from "./client-vXs2929Q.mjs";
2
+ import { r as requestCodexAppServerClientJson, t as CodexAppServerScopedRequestRejectedError } from "./request-BioXJLYa.mjs";
3
3
  import { AgentHarnessPreflightError } from "openclaw/plugin-sdk/agent-harness-runtime";
4
4
  //#region extensions/codex/src/app-server/thread-policy.ts
5
5
  /** A refusal, not a failed native write: the ephemeral conversation must stay alive. */
@@ -1,8 +1,10 @@
1
- import { l as isCodexAppServerOverloadError, u as isCodexAppServerPrewriteRequestCancellationError, y as assertCodexThreadResumeResponse } from "./client-B57KWPQx.js";
2
- import { t as CodexAppServerRpcError } from "./rpc-error-ttN_QjEm.js";
3
- import { t as CodexAppServerScopedRequestRejectedError } from "./request-B7hEkBGq.js";
4
- import { B as forgetCodexWorkspaceReferences, N as isCodexAppServerStartupError, u as isCodexAppServerStartSelectionChangedError } from "./shared-client-CscigXXL.js";
5
- import { d as unsubscribeCodexThreadBestEffort, i as assertCodexThreadResumeSubscription, r as CodexAppServerUnsafeSubscriptionError } from "./attempt-client-cleanup-DKHzbwt5.js";
1
+ import { l as isCodexAppServerOverloadError, u as isCodexAppServerPrewriteRequestCancellationError, y as assertCodexThreadResumeResponse } from "./client-vXs2929Q.mjs";
2
+ import { i as CodexAppServerRpcError } from "./timeout-DZF05XrR.mjs";
3
+ import { r as publishCodexCatalogResume } from "./session-catalog-events-jMcYfQyd.mjs";
4
+ import { t as CodexAppServerScopedRequestRejectedError } from "./request-BioXJLYa.mjs";
5
+ import { F as forgetCodexWorkspaceReferences, rt as isCodexAppServerStartupError, u as isCodexAppServerStartSelectionChangedError } from "./shared-client-BpTtuLQ5.mjs";
6
+ import { f as unsubscribeCodexThreadBestEffort, i as assertCodexThreadResumeSubscription, r as CodexAppServerUnsafeSubscriptionError } from "./attempt-client-cleanup-BpYKdTA0.mjs";
7
+ import { sanitizeTerminalText } from "openclaw/plugin-sdk/text-chunking";
6
8
  //#region extensions/codex/src/app-server/thread-resume.ts
7
9
  /** Owns Codex thread/resume subscription safety. */
8
10
  /** Resumes one thread, releasing or isolating every possible native subscription. */
@@ -46,6 +48,7 @@ async function resumeCodexAppServerThread(params) {
46
48
  if (error instanceof CodexAppServerUnsafeSubscriptionError) throw error;
47
49
  throw new CodexAppServerUnsafeSubscriptionError(error instanceof Error ? error.message : `Codex thread/resume outcome is indeterminate for ${threadId}`, { cause: error });
48
50
  }
51
+ await publishCodexCatalogResume(params.client, response, sanitizeTerminalText);
49
52
  return response;
50
53
  }
51
54
  //#endregion
@@ -0,0 +1,63 @@
1
+ import { m as isJsonObject } from "./config-security-BRQ2mgW9.mjs";
2
+ import { withTimeout } from "openclaw/plugin-sdk/time-runtime";
3
+ //#region extensions/codex/src/app-server/rpc-error.ts
4
+ const CODEX_APP_SERVER_OVERLOADED_ERROR_CODE = -32001;
5
+ /** RPC error wrapper that preserves app-server error code and data. */
6
+ var CodexAppServerRpcError = class extends Error {
7
+ constructor(error, method) {
8
+ super(formatCodexAppServerRpcErrorMessage(error, method));
9
+ this.name = "CodexAppServerRpcError";
10
+ this.code = error.code;
11
+ this.data = error.data;
12
+ this.method = method;
13
+ }
14
+ };
15
+ function isCodexThreadReadMissingError(error, threadId) {
16
+ return error instanceof CodexAppServerRpcError && error.method === "thread/read" && error.code === -32600 && error.message === `thread not loaded: ${threadId}`;
17
+ }
18
+ function formatCodexAppServerRpcErrorMessage(error, method) {
19
+ const message = error.message || `${method} failed`;
20
+ const detail = readCodexAppServerRpcReloginDetail(error.data);
21
+ return detail && !message.includes(detail) ? `${message}: ${detail}` : message;
22
+ }
23
+ function readCodexAppServerRpcReloginDetail(data) {
24
+ const record = isJsonObject(data) ? data : void 0;
25
+ const nested = isJsonObject(record?.error) ? record.error : record;
26
+ if (!nested) return;
27
+ const isRelogin = nested.action === "relogin" || nested.reason === "cloudRequirements" && nested.errorCode === "Auth";
28
+ const detail = typeof nested.detail === "string" ? nested.detail.trim() : "";
29
+ return isRelogin && detail ? detail : void 0;
30
+ }
31
+ //#endregion
32
+ //#region extensions/codex/src/app-server/timeout.ts
33
+ /**
34
+ * Thin Codex app-server timeout adapter around OpenClaw's shared timeout helper.
35
+ */
36
+ function resolveAbortError(signal) {
37
+ return signal.reason instanceof Error ? signal.reason : new Error("Codex app-server operation aborted", { cause: signal.reason });
38
+ }
39
+ /** Awaits a promise with a Codex-specific timeout error message. */
40
+ async function withTimeout$1(promise, timeoutMs, timeoutMessage, createError) {
41
+ return await withTimeout(promise, timeoutMs, {
42
+ message: timeoutMessage,
43
+ ...createError ? { createError } : {}
44
+ });
45
+ }
46
+ /** Bounds an operation by both its owner lifecycle and one total wall-clock budget. */
47
+ async function withAbortableTimeout(params) {
48
+ const signal = params.signal;
49
+ if (signal?.aborted) throw resolveAbortError(signal);
50
+ let removeAbortListener;
51
+ const operation = signal ? Promise.race([params.promise, new Promise((_, reject) => {
52
+ const onAbort = () => reject(resolveAbortError(signal));
53
+ signal.addEventListener("abort", onAbort, { once: true });
54
+ removeAbortListener = () => signal.removeEventListener("abort", onAbort);
55
+ })]) : params.promise;
56
+ try {
57
+ return await withTimeout$1(operation, params.timeoutMs, params.timeoutMessage, params.createTimeoutError);
58
+ } finally {
59
+ removeAbortListener?.();
60
+ }
61
+ }
62
+ //#endregion
63
+ export { isCodexThreadReadMissingError as a, CodexAppServerRpcError as i, withTimeout$1 as n, CODEX_APP_SERVER_OVERLOADED_ERROR_CODE as r, withAbortableTimeout as t };
@@ -1,5 +1,6 @@
1
- import { c as itemName, l as itemStatus, t as auditNativeToolName } from "./event-projector-items-5VhsECCO.js";
2
- import { t as attachCodexMirrorIdentity } from "./upstream-prompt-provenance-LphB8slG.js";
1
+ import { t as readCodexAsyncQuestions } from "./async-questions-DdhOCwGi.mjs";
2
+ import { c as itemName, l as itemStatus, t as auditNativeToolName } from "./event-projector-items-DyTQ_XqL.mjs";
3
+ import { t as attachCodexMirrorIdentity } from "./upstream-prompt-provenance-LphB8slG.mjs";
3
4
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
5
  import { truncateUtf8Prefix } from "openclaw/plugin-sdk/text-utility-runtime";
5
6
  import { Buffer } from "node:buffer";
@@ -82,6 +83,7 @@ function projectCodexThreadHistory(params) {
82
83
  if (!text || !role) continue;
83
84
  const phase = item.phase === "commentary" || item.phase === "final_answer" ? item.phase : void 0;
84
85
  const asyncDelivery = item.delivery === "async";
86
+ const questions = asyncDelivery ? readCodexAsyncQuestions(item.questions) : void 0;
85
87
  const message = role === "assistant" ? attachCodexMirrorIdentity({
86
88
  role,
87
89
  content: [{
@@ -95,7 +97,10 @@ function projectCodexThreadHistory(params) {
95
97
  stopReason: turn.status === "interrupted" ? "aborted" : turn.status === "failed" ? "error" : "stop",
96
98
  ...turn.status === "failed" && turn.error?.message ? { errorMessage: turn.error.message } : {},
97
99
  ...phase ? { phase } : {},
98
- ...asyncDelivery && itemId ? { openclawAsyncDelivery: { itemId } } : {},
100
+ ...asyncDelivery && itemId ? { openclawAsyncDelivery: {
101
+ itemId,
102
+ ...questions ? { questions } : {}
103
+ } } : {},
99
104
  timestamp
100
105
  }, identity) : attachCodexMirrorIdentity({
101
106
  role,
@@ -1,7 +1,8 @@
1
- import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { i as readUpstreamUserText, n as attachUpstreamUserText, r as readMirrorIdentity, t as attachCodexMirrorIdentity } from "./upstream-prompt-provenance-LphB8slG.js";
3
- import { t as projectBoundedCodexThreadHistory } from "./transcript-history-projection-v17wXgdK.js";
4
- import { a as fingerprintCodexMirrorSourceMessage, c as readCodexMirrorSourceFingerprint, i as buildCodexMirrorDedupeIdentity, n as attachCodexMirrorAttestation, r as attachCodexMirrorRunId, s as isMirroredAgentMessage, t as applyCodexTranscriptTaint } from "./transcript-mirror-attestation-DibE0krH.js";
1
+ import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
2
+ import { t as readCodexAsyncQuestions } from "./async-questions-DdhOCwGi.mjs";
3
+ import { i as readUpstreamUserText, n as attachUpstreamUserText, r as readMirrorIdentity, t as attachCodexMirrorIdentity } from "./upstream-prompt-provenance-LphB8slG.mjs";
4
+ import { t as projectBoundedCodexThreadHistory } from "./transcript-history-projection-DHNBDhCU.mjs";
5
+ import { a as fingerprintCodexMirrorSourceMessage, c as readCodexMirrorSourceFingerprint, i as buildCodexMirrorDedupeIdentity, n as attachCodexMirrorAttestation, r as attachCodexMirrorRunId, s as isMirroredAgentMessage, t as applyCodexTranscriptTaint } from "./transcript-mirror-attestation-CzM-94NC.mjs";
5
6
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
6
7
  import { deliverAgentHarnessUserInputPrompt, embeddedAgentLog, formatErrorMessage, projectAgentHarnessTranscriptMessageForDisplay, restorePreparedUserTurnOperationalMetaForRuntime, runAgentHarnessBeforeMessageWriteHook } from "openclaw/plugin-sdk/agent-harness-runtime";
7
8
  import { withCodexSessionTranscriptMirrorWriteLock } from "openclaw/plugin-sdk/codex-session-transcript-runtime";
@@ -187,6 +188,7 @@ async function mirrorPromptAtTurnStartBestEffort(params) {
187
188
  const mirrorPromise = (async () => {
188
189
  const userPromptMessage = projectAgentHarnessTranscriptMessageForDisplay({
189
190
  hidden: params.params.trigger === "memory",
191
+ inputProvenance: params.params.inputProvenance,
190
192
  message: attachUpstreamUserText(attachCodexMirrorIdentity(await buildResolvedCodexUserPromptMessage(params.params), `${params.turnId}:prompt`), params.upstreamUserText)
191
193
  });
192
194
  const recorder = params.params.userTurnTranscriptRecorder;
@@ -298,6 +300,7 @@ async function mirror(params) {
298
300
  preparedUserMessage.content = structuredClone(preparedUserMessage.content);
299
301
  preparedUserMessage["__openclaw"].humanMentions = structuredClone(preparedUserMessage["__openclaw"].humanMentions);
300
302
  }
303
+ const asyncSourceText = message.role === "assistant" && message.openclawAsyncDelivery ? readMirroredAssistantText(message) : void 0;
301
304
  const nextMessage = runAgentHarnessBeforeMessageWriteHook({
302
305
  message: transcriptMessage,
303
306
  agentId: params.agentId,
@@ -319,7 +322,13 @@ async function mirror(params) {
319
322
  } : attachCodexMirrorAttestation(restoredMessage, sourceFingerprint);
320
323
  if (mirrorIdentity) messageToAppend = attachCodexMirrorIdentity(messageToAppend, mirrorIdentity);
321
324
  if (ownsRun && params.runId) messageToAppend = attachCodexMirrorRunId(messageToAppend, params.runId, ownsTerminal, terminalOwner?.settlementWarning);
322
- if (message.role === "assistant" && message.openclawAsyncDelivery) messageToAppend = Object.assign(messageToAppend, { openclawAsyncDelivery: { itemId: message.openclawAsyncDelivery.itemId } });
325
+ if (message.role === "assistant" && message.openclawAsyncDelivery) {
326
+ const questions = isMirroredAgentMessage(messageToAppend) && readMirroredAssistantText(messageToAppend) === asyncSourceText ? readCodexAsyncQuestions(messageToAppend.openclawAsyncDelivery?.questions) : void 0;
327
+ messageToAppend = Object.assign(messageToAppend, { openclawAsyncDelivery: {
328
+ itemId: message.openclawAsyncDelivery.itemId,
329
+ ...questions ? { questions } : {}
330
+ } });
331
+ }
323
332
  messageToAppend = applyCodexTranscriptTaint(messageToAppend, taint);
324
333
  messageToAppend = projectAgentHarnessTranscriptMessageForDisplay({
325
334
  hidden: message.display === false,
@@ -460,4 +469,4 @@ function resolveCodexMirrorTranscriptTarget(params) {
460
469
  };
461
470
  }
462
471
  //#endregion
463
- export { transcript_mirror_exports as a, mirrorPromptAtTurnStartBestEffort as i, createCodexAppServerUserMessagePersistenceNotifier as n, buildCodexUserPromptMessage as o, importCodexThreadHistoryToTranscript as r, promptSnapshot as s, codexTranscriptMirrorRuntime as t };
472
+ export { transcript_mirror_exports as a, promptSnapshot as c, mirrorPromptAtTurnStartBestEffort as i, createCodexAppServerUserMessagePersistenceNotifier as n, buildCodexUserPromptMessage as o, importCodexThreadHistoryToTranscript as r, buildResolvedCodexUserPromptMessage as s, codexTranscriptMirrorRuntime as t };
@@ -1,4 +1,5 @@
1
- import { i as readUpstreamUserText, r as readMirrorIdentity } from "./upstream-prompt-provenance-LphB8slG.js";
1
+ import { t as readCodexAsyncQuestions } from "./async-questions-DdhOCwGi.mjs";
2
+ import { i as readUpstreamUserText, r as readMirrorIdentity } from "./upstream-prompt-provenance-LphB8slG.mjs";
2
3
  import { asOptionalRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
3
4
  import { createHash } from "node:crypto";
4
5
  //#region extensions/codex/src/app-server/transcript-mirror-attestation.ts
@@ -71,9 +72,11 @@ function readCodexMirrorSourceFingerprint(message) {
71
72
  }
72
73
  function serializeCodexMirrorSourceEvidence(message) {
73
74
  const content = "content" in message ? message.content : void 0;
75
+ const questions = isMirroredAgentMessage(message) ? readCodexAsyncQuestions(message.openclawAsyncDelivery?.questions) : void 0;
74
76
  return JSON.stringify({
75
77
  role: message.role,
76
78
  content,
79
+ ...questions ? { questions } : {},
77
80
  ...message.role === "user" ? { upstreamUserText: readUpstreamUserText(message) } : {},
78
81
  ...message.role === "toolResult" ? {
79
82
  toolCallId: message.toolCallId,
@@ -1,7 +1,9 @@
1
- import { n as normalizeCodexAppServerArgs } from "./launch-args-RXQwn8zV.js";
1
+ import { r as normalizeCodexAppServerArgs } from "./launch-args-DnMak49W.mjs";
2
2
  import { createHash, randomUUID } from "node:crypto";
3
3
  import { z } from "zod";
4
4
  import { materializeWindowsSpawnProgram, resolveWindowsSpawnProgram } from "openclaw/plugin-sdk/windows-spawn";
5
+ import { closeSync, constants, openSync, readSync } from "node:fs";
6
+ import path from "node:path";
5
7
  import { readFile, readdir } from "node:fs/promises";
6
8
  import { once } from "node:events";
7
9
  import { execFile, spawn } from "node:child_process";
@@ -15,6 +17,32 @@ function isDeadProcessState(state) {
15
17
  const PROCESS_COLUMNS = "pid=,ppid=,pgid=,stat=,lstart=";
16
18
  const MAX_PROCESS_CONTAINMENT_MS$1 = 2e3;
17
19
  const PROCESS_INSPECTION_MAX_BYTES = 8388608;
20
+ const PROCFS_COMMAND_PERMISSION_EXIT = 77;
21
+ const PROCFS_COMMAND_READER = `
22
+ const fs = require("node:fs");
23
+ const [pid, maxBytes] = process.argv.slice(-2).map(Number);
24
+ try {
25
+ const fd = fs.openSync("/proc/" + pid + "/cmdline", "r");
26
+ const buffer = Buffer.alloc(4096);
27
+ const chunks = [];
28
+ let bytes = 0;
29
+ try {
30
+ for (;;) {
31
+ const count = fs.readSync(fd, buffer, 0, Math.min(buffer.length, maxBytes - bytes + 1), null);
32
+ if (count === 0) break;
33
+ bytes += count;
34
+ if (bytes > maxBytes) throw new Error("Command byte limit exceeded");
35
+ chunks.push(Buffer.from(buffer.subarray(0, count)));
36
+ }
37
+ } finally {
38
+ fs.closeSync(fd);
39
+ }
40
+ process.stdout.end(Buffer.concat(chunks, bytes));
41
+ } catch (error) {
42
+ process.exitCode = ["EACCES", "EPERM", "ERR_ACCESS_DENIED"].includes(error?.code)
43
+ ? ${PROCFS_COMMAND_PERMISSION_EXIT} : 1;
44
+ }
45
+ `;
18
46
  var ProcessInspectionError = class extends Error {
19
47
  constructor(reason) {
20
48
  const detail = {
@@ -56,17 +84,11 @@ async function readCodexAppServerProcessCommand(observed, deadline) {
56
84
  if (process.platform === "linux") {
57
85
  let pending = false;
58
86
  do {
59
- const remainingMs = deadline - Date.now();
60
- if (remainingMs <= 0) throw new ProcessInspectionError("deadline");
61
- let command;
62
- try {
63
- command = await readFile(`/proc/${observed.pid}/cmdline`, {
64
- encoding: "utf8",
65
- signal: AbortSignal.timeout(remainingMs)
66
- });
67
- } catch (error) {
68
- throw inspectionFailure(error);
69
- }
87
+ if (deadline - Date.now() <= 0) throw new ProcessInspectionError("deadline");
88
+ const command = await readProcessOutput({
89
+ kind: "procfs-command",
90
+ pid: observed.pid
91
+ }, deadline);
70
92
  if (!command || pending) {
71
93
  const current = await readCodexAppServerProcess(observed.pid, deadline);
72
94
  if (!current || current.startedAt !== observed.startedAt || current.ppid !== observed.ppid || current.pgid !== observed.pgid || current.state.startsWith("Z")) throw new ProcessInspectionError("unavailable");
@@ -75,20 +97,26 @@ async function readCodexAppServerProcessCommand(observed, deadline) {
75
97
  pending = command.length === 0;
76
98
  if (pending) await setImmediate();
77
99
  } while (pending);
78
- } else output = (await readProcessOutput([
79
- "-o",
80
- "command=",
81
- "-p",
82
- String(observed.pid)
83
- ], deadline)).split("\n")[0]?.trim() ?? "";
100
+ } else output = (await readProcessOutput({
101
+ kind: "ps",
102
+ args: [
103
+ "-o",
104
+ "command=",
105
+ "-p",
106
+ String(observed.pid)
107
+ ]
108
+ }, deadline)).split("\n")[0]?.trim() ?? "";
84
109
  if (Date.now() >= deadline) throw new ProcessInspectionError("deadline");
85
110
  if (!output) throw new ProcessInspectionError("unavailable");
86
111
  return output;
87
112
  }
88
113
  async function readProcesses(args, deadline, selected = false) {
89
- return parseProcesses(await readProcessOutput(args, deadline), selected);
114
+ return parseProcesses(await readProcessOutput({
115
+ kind: "ps",
116
+ args
117
+ }, deadline), selected);
90
118
  }
91
- async function readProcessOutput(args, deadline) {
119
+ async function readProcessOutput(command, deadline) {
92
120
  const remainingMs = deadline - Date.now();
93
121
  if (remainingMs <= 0) throw new ProcessInspectionError("deadline");
94
122
  return await new Promise((resolve, reject) => {
@@ -100,16 +128,24 @@ async function readProcessOutput(args, deadline) {
100
128
  if (output instanceof ProcessInspectionError) reject(output);
101
129
  else resolve(output);
102
130
  };
103
- const inspector = execFile("ps", args, {
131
+ const procfs = command.kind === "procfs-command";
132
+ const inspector = execFile(procfs ? process.execPath : "ps", procfs ? [
133
+ ...process.versions.bun ? ["--no-env-file", "--config=/dev/null"] : [],
134
+ "-e",
135
+ PROCFS_COMMAND_READER,
136
+ String(command.pid),
137
+ String(PROCESS_INSPECTION_MAX_BYTES)
138
+ ] : command.args, {
104
139
  encoding: "utf8",
105
140
  maxBuffer: PROCESS_INSPECTION_MAX_BYTES,
106
- env: {
141
+ cwd: procfs ? "/" : void 0,
142
+ env: procfs ? {} : {
107
143
  ...process.env,
108
144
  LC_ALL: "C",
109
145
  TZ: "UTC"
110
146
  }
111
147
  }, (error, stdout) => {
112
- settle(Date.now() >= deadline ? new ProcessInspectionError("deadline") : error ? inspectionFailure(error) : stdout);
148
+ settle(Date.now() >= deadline ? new ProcessInspectionError("deadline") : error ? procfs && error.code === PROCFS_COMMAND_PERMISSION_EXIT ? new ProcessInspectionError("permission") : inspectionFailure(error) : stdout);
113
149
  });
114
150
  const timer = setTimeout(() => {
115
151
  settle(new ProcessInspectionError("deadline"));
@@ -154,6 +190,7 @@ function parseProcesses(output, selected) {
154
190
  return rows;
155
191
  }
156
192
  async function readLinuxProcesses(selected, deadline) {
193
+ if (selected !== void 0) return readSelectedLinuxProcesses(selected, deadline);
157
194
  const remainingMs = deadline - Date.now();
158
195
  if (remainingMs <= 0) throw new ProcessInspectionError("deadline");
159
196
  const options = {
@@ -161,9 +198,8 @@ async function readLinuxProcesses(selected, deadline) {
161
198
  signal: AbortSignal.timeout(remainingMs)
162
199
  };
163
200
  try {
164
- const bootId = (await readFile("/proc/sys/kernel/random/boot_id", options)).trim();
165
- if (!/^[a-f0-9-]{36}$/.test(bootId)) throw new ProcessInspectionError("unavailable");
166
- const pids = selected === void 0 ? await readdir("/proc") : selected.map(String);
201
+ const bootId = parseLinuxBootId(await readFile("/proc/sys/kernel/random/boot_id", options));
202
+ const pids = await readdir("/proc");
167
203
  const rows = [];
168
204
  let bytes = 0;
169
205
  for (const entry of pids) {
@@ -176,23 +212,81 @@ async function readLinuxProcesses(selected, deadline) {
176
212
  if (stat === void 0) continue;
177
213
  bytes += stat.length;
178
214
  if (bytes > PROCESS_INSPECTION_MAX_BYTES) throw new ProcessInspectionError("unavailable");
179
- const commEnd = stat.lastIndexOf(")");
180
- const fields = stat.slice(commEnd + 1).trim().split(/\s+/);
181
- const ppid = Number(fields[1]);
182
- const pgid = Number(fields[2]);
183
- const startTicks = fields[19];
184
- if (commEnd < 0 || ![ppid, pgid].every(Number.isSafeInteger) || selected !== void 0 && (pgid <= 0 || ppid < 0) || !/^\d+$/.test(startTicks ?? "")) throw new ProcessInspectionError("unavailable");
185
- if (pgid > 0) {
186
- const threads = Number(fields[17]);
187
- if (!/^[1-9]\d*$/.test(fields[17] ?? "") || !Number.isSafeInteger(threads)) throw new ProcessInspectionError("unavailable");
188
- rows.push({
189
- pid: Number(entry),
190
- ppid,
191
- pgid,
192
- state: `${fields[0]}${threads > 1 ? "l" : ""}`,
193
- startedAt: `${bootId}:${startTicks}`
194
- });
215
+ const row = parseLinuxProcess(stat, entry, bootId, false);
216
+ if (row) rows.push(row);
217
+ }
218
+ if (Date.now() >= deadline) throw new ProcessInspectionError("deadline");
219
+ return rows;
220
+ } catch (error) {
221
+ throw inspectionFailure(error);
222
+ }
223
+ }
224
+ function parseLinuxBootId(value) {
225
+ const bootId = value.trim();
226
+ if (!/^[a-f0-9-]{36}$/.test(bootId)) throw new ProcessInspectionError("unavailable");
227
+ return bootId;
228
+ }
229
+ function parseLinuxProcess(stat, entry, bootId, selected) {
230
+ const commEnd = stat.lastIndexOf(")");
231
+ const fields = stat.slice(commEnd + 1).trim().split(/\s+/);
232
+ const ppid = Number(fields[1]);
233
+ const pgid = Number(fields[2]);
234
+ const startTicks = fields[19];
235
+ if (commEnd < 0 || ![ppid, pgid].every(Number.isSafeInteger) || selected && (pgid <= 0 || ppid < 0) || !/^\d+$/.test(startTicks ?? "")) throw new ProcessInspectionError("unavailable");
236
+ if (pgid > 0) {
237
+ const threads = Number(fields[17]);
238
+ if (!/^[1-9]\d*$/.test(fields[17] ?? "") || !Number.isSafeInteger(threads)) throw new ProcessInspectionError("unavailable");
239
+ return {
240
+ pid: Number(entry),
241
+ ppid,
242
+ pgid,
243
+ state: `${fields[0]}${threads > 1 ? "l" : ""}`,
244
+ startedAt: `${bootId}:${startTicks}`
245
+ };
246
+ }
247
+ }
248
+ /** Known procfs identities must not queue behind unrelated libuv filesystem work. */
249
+ function readSelectedProcFile(file, deadline, maxBytes = PROCESS_INSPECTION_MAX_BYTES) {
250
+ if (Date.now() >= deadline) throw new ProcessInspectionError("deadline");
251
+ const fd = openSync(file, constants.O_RDONLY | constants.O_NONBLOCK);
252
+ const chunks = [];
253
+ const buffer = Buffer.alloc(Math.min(4096, maxBytes + 1));
254
+ let bytes = 0;
255
+ try {
256
+ for (;;) {
257
+ if (Date.now() >= deadline) throw new ProcessInspectionError("deadline");
258
+ const count = readSync(fd, buffer, {
259
+ offset: 0,
260
+ length: Math.min(buffer.length, maxBytes - bytes + 1),
261
+ position: null
262
+ });
263
+ if (Date.now() >= deadline) throw new ProcessInspectionError("deadline");
264
+ if (count === 0) return Buffer.concat(chunks, bytes);
265
+ bytes += count;
266
+ if (bytes > maxBytes) throw new ProcessInspectionError("unavailable");
267
+ chunks.push(Buffer.from(buffer.subarray(0, count)));
268
+ }
269
+ } finally {
270
+ closeSync(fd);
271
+ }
272
+ }
273
+ function readSelectedLinuxProcesses(selected, deadline) {
274
+ try {
275
+ const bootId = parseLinuxBootId(readSelectedProcFile("/proc/sys/kernel/random/boot_id", deadline).toString("utf8"));
276
+ const rows = [];
277
+ let bytes = 0;
278
+ for (const entry of selected.map(String)) {
279
+ if (!/^\d+$/.test(entry)) continue;
280
+ let stat;
281
+ try {
282
+ stat = readSelectedProcFile(`/proc/${entry}/stat`, deadline, PROCESS_INSPECTION_MAX_BYTES - bytes);
283
+ } catch (error) {
284
+ if (error && typeof error === "object" && "code" in error && (error.code === "ENOENT" || error.code === "ESRCH")) continue;
285
+ throw error;
195
286
  }
287
+ bytes += stat.length;
288
+ const row = parseLinuxProcess(stat.toString("utf8"), entry, bootId, true);
289
+ if (row) rows.push(row);
196
290
  }
197
291
  if (Date.now() >= deadline) throw new ProcessInspectionError("deadline");
198
292
  return rows;
@@ -665,7 +759,8 @@ const QA_PARENT_PID_ENV = "OPENCLAW_QA_PARENT_PID";
665
759
  const DEFAULT_SPAWN_RUNTIME = {
666
760
  platform: process.platform,
667
761
  env: process.env,
668
- execPath: process.execPath
762
+ execPath: process.execPath,
763
+ isBun: typeof process.versions.bun === "string"
669
764
  };
670
765
  /** Resolves the concrete command/argv/shell settings used to spawn Codex app-server. */
671
766
  function resolveCodexAppServerSpawnInvocation(options, runtime = DEFAULT_SPAWN_RUNTIME) {
@@ -679,6 +774,15 @@ function resolveCodexAppServerSpawnInvocation(options, runtime = DEFAULT_SPAWN_R
679
774
  });
680
775
  const args = normalizeCodexAppServerArgs(options.args);
681
776
  const resolved = materializeWindowsSpawnProgram(program, args);
777
+ if (runtime.isBun && options.commandSource === "resolved-managed" && resolved.resolution === "direct" && [
778
+ ".cjs",
779
+ ".js",
780
+ ".mjs"
781
+ ].includes(path.extname(resolved.command).toLowerCase())) return {
782
+ command: runtime.execPath,
783
+ args: [resolved.command, ...resolved.argv],
784
+ windowsHide: resolved.windowsHide
785
+ };
682
786
  return {
683
787
  command: resolved.command,
684
788
  args: resolved.argv,
@@ -727,7 +831,8 @@ async function createStdioTransport(options, baseEnv = process.env, assertCurren
727
831
  const invocation = resolveCodexAppServerSpawnInvocation(options, {
728
832
  platform: process.platform,
729
833
  env,
730
- execPath: process.execPath
834
+ execPath: process.execPath,
835
+ isBun: typeof process.versions.bun === "string"
731
836
  });
732
837
  const register = await prepareCodexAppServerProcessRegistration();
733
838
  assertCurrent?.();
@@ -1,29 +1,31 @@
1
- import { l as sessionBindingIdentity } from "./session-binding-record-Bcvslnhf.js";
2
- import { f as assertCodexModelBackedReviewerEffectiveConfig } from "./config-options-CXMq1T-C.js";
3
- import { a as flattenCodexDynamicToolFunctions, o as isJsonObject, x as readCodexPluginConfig } from "./protocol-5bh1G-H7.js";
4
- import { _ as assertCodexThreadAcceptsDirectInput, v as assertCodexThreadForkResponse } from "./client-B57KWPQx.js";
5
- import { n as withCodexAppServerThreadMutation } from "./incognito-session-uhrBF6wJ.js";
6
- import { i as readUpstreamUserText, r as readMirrorIdentity } from "./upstream-prompt-provenance-LphB8slG.js";
7
- import { i as projectCodexUserItemText } from "./transcript-history-projection-v17wXgdK.js";
8
- import { n as codexUpstreamBaseline, t as codexLastTerminalTurnId } from "./session-upstream-marker-D15C9NHp.js";
9
- import { r as buildCodexPluginAppCacheKey } from "./plugin-app-cache-key-d0eKxy7b.js";
10
- import { n as readCodexSessionMeta } from "./session-catalog-provenance-D-dIfRAH.js";
11
- import { t as CodexAppServerScopedRequestRejectedError } from "./request-B7hEkBGq.js";
12
- import { n as resolveOpenClawExecPolicyForCodexAppServer } from "./config-oIORaQ5T.js";
13
- import { r as resolveCodexSupervisionAppServerRuntimeOptions } from "./config-runtime-D0zGNIHu.js";
14
- import { a as fingerprintCodexMirrorSourceMessage, c as readCodexMirrorSourceFingerprint } from "./transcript-mirror-attestation-DibE0krH.js";
15
- import { L as claimCodexAppServerLiveThread, V as hasCodexAppServerLiveThread, f as readCodexAppServerClientDesktopGenerationFingerprint } from "./shared-client-CscigXXL.js";
16
- import { $ as codexDynamicToolsFingerprint, C as resolveCodexWebSearchPlan, Et as mergeCodexThreadConfigs, G as checkCodexThreadAppAvailability, H as resolveCodexNativeHookRelayEvents, I as assertCodexNativeHookRelayAllowed, L as buildCodexNativeHookRelayConfig, Ot as shouldBuildCodexPluginThreadConfig, St as buildCodexPluginThreadConfig, X as applyCodexNativeSkillIsolation, Y as parseCodexNativeToolCatalog, Z as resolveCodexNativeSkillIsolation, b as buildCodexThreadConfiguration, nt as fingerprintUserMcpServersConfigPatch, tt as fingerprintJsonObject, w as buildDeveloperInstructions, z as buildCodexNativeHookRelayId } from "./thread-lifecycle-DXl1-I6b.js";
17
- import "./session-binding-CI8UuilT.js";
18
- import { i as refreshCodexThreadPolicy, n as CodexThreadPolicyHandoffError } from "./thread-policy-BuEQfE0g.js";
19
- import "./thread-ownership-BsDRTsyp.js";
20
- import { n as resolveCodexNativeExecutionPolicy } from "./native-execution-policy-umd0tgh4.js";
21
- import { l as isCodexDynamicToolExcluded, n as resolveCodexProviderWebSearchSupportForClient } from "./provider-capabilities-BvCUL69A.js";
22
- import { o as prepareCodexWorkspaceDeveloperInstructions } from "./attempt-context-D44yeDII.js";
23
- import { n as prepareCodexSessionInitialization } from "./session-initialization-Ct0_Hzmg.js";
24
- import { createImportedCodexSession } from "./session-history-import-DwyijFI6.js";
1
+ import { p as sessionBindingIdentity } from "./session-binding-record-TH3xA0zj.mjs";
2
+ import { m as isJsonObject, p as flattenCodexDynamicToolFunctions } from "./config-security-BRQ2mgW9.mjs";
3
+ import { d as readCodexPluginConfig } from "./config-parsing-CcB9iPoq.mjs";
4
+ import { _ as assertCodexThreadAcceptsDirectInput, v as assertCodexThreadForkResponse } from "./client-vXs2929Q.mjs";
5
+ import { s as assertCodexModelBackedReviewerEffectiveConfig } from "./config-options-BsanJ8QG.mjs";
6
+ import { n as withCodexAppServerThreadMutation } from "./incognito-session-uhrBF6wJ.mjs";
7
+ import { i as readUpstreamUserText, r as readMirrorIdentity } from "./upstream-prompt-provenance-LphB8slG.mjs";
8
+ import { i as projectCodexUserItemText } from "./transcript-history-projection-DHNBDhCU.mjs";
9
+ import { n as codexUpstreamBaseline, t as codexLastTerminalTurnId } from "./session-upstream-marker-D15C9NHp.mjs";
10
+ import { r as buildCodexPluginAppCacheKey } from "./plugin-app-cache-key-BOxKP7db.mjs";
11
+ import { c as readCodexSessionMeta } from "./session-catalog-events-jMcYfQyd.mjs";
12
+ import { t as CodexAppServerScopedRequestRejectedError } from "./request-BioXJLYa.mjs";
13
+ import { n as resolveOpenClawExecPolicyForCodexAppServer } from "./config-CedDWjM-.mjs";
14
+ import { r as resolveCodexSupervisionAppServerRuntimeOptions } from "./config-runtime-CeAhl_h4.mjs";
15
+ import { a as fingerprintCodexMirrorSourceMessage, c as readCodexMirrorSourceFingerprint } from "./transcript-mirror-attestation-CzM-94NC.mjs";
16
+ import { I as hasCodexAppServerLiveThread, M as claimCodexAppServerLiveThread, f as readCodexAppServerClientDesktopGenerationFingerprint } from "./shared-client-BpTtuLQ5.mjs";
17
+ import { At as shouldBuildCodexPluginThreadConfig, B as buildCodexNativeHookRelayId, K as checkCodexThreadAppAvailability, L as assertCodexNativeHookRelayAllowed, Ot as mergeCodexThreadConfigs, Q as resolveCodexNativeSkillIsolation, R as buildCodexNativeHookRelayConfig, T as buildDeveloperInstructions, U as resolveCodexNativeHookRelayEvents, X as parseCodexNativeToolCatalog, Z as applyCodexNativeSkillIsolation, et as codexDynamicToolsFingerprint, nt as fingerprintJsonObject, rt as fingerprintUserMcpServersConfigPatch, w as resolveCodexWebSearchPlan, wt as buildCodexPluginThreadConfig, x as buildCodexThreadConfiguration } from "./thread-lifecycle-Cik28qWn.mjs";
18
+ import "./session-binding-_0W_fHRr.mjs";
19
+ import { i as refreshCodexThreadPolicy, n as CodexThreadPolicyHandoffError } from "./thread-policy-Cjs4B8xf.mjs";
20
+ import "./thread-ownership-skomxnIt.mjs";
21
+ import { n as resolveCodexNativeExecutionPolicy } from "./native-execution-policy-YBMHSzC4.mjs";
22
+ import { l as isCodexDynamicToolExcluded, n as resolveCodexProviderWebSearchSupportForClient } from "./provider-capabilities-B8J4Dy-O.mjs";
23
+ import { o as prepareCodexWorkspaceDeveloperInstructions } from "./attempt-context-VXVwTCfS.mjs";
24
+ import { n as prepareCodexSessionInitialization } from "./session-initialization-DH1z6fXn.mjs";
25
+ import { createImportedCodexSession } from "./session-history-import-JHXT5Xfi.mjs";
25
26
  import { isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
26
27
  import { randomUUID } from "node:crypto";
28
+ import { isDeepStrictEqual } from "node:util";
27
29
  import path from "node:path";
28
30
  import { lstat } from "node:fs/promises";
29
31
  import { constants, createZstdDecompress } from "node:zlib";
@@ -31,7 +33,6 @@ import { root } from "openclaw/plugin-sdk/file-access-runtime";
31
33
  import { resolveAgentWorkspaceDir } from "openclaw/plugin-sdk/agent-runtime";
32
34
  import { loadCodexBundleMcpThreadConfig } from "openclaw/plugin-sdk/agent-harness-runtime";
33
35
  import { loadExecApprovals } from "openclaw/plugin-sdk/exec-approvals-runtime";
34
- import { isDeepStrictEqual } from "node:util";
35
36
  import { resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
36
37
  import { buildCodexUserMcpServersThreadConfigPatchForRuntime, resolveCodexMcpToolOverridesForAgent } from "openclaw/plugin-sdk/codex-mcp-projection";
37
38
  import { buildNativeHookRelayCommandPlan } from "openclaw/plugin-sdk/native-hook-relay-runtime";
@@ -731,7 +732,7 @@ function readConnectionFingerprint(ref) {
731
732
  async function forkCodexUpstreamSession(params, options) {
732
733
  try {
733
734
  const sourceFingerprint = params.upstream.kind === "codex-app-server" ? readConnectionFingerprint(params.upstream.ref) : void 0;
734
- const requestControl = sourceFingerprint ? options.controlFactory.forUpstream(params.source.agentId, sourceFingerprint) : void 0;
735
+ const requestControl = sourceFingerprint ? await options.controlFactory.forUpstream(params.source.agentId, sourceFingerprint) : void 0;
735
736
  if (!sourceFingerprint || !requestControl) return {
736
737
  status: "failed",
737
738
  code: "upstream-unavailable",
@@ -1,7 +1,7 @@
1
- import { t as buildCodexAppServerUsageSnapshot } from "./rate-limits-CBMmWBr9.js";
2
- import { n as readCodexAppServerUsage } from "./request-B7hEkBGq.js";
3
- import "./config-oIORaQ5T.js";
4
- import { n as resolveCodexAppServerRuntimeOptions } from "./config-runtime-D0zGNIHu.js";
1
+ import { t as buildCodexAppServerUsageSnapshot } from "./rate-limits-DOEGYRNs.mjs";
2
+ import { n as readCodexAppServerUsage } from "./request-BioXJLYa.mjs";
3
+ import "./config-CedDWjM-.mjs";
4
+ import { n as resolveCodexAppServerRuntimeOptions } from "./config-runtime-CeAhl_h4.mjs";
5
5
  import { CODEX_APP_SERVER_AUTH_MARKER } from "openclaw/plugin-sdk/agent-runtime";
6
6
  //#region extensions/codex/src/app-server/usage.ts
7
7
  /** Handles the synthetic usage credential for a Codex-backed OpenAI route. */