@openclaw/codex 2026.9.5 → 2026.9.7

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 (174) hide show
  1. package/README.md +2 -0
  2. package/assets/icon.png +0 -0
  3. package/dist/.setup/{account-usage-runtime-C2MOIvfq.mjs → account-usage-runtime-DFhbh1zz.mjs} +6 -6
  4. package/dist/.setup/{apply-CJ0ZfmBG.mjs → apply-D3GcSoSa.mjs} +35 -55
  5. package/dist/.setup/{attempt-client-cleanup-BpYKdTA0.mjs → attempt-client-cleanup-DOP-cW5j.mjs} +179 -73
  6. package/dist/.setup/attempt-workspace-context-C5HigshI.mjs +164 -0
  7. package/dist/.setup/{auth-binding-DhLWa_7K.mjs → auth-binding-BLWz7stm.mjs} +14 -1
  8. package/dist/.setup/{auth-cache-key-QirmgiCo.mjs → auth-cache-key-Dbvq-QgB.mjs} +41 -111
  9. package/dist/.setup/{auth-profile-WqZtZfXN.mjs → auth-profile-B0okYl2D.mjs} +1 -2
  10. package/dist/.setup/auth-profile-health-oHizqgye.mjs +53 -0
  11. package/dist/.setup/auth-profile-recovery-BREezV0L.mjs +14 -0
  12. package/dist/.setup/auth-start-options-BPIPeEX8.mjs +44 -0
  13. package/dist/.setup/{binding-connection-Bm38niE8.mjs → binding-connection-DTtN1KrX.mjs} +2 -2
  14. package/dist/.setup/{binding-connection.runtime-CnRMC0ta.mjs → binding-connection.runtime-6TpgD1M6.mjs} +5 -5
  15. package/dist/.setup/{bounded-turn-BtlZcivC.mjs → bounded-turn-CbjoN2OW.mjs} +140 -37
  16. package/dist/.setup/bounded-turn-isolation-B8K_ylqk.mjs +14 -0
  17. package/dist/.setup/{build-state-Xx9ybZqa.mjs → build-state-Da1_z0kd.mjs} +1 -1
  18. package/dist/.setup/{capabilities-_vXcZGSx.mjs → capabilities-B3WEZl4e.mjs} +2 -10
  19. package/dist/.setup/{client-vXs2929Q.mjs → client-N0JpgSzF.mjs} +635 -872
  20. package/dist/.setup/client-catalog-response-5HHLdcde.mjs +285 -0
  21. package/dist/.setup/{command-dispatch-naHIZwwF.mjs → command-dispatch-BeAoaovI.mjs} +9 -8
  22. package/dist/.setup/{command-formatters-CGEkdawF.mjs → command-formatters-R3ckE3Co.mjs} +36 -64
  23. package/dist/.setup/{command-handlers-BtAJEW1X.mjs → command-handlers-ylTMS00z.mjs} +301 -488
  24. package/dist/.setup/{command-rpc-DHFpn4le.mjs → command-rpc-CGJGUQ6Y.mjs} +40 -28
  25. package/dist/.setup/compact-C2WamavS.mjs +776 -0
  26. package/dist/.setup/{config-CedDWjM-.mjs → config-DKhXquav.mjs} +26 -28
  27. package/dist/.setup/{config-options-BsanJ8QG.mjs → config-options-CzyWLTJt.mjs} +68 -65
  28. package/dist/.setup/{config-parsing-CcB9iPoq.mjs → config-parsing-b088LyhT.mjs} +57 -60
  29. package/dist/.setup/{config-runtime-CeAhl_h4.mjs → config-runtime-C0NbLms1.mjs} +2 -2
  30. package/dist/.setup/{config-security-BRQ2mgW9.mjs → config-security-CE-FcGw9.mjs} +51 -215
  31. package/dist/.setup/{config-utils-DujwEnhg.mjs → config-utils-D0CXecki.mjs} +3 -13
  32. package/dist/.setup/context-engine-projection-PezSESth.mjs +387 -0
  33. package/dist/.setup/{conversation-binding-DhzrpTM6.mjs → conversation-binding-3Min8qvP.mjs} +71 -105
  34. package/dist/.setup/{conversation-binding-data-CrcyZk6O.mjs → conversation-binding-data-C746z5Pn.mjs} +8 -12
  35. package/dist/.setup/{conversation-control-DN53ns41.mjs → conversation-control-CEP8X5JC.mjs} +30 -69
  36. package/dist/.setup/{cyber-failover-DYwbmf1o.mjs → cyber-failover-XV0nNRZu.mjs} +1 -1
  37. package/dist/.setup/{cyber-failover-notice-e9G3J9-e.mjs → cyber-failover-notice-RNpGpTyP.mjs} +1 -1
  38. package/dist/.setup/{dynamic-tools-D16lOp67.mjs → dynamic-tools-DzlsLUuS.mjs} +3136 -3167
  39. package/dist/.setup/{effective-mcp-catalog-K6kLCN8X.mjs → effective-mcp-catalog-CxUtC-xG.mjs} +8 -17
  40. package/dist/.setup/{ephemeral-turn-R1gA8Sn6.mjs → ephemeral-turn-CDsPJOa2.mjs} +9 -6
  41. package/dist/.setup/event-projector-assistant-message-CigreO4K.mjs +69 -0
  42. package/dist/.setup/{event-projector-usage-C7Ntzs-f.mjs → event-projector-usage-03R0I2dM.mjs} +4 -26
  43. package/dist/.setup/event-projector-values-DJSz8BTk.mjs +106 -0
  44. package/dist/.setup/incognito-session-DWYapfwf.mjs +2 -0
  45. package/dist/.setup/{inference-context-fulhZuz8.mjs → inference-context-D-9gWlTR.mjs} +16 -18
  46. package/dist/.setup/inference-dispatch-CMZtjQyz.mjs +359 -0
  47. package/dist/.setup/inference-metadata-CgIf7sOx.mjs +81 -0
  48. package/dist/.setup/inference-proxy-DhcXOgUE.mjs +561 -0
  49. package/dist/.setup/{isolated-completion-B6srt48J.mjs → isolated-completion-Dm3PzxJk.mjs} +15 -11
  50. package/dist/.setup/launch-args-DbFCehO7.mjs +196 -0
  51. package/dist/.setup/{managed-binary-DP6Rib3P.mjs → managed-binary-kiWRhNRE.mjs} +16 -9
  52. package/dist/.setup/{model-catalog-DkvUuBey.mjs → model-catalog-PAuZgJC6.mjs} +14 -14
  53. package/dist/.setup/model-runtime-BdqzOMkU.mjs +11 -0
  54. package/dist/.setup/{models-BDFgm_G-.mjs → models-DHXZtVVk.mjs} +9 -18
  55. package/dist/.setup/{native-auth-BLZGqFjw.mjs → native-auth-CuG53tu4.mjs} +5 -5
  56. package/dist/.setup/{native-execution-policy-YBMHSzC4.mjs → native-execution-policy-BxZJy5mP.mjs} +6 -31
  57. package/dist/.setup/{native-subagent-monitor-B1hxzIOy.mjs → native-subagent-monitor-Dpsmf2wz.mjs} +4422 -3808
  58. package/dist/.setup/native-subagent-pending-assignments-DwkCzLvD.mjs +203 -0
  59. package/dist/.setup/native-task-assignments-DMQ0g3hu.mjs +194 -0
  60. package/dist/.setup/{node-cli-sessions-Cl8b2ZF3.mjs → node-cli-sessions-HC4W6FLI.mjs} +99 -111
  61. package/dist/.setup/node-exec-server.runtime-BgBfWQqo.mjs +244 -0
  62. package/dist/.setup/{plan-xD7WKYTM.mjs → plan-Y-QIvrKB.mjs} +118 -163
  63. package/dist/.setup/{plugin-activation-r8nq5Jzp.mjs → plugin-activation-cNHRfaxU.mjs} +10 -47
  64. package/dist/.setup/{plugin-app-cache-key-BOxKP7db.mjs → plugin-app-cache-key-BL9B5H0L.mjs} +9 -42
  65. package/dist/.setup/{plugin-inventory-DUle8DLz.mjs → plugin-inventory-Cky2XJUw.mjs} +32 -23
  66. package/dist/.setup/{plugin-marketplace-discovery-P-Vndfqq.mjs → plugin-marketplace-discovery-D_dV9FXa.mjs} +22 -25
  67. package/dist/.setup/{plugin-metadata-cache-DsS5buNa.mjs → plugin-metadata-cache-DsjsL1dr.mjs} +328 -318
  68. package/dist/.setup/protocol-CANUwXJ3.mjs +17 -0
  69. package/dist/.setup/provider-DH8NSzGt.mjs +51 -0
  70. package/dist/.setup/{provider-capabilities-B8J4Dy-O.mjs → provider-capabilities-CAxoF-X1.mjs} +35 -12
  71. package/dist/.setup/{rate-limits-DOEGYRNs.mjs → rate-limits-B7-X2TgG.mjs} +123 -166
  72. package/dist/.setup/{request-BioXJLYa.mjs → request-BHZ1nz8d.mjs} +25 -16
  73. package/dist/.setup/responses-oauth-twnuTaAa.mjs +93 -0
  74. package/dist/.setup/rpc-error-BlD2vuzn.mjs +31 -0
  75. package/dist/.setup/{run-attempt-rlA07pUv.mjs → run-attempt-D8RZUOzY.mjs} +2046 -1454
  76. package/dist/.setup/{run-attempt-lifecycle-B7JbY4-F.mjs → run-attempt-lifecycle-C-6O3Exn.mjs} +10 -24
  77. package/dist/.setup/{runtime-artifact-Dy38Z5iU.mjs → runtime-artifact-DDQ-HGXf.mjs} +43 -47
  78. package/dist/.setup/runtime-artifact-connection-D68qQn1m.mjs +78 -0
  79. package/dist/.setup/sandbox-guard-DjCz2eOw.mjs +126 -0
  80. package/dist/.setup/scope-DOC1Xjc8.mjs +6 -0
  81. package/dist/.setup/session-binding-DGCYAfvD.mjs +443 -0
  82. package/dist/.setup/{session-binding-record-TH3xA0zj.mjs → session-binding-record-Oe9L-CNY.mjs} +73 -132
  83. package/dist/.setup/{session-binding-sidecars-CKYEcfNn.mjs → session-binding-sidecars-jo6H8dFr.mjs} +242 -60
  84. package/dist/.setup/{session-catalog-fUdWDx-U.mjs → session-catalog-4sCdv5qx.mjs} +598 -452
  85. package/dist/.setup/{session-catalog-adoption-CR_whkEW.mjs → session-catalog-adoption-BU_pHWG7.mjs} +59 -26
  86. package/dist/.setup/{session-catalog-archive-CwZaPacf.mjs → session-catalog-archive-spHfihri.mjs} +7 -7
  87. package/dist/.setup/session-catalog-events-DePDzzjc.mjs +139 -0
  88. package/dist/.setup/session-catalog-home-id-vlih0B_g.mjs +22 -0
  89. package/dist/.setup/{session-catalog-index-B141u15s.mjs → session-catalog-index-CZvDzC6z.mjs} +286 -182
  90. package/dist/.setup/{session-catalog-index-order-Cc5BzlQr.mjs → session-catalog-index-order-BcQpHks3.mjs} +2 -2
  91. package/dist/.setup/{session-catalog-index-state-BAuDztHN.mjs → session-catalog-index-state-TeO7EyO-.mjs} +6 -2
  92. package/dist/.setup/session-catalog-limits-DDxOsQeC.mjs +14 -0
  93. package/dist/.setup/session-catalog-list-request-CvtxrYSe.mjs +170 -0
  94. package/dist/.setup/session-catalog-native-projection-DjhwGL6x.mjs +178 -0
  95. package/dist/.setup/{session-catalog-node-adoption-BVRsYOSh.mjs → session-catalog-node-adoption-DgXvSGu0.mjs} +30 -35
  96. package/dist/.setup/{session-catalog-node-continue-Dowv8osw.mjs → session-catalog-node-continue-DjKXHBbi.mjs} +25 -18
  97. package/dist/.setup/session-catalog-node-lookup-CtAXI5W5.mjs +56 -0
  98. package/dist/.setup/{session-catalog-native-projection-ChV3cCtm.mjs → session-catalog-parsing-CPGaPYr-.mjs} +14 -180
  99. package/dist/.setup/{session-catalog-projection-C1Bj9Jl-.mjs → session-catalog-projection-Cr5qP5Dj.mjs} +15 -5
  100. package/dist/.setup/session-catalog-provenance-DoAvktcj.mjs +95 -0
  101. package/dist/.setup/{session-cli-DIj-IE-E.mjs → session-cli-Cn_nCqfq.mjs} +11 -24
  102. package/dist/.setup/{session-history-C--SrLI8.mjs → session-history-D83lJWHG.mjs} +16 -23
  103. package/dist/.setup/{session-history-import-JHXT5Xfi.mjs → session-history-import-WhX-X33a.mjs} +7 -10
  104. package/dist/.setup/session-history-read-Ov3StuL4.mjs +133 -0
  105. package/dist/.setup/{session-history.worker-CpNj7H_P.mjs → session-history.worker-MnPKncqP.mjs} +14 -23
  106. package/dist/.setup/session-initialization-6aveB9qb.mjs +22 -0
  107. package/dist/.setup/{session-permission-policy-DhurXY0l.mjs → session-permission-policy-Ci_fVX6y.mjs} +4 -8
  108. package/dist/.setup/{session-retirement-CU87AOg9.mjs → session-retirement-qMTxkNx2.mjs} +31 -12
  109. package/dist/.setup/{settled-turn-context-fmwouT5I.mjs → settled-turn-context-D4yj4rxf.mjs} +1 -1
  110. package/dist/.setup/{settled-turn-finalizer-CiY2bLFK.mjs → settled-turn-finalizer-BsvEabkw.mjs} +17 -13
  111. package/dist/.setup/{shared-client-BpTtuLQ5.mjs → shared-client-DqyTMYug.mjs} +826 -485
  112. package/dist/.setup/shared-client-lifecycle-DJIgqgMw.mjs +153 -0
  113. package/dist/.setup/{side-question-DSCZyoBD.mjs → side-question-C4kCmQy1.mjs} +206 -334
  114. package/dist/.setup/{source-Bjp4UQij.mjs → source-CS_7GFJZ.mjs} +82 -139
  115. package/dist/.setup/spawn-error-CL3n6MAa.mjs +57 -0
  116. package/dist/.setup/{thread-archive-guard-jmecf6OJ.mjs → thread-archive-guard-C9frICzX.mjs} +10 -3
  117. package/dist/.setup/thread-lifecycle-DPflntEJ.mjs +2362 -0
  118. package/dist/.setup/{incognito-session-uhrBF6wJ.mjs → thread-ownership-queue-Dp24d7-F.mjs} +1 -2
  119. package/dist/.setup/{thread-ownership-skomxnIt.mjs → thread-ownership-roNP0l1c.mjs} +47 -10
  120. package/dist/.setup/thread-policy-DTd-DtkX.mjs +109 -0
  121. package/dist/.setup/thread-requests-B_bRnMGN.mjs +2102 -0
  122. package/dist/.setup/{thread-resume-BkNpj9Pz.mjs → thread-resume-CdDaoc7T.mjs} +6 -6
  123. package/dist/.setup/timeout-CXOfNoaX.mjs +46 -0
  124. package/dist/.setup/transcript-history-projection-DRSifI-1.mjs +201 -0
  125. package/dist/.setup/{transcript-mirror-attestation-CzM-94NC.mjs → transcript-mirror-attestation-YSegaktH.mjs} +3 -4
  126. package/dist/.setup/{transcript-mirror-D4qp_leP.mjs → transcript-mirror-kxmCYsuF.mjs} +224 -206
  127. package/dist/.setup/{transport-stdio-Cmx94Oiy.mjs → transport-stdio-Bdegpn2V.mjs} +138 -75
  128. package/dist/.setup/transport-websocket-BTBE-LD9.mjs +211 -0
  129. package/dist/.setup/{upstream-prompt-provenance-LphB8slG.mjs → upstream-prompt-provenance-fXkKbPVC.mjs} +3 -9
  130. package/dist/.setup/{upstream-session-fork-D3UKxgVD.mjs → upstream-session-fork-CBeVjBpT.mjs} +48 -40
  131. package/dist/.setup/{usage-BOgBEKso.mjs → usage-BMzNxeR_.mjs} +5 -4
  132. package/dist/.setup/{usage-limit-error-C0ow7DOc.mjs → usage-limit-error-QXerDo3i.mjs} +5 -20
  133. package/dist/.setup/{web-search-provider.runtime-CTGuJt6i.mjs → web-search-provider.runtime-P77OUeoo.mjs} +10 -20
  134. package/dist/api.js +25 -16
  135. package/dist/catalog-page-worker-entrypoint.js +12 -0
  136. package/dist/catalog-page.worker.js +9 -0
  137. package/dist/cli-metadata.js +1 -1
  138. package/dist/doctor-contract-api.js +50 -8
  139. package/dist/harness.js +344 -1
  140. package/dist/index.js +345 -346
  141. package/dist/media-understanding-provider.js +9 -22
  142. package/dist/migration-provider-api.js +1 -1
  143. package/dist/provider-discovery.js +1 -1
  144. package/dist/session-history-worker-runtime.js +16 -33
  145. package/dist/session-history.worker.js +1 -1
  146. package/openclaw.plugin.json +14 -2
  147. package/package.json +11 -7
  148. package/dist/.setup/attempt-context-VXVwTCfS.mjs +0 -636
  149. package/dist/.setup/compact-C3i3qlzj.mjs +0 -687
  150. package/dist/.setup/event-projector-assistant-message-DNUR1s0A.mjs +0 -105
  151. package/dist/.setup/event-projector-items-DyTQ_XqL.mjs +0 -200
  152. package/dist/.setup/harness-rxaaoN-o.mjs +0 -349
  153. package/dist/.setup/history-rejection-B4nOXNXF.mjs +0 -13
  154. package/dist/.setup/image-payload-sanitizer-tupAr-2o.mjs +0 -79
  155. package/dist/.setup/inference-proxy-CC15HuSi.mjs +0 -311
  156. package/dist/.setup/launch-args-DnMak49W.mjs +0 -111
  157. package/dist/.setup/local-runtime-attribution-B_2mnqhb.mjs +0 -19
  158. package/dist/.setup/native-subagent-history-YXaL6dMd.mjs +0 -135
  159. package/dist/.setup/native-subagent-task-ids-DsuOonKv.mjs +0 -411
  160. package/dist/.setup/node-exec-server.runtime-BaViBKNz.mjs +0 -226
  161. package/dist/.setup/plugin-approval-roundtrip-CjfzafAZ.mjs +0 -122
  162. package/dist/.setup/provider-fFh_-VR3.mjs +0 -50
  163. package/dist/.setup/rolldown-runtime-8H4AJuhK.mjs +0 -14
  164. package/dist/.setup/sandbox-guard-BBP-RbTf.mjs +0 -166
  165. package/dist/.setup/session-binding-_0W_fHRr.mjs +0 -721
  166. package/dist/.setup/session-catalog-events-jMcYfQyd.mjs +0 -250
  167. package/dist/.setup/session-history-read-B3ZfSUbF.mjs +0 -50
  168. package/dist/.setup/session-initialization-DH1z6fXn.mjs +0 -75
  169. package/dist/.setup/thread-history-page-BTx-4xsg.mjs +0 -83
  170. package/dist/.setup/thread-lifecycle-Cik28qWn.mjs +0 -4904
  171. package/dist/.setup/thread-policy-Cjs4B8xf.mjs +0 -54
  172. package/dist/.setup/timeout-DZF05XrR.mjs +0 -63
  173. package/dist/.setup/transcript-history-projection-DHNBDhCU.mjs +0 -243
  174. package/dist/.setup/version-CoqzXPgK.mjs +0 -12
@@ -1,636 +0,0 @@
1
- import { m as isJsonObject, p as flattenCodexDynamicToolFunctions } from "./config-security-BRQ2mgW9.mjs";
2
- import { t as readCodexMirroredSessionHistoryMessages } from "./session-history-C--SrLI8.mjs";
3
- import { $ as areCodexDynamicToolFingerprintsCompatible, pt as isContextEngineBindingCompatible, st as isMessageOnlyCodexSourceReply } from "./thread-lifecycle-Cik28qWn.mjs";
4
- import { readNonBlankString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
- import { createHash } from "node:crypto";
6
- import path from "node:path";
7
- import { resolveAgentWorkspaceDir } from "openclaw/plugin-sdk/agent-runtime";
8
- import { buildBootstrapContextForFiles, buildWatchedSessionsHarnessContext, embeddedAgentLog, resolveBootstrapFilesForRun } from "openclaw/plugin-sdk/agent-harness-runtime";
9
- import { resolveBootstrapFilesForPreparation } from "openclaw/plugin-sdk/codex-mcp-projection";
10
- import { prepareMemorySystemPromptAddition } from "openclaw/plugin-sdk/core";
11
- import { MESSAGE_TOOL_DELIVERY_HINTS } from "openclaw/plugin-sdk/message-tool-delivery-hints";
12
- //#region extensions/codex/src/app-server/attempt-context.ts
13
- /**
14
- * Builds Codex app-server prompt context, workspace bootstrap injections,
15
- * system-prompt reports, and context-engine projection decisions.
16
- */
17
- const CODEX_NATIVE_PROJECT_DOC_BASENAMES = /* @__PURE__ */ new Set(["agents.md"]);
18
- const CODEX_TURN_SCOPED_WORKSPACE_DEVELOPER_CONTEXT_BASENAMES = /* @__PURE__ */ new Set([
19
- "identity.md",
20
- "soul.md",
21
- "user.md"
22
- ]);
23
- const CODEX_WORKSPACE_DEVELOPER_CONTEXT_BASENAMES = new Set(CODEX_TURN_SCOPED_WORKSPACE_DEVELOPER_CONTEXT_BASENAMES);
24
- const CODEX_MEMORY_CONTEXT_BASENAME = "memory.md";
25
- const CODEX_MEMORY_TOOL_NAMES = /* @__PURE__ */ new Set(["memory_search", "memory_get"]);
26
- const CODEX_BOOTSTRAP_CONTEXT_ORDER = /* @__PURE__ */ new Map([
27
- ["soul.md", 10],
28
- ["identity.md", 20],
29
- ["user.md", 30],
30
- ["bootstrap.md", 50],
31
- ["memory.md", 60]
32
- ]);
33
- /** Reads mirrored Codex session history for harness hooks. */
34
- async function readMirroredSessionHistoryMessages(params) {
35
- const { admission, signal, contextTokenBudget, ...target } = params;
36
- const messages = await readCodexMirroredSessionHistoryMessages(target, admission, "model-context", signal, contextTokenBudget);
37
- if (!messages) embeddedAgentLog.warn("failed to read mirrored session history for codex harness hooks", { sessionFile: params.sessionFile });
38
- return messages;
39
- }
40
- /** Reads a valid thread-bootstrap projection request from context-engine output. */
41
- function readContextEngineThreadBootstrapProjection(projection) {
42
- if (projection?.mode !== "thread_bootstrap") return;
43
- const epoch = projection.epoch?.trim();
44
- if (!epoch) {
45
- embeddedAgentLog.warn("context engine requested Codex thread-bootstrap projection without an epoch; using per-turn projection");
46
- return;
47
- }
48
- const fingerprint = projection.fingerprint?.trim();
49
- return {
50
- mode: "thread_bootstrap",
51
- epoch,
52
- ...fingerprint ? { fingerprint } : {}
53
- };
54
- }
55
- /**
56
- * Decides whether an existing Codex thread can reuse its context-engine
57
- * bootstrap projection or must be reprojected.
58
- */
59
- function resolveContextEngineBootstrapProjectionDecision(params) {
60
- const bindingProjection = params.startupBinding?.contextEngine?.projection;
61
- if (!params.startupBinding?.threadId || !bindingProjection) return {
62
- project: true,
63
- reason: !params.startupBinding?.threadId ? "missing-thread-binding" : "missing-projection-binding"
64
- };
65
- if (!params.expectedBinding || !isContextEngineBindingCompatible(params.startupBinding.contextEngine, params.expectedBinding)) return {
66
- project: true,
67
- reason: "context-engine-binding-mismatch"
68
- };
69
- if (!areCodexDynamicToolFingerprintsCompatible({
70
- previous: params.startupBinding.dynamicToolsFingerprint,
71
- next: params.dynamicToolsFingerprint,
72
- nextLegacy: params.legacyDynamicToolsFingerprint
73
- })) return {
74
- project: true,
75
- reason: "dynamic-tools-mismatch"
76
- };
77
- return bindingProjection.mode !== "thread_bootstrap" || bindingProjection.epoch !== params.projection.epoch || bindingProjection.fingerprint !== params.projection.fingerprint ? {
78
- project: true,
79
- reason: "projection-mismatch"
80
- } : {
81
- project: false,
82
- reason: "matching-thread-bootstrap-binding"
83
- };
84
- }
85
- /**
86
- * Loads workspace bootstrap files and partitions them into Codex-native prompt,
87
- * developer-instruction, heartbeat, and memory-tool contexts.
88
- */
89
- /** A child baseline reads the bounded workspace snapshot without invoking admission hooks. */
90
- async function prepareCodexWorkspaceDeveloperInstructions(params) {
91
- if (isSameCodexWorkspacePath(params.workspaceDir, params.cwd)) return;
92
- const files = await resolveBootstrapFilesForPreparation(params);
93
- return renderCodexWorkspaceDeveloperInstructions({
94
- files: selectCodexWorkspaceAgentProjectInstructionFiles(buildBootstrapContextForFiles(files, {
95
- config: params.config,
96
- agentId: params.agentId
97
- }), params.workspaceDir),
98
- header: "## OpenClaw Agent Workspace Instructions",
99
- preamble: "OpenClaw loaded this bounded snapshot from the configured agent workspace."
100
- });
101
- }
102
- async function buildCodexWorkspaceBootstrapContext(params) {
103
- try {
104
- const inheritsAgentWorkspace = (params.executionWorkspace ?? params.resolvedWorkspace) !== params.resolvedWorkspace;
105
- const promptWorkspace = inheritsAgentWorkspace ? params.resolvedWorkspace : params.effectiveWorkspace;
106
- const memoryToolsAvailable = params.memoryToolNames.length > 0 && canRouteCodexWorkspaceMemoryThroughTools({
107
- config: params.params.config,
108
- agentId: params.params.agentId ?? params.sessionAgentId,
109
- workspaceDir: inheritsAgentWorkspace ? params.resolvedWorkspace : params.effectiveWorkspace
110
- });
111
- const bootstrapFiles = await resolveBootstrapFilesForRun({
112
- workspaceDir: params.resolvedWorkspace,
113
- config: params.params.config,
114
- sessionKey: params.sessionKey,
115
- sessionId: params.params.sessionId,
116
- chatType: params.params.chatType,
117
- agentId: params.params.agentId ?? params.sessionAgentId,
118
- warn: (message) => embeddedAgentLog.warn(message),
119
- contextMode: params.params.bootstrapContextMode,
120
- runKind: params.params.bootstrapContextRunKind
121
- });
122
- const memoryToolRoutedBootstrapFiles = memoryToolsAvailable ? selectCodexWorkspaceMemoryReferenceFiles({
123
- bootstrapFiles,
124
- workspaceDir: params.resolvedWorkspace
125
- }) : [];
126
- const memoryReferenceFiles = memoryToolRoutedBootstrapFiles.map((file) => remapCodexContextFilePath({
127
- file: toCodexEmbeddedContextFile(file),
128
- sourceWorkspaceDir: params.resolvedWorkspace,
129
- targetWorkspaceDir: promptWorkspace
130
- }));
131
- const contextFiles = buildBootstrapContextForFiles(memoryToolsAvailable ? bootstrapFiles.filter((file) => !isCodexWorkspaceRootMemoryBootstrapFile({
132
- file,
133
- workspaceDir: params.resolvedWorkspace
134
- })) : bootstrapFiles, {
135
- config: params.params.config,
136
- agentId: params.params.agentId ?? params.sessionAgentId,
137
- warn: (message) => embeddedAgentLog.warn(message)
138
- }).map((file) => remapCodexContextFilePath({
139
- file,
140
- sourceWorkspaceDir: params.resolvedWorkspace,
141
- targetWorkspaceDir: promptWorkspace
142
- }));
143
- const promptContextFiles = selectCodexWorkspacePromptContextFiles(contextFiles, {
144
- excludeMemory: memoryToolsAvailable,
145
- memoryWorkspaceDir: params.effectiveWorkspace
146
- });
147
- const injectOpenClawContext = shouldInjectCodexOpenClawPromptContext(params.params);
148
- const restrictedProjectDocNeedsOpenClawCarrier = params.params.pluginHarnessToolPolicyRestricted === true && !params.params.disableTools && !isMessageOnlyCodexSourceReply(params.params) && params.params.bootstrapContextMode !== "lightweight";
149
- const threadDeveloperInstructionFiles = injectOpenClawContext && !params.ringZeroActive && (inheritsAgentWorkspace || restrictedProjectDocNeedsOpenClawCarrier) ? selectCodexWorkspaceAgentProjectInstructionFiles(contextFiles, params.resolvedWorkspace) : [];
150
- const turnScopedDeveloperInstructionFiles = injectOpenClawContext ? selectCodexWorkspaceTurnScopedDeveloperInstructionFiles(contextFiles) : [];
151
- return {
152
- bootstrapFiles,
153
- contextFiles,
154
- inheritsAgentWorkspace,
155
- promptContextFiles,
156
- threadDeveloperInstructionFiles,
157
- turnScopedDeveloperInstructionFiles,
158
- memoryReferenceFiles,
159
- memoryToolRoutedBootstrapFiles,
160
- memoryToolNames: [...params.memoryToolNames],
161
- memoryToolRouted: memoryToolsAvailable,
162
- promptContext: renderCodexWorkspaceBootstrapPromptContext(promptContextFiles),
163
- threadDeveloperInstructions: renderCodexWorkspaceDeveloperInstructions({
164
- files: threadDeveloperInstructionFiles,
165
- header: "## OpenClaw Agent Workspace Instructions",
166
- preamble: "OpenClaw loaded this bounded snapshot from the configured agent workspace."
167
- }),
168
- turnScopedDeveloperInstructions: renderCodexWorkspaceCollaborationDeveloperInstructions(turnScopedDeveloperInstructionFiles),
169
- memoryCollaborationInstructions: shouldInjectCodexOpenClawPromptContext(params.params) ? await renderCodexWorkspaceMemoryCollaborationInstructions({
170
- files: memoryReferenceFiles,
171
- toolNames: params.memoryToolNames,
172
- memoryToolRouted: memoryToolsAvailable,
173
- citationsMode: params.params.config?.memory?.citations,
174
- agentId: params.params.agentId ?? params.sessionAgentId,
175
- agentSessionKey: params.sessionKey,
176
- sandboxed: params.sandboxed
177
- }) : void 0
178
- };
179
- } catch (error) {
180
- embeddedAgentLog.warn("failed to load codex workspace bootstrap instructions", { error });
181
- return {
182
- bootstrapFiles: [],
183
- contextFiles: [],
184
- inheritsAgentWorkspace: false
185
- };
186
- }
187
- }
188
- /**
189
- * Builds the prompt-size, bootstrap-file, skill, and tool-schema accounting
190
- * report for a Codex run.
191
- */
192
- function buildCodexSystemPromptReport(params) {
193
- const toolEntries = flattenCodexDynamicToolFunctions(params.tools).map(buildCodexToolReportEntry);
194
- const schemaChars = toolEntries.reduce((sum, tool) => sum + tool.schemaChars, 0);
195
- const skillsPrompt = params.skillsPrompt.trim();
196
- const bootstrapMaxChars = readPositiveNumber(params.attempt.config?.agents?.defaults?.bootstrapMaxChars);
197
- const bootstrapTotalMaxChars = readPositiveNumber(params.attempt.config?.agents?.defaults?.bootstrapTotalMaxChars);
198
- return {
199
- source: "run",
200
- generatedAt: Date.now(),
201
- sessionId: params.attempt.sessionId,
202
- sessionKey: params.sessionKey,
203
- provider: params.attempt.provider,
204
- model: params.attempt.modelId,
205
- workspaceDir: params.workspaceDir,
206
- ...bootstrapMaxChars ? { bootstrapMaxChars } : {},
207
- ...bootstrapTotalMaxChars ? { bootstrapTotalMaxChars } : {},
208
- systemPrompt: {
209
- chars: params.developerInstructions.length,
210
- projectContextChars: 0,
211
- nonProjectContextChars: params.developerInstructions.length,
212
- hash: sha256Text(params.developerInstructions)
213
- },
214
- injectedWorkspaceFiles: buildCodexBootstrapInjectionStats({
215
- bootstrapFiles: params.workspaceBootstrapContext.bootstrapFiles,
216
- injectedFiles: params.workspaceBootstrapContext.promptContextFiles ?? [],
217
- omitReferenceFiles: params.omitWorkspaceReferences,
218
- developerInstructionFiles: [...params.workspaceBootstrapContext.threadDeveloperInstructionFiles ?? [], ...params.workspaceBootstrapContext.turnScopedDeveloperInstructionFiles ?? []],
219
- memoryToolRoutedBootstrapFiles: params.workspaceBootstrapContext.memoryToolRoutedBootstrapFiles ?? [],
220
- memoryToolRouted: params.workspaceBootstrapContext.memoryToolRouted === true
221
- }),
222
- skills: {
223
- promptChars: skillsPrompt.length,
224
- hash: sha256Text(skillsPrompt),
225
- entries: buildCodexSkillReportEntries(skillsPrompt)
226
- },
227
- tools: {
228
- listChars: 0,
229
- schemaChars,
230
- entries: toolEntries
231
- }
232
- };
233
- }
234
- function buildCodexSkillReportEntries(skillsPrompt) {
235
- if (!skillsPrompt) return [];
236
- return Array.from(skillsPrompt.matchAll(/<skill>[\s\S]*?<\/skill>/gi)).map((match) => match[0] ?? "").map((block) => ({
237
- name: block.match(/<name>\s*([^<]+?)\s*<\/name>/i)?.[1]?.trim() || "(unknown)",
238
- blockChars: block.length
239
- })).filter((entry) => entry.blockChars > 0);
240
- }
241
- function buildCodexToolReportEntry(tool) {
242
- const summary = tool.description.trim();
243
- if (tool.deferLoading === true) return {
244
- name: tool.name,
245
- summaryChars: summary.length,
246
- summaryHash: sha256Text(summary),
247
- schemaChars: 0,
248
- schemaHash: stableJsonHash(null),
249
- propertiesCount: null
250
- };
251
- return {
252
- name: tool.name,
253
- summaryChars: summary.length,
254
- summaryHash: sha256Text(summary),
255
- ...buildCodexToolSchemaStats(tool.inputSchema)
256
- };
257
- }
258
- function buildCodexToolSchemaStats(schema) {
259
- const schemaChars = (() => {
260
- try {
261
- return JSON.stringify(schema).length;
262
- } catch {
263
- return 0;
264
- }
265
- })();
266
- const properties = isJsonObject(schema) && isJsonObject(schema.properties) ? schema.properties : null;
267
- return {
268
- schemaChars,
269
- schemaHash: stableJsonHash(schema),
270
- propertiesCount: properties ? Object.keys(properties).length : null
271
- };
272
- }
273
- function sha256Text(value) {
274
- return createHash("sha256").update(value).digest("hex");
275
- }
276
- function normalizeForStableHash(value) {
277
- if (Array.isArray(value)) return value.map((entry) => normalizeForStableHash(entry));
278
- if (value && typeof value === "object") {
279
- const record = value;
280
- return Object.fromEntries(Object.keys(record).toSorted((left, right) => left.localeCompare(right)).map((key) => [key, normalizeForStableHash(record[key])]));
281
- }
282
- return value;
283
- }
284
- function stableJsonHash(value) {
285
- return sha256Text(JSON.stringify(normalizeForStableHash(value)) ?? "null");
286
- }
287
- function buildCodexBootstrapInjectionStats(params) {
288
- const injectedIndex = indexCodexContextFileContent(params.injectedFiles);
289
- const developerInstructionIndex = indexCodexContextFileContent(params.developerInstructionFiles ?? []);
290
- const memoryToolRoutedPaths = new Set((params.memoryToolRoutedBootstrapFiles ?? []).map((file) => readNonBlankString(file.path)).filter(isNonEmptyString).map(normalizeCodexContextFilePath));
291
- return params.bootstrapFiles.map((file) => {
292
- const fileName = readNonBlankString(file.name);
293
- const pathValue = readNonBlankString(file.path) ?? fileName ?? "";
294
- const displayName = (fileName ?? getCodexContextFileDisplayBasename(pathValue)) || pathValue;
295
- const baseName = getCodexContextFileBasename(pathValue || fileName || "");
296
- const rawChars = file.missing ? 0 : (file.content ?? "").trimEnd().length;
297
- const memoryToolRoutedFile = baseName === CODEX_MEMORY_CONTEXT_BASENAME && params.memoryToolRouted === true && memoryToolRoutedPaths.has(normalizeCodexContextFilePath(pathValue));
298
- const injected = memoryToolRoutedFile ? void 0 : readCodexIndexedContextFileContent(injectedIndex, pathValue, fileName) ?? readCodexIndexedContextFileContent(developerInstructionIndex, pathValue, fileName);
299
- if (!file.missing && injected === void 0 && CODEX_NATIVE_PROJECT_DOC_BASENAMES.has(baseName)) return {
300
- name: displayName,
301
- path: pathValue,
302
- missing: false,
303
- rawChars,
304
- injectionStatus: "native_unverified",
305
- injectedChars: null,
306
- truncated: null
307
- };
308
- const omitted = memoryToolRoutedFile || params.omitReferenceFiles && readCodexIndexedContextFileContent(injectedIndex, pathValue, fileName) !== void 0;
309
- const injectedChars = omitted ? 0 : injected?.length ?? 0;
310
- const truncated = omitted ? false : !file.missing && injectedChars < rawChars;
311
- return {
312
- name: displayName,
313
- path: pathValue,
314
- missing: file.missing,
315
- rawChars,
316
- injectedChars,
317
- truncated
318
- };
319
- });
320
- }
321
- function indexCodexContextFileContent(files) {
322
- const byPath = /* @__PURE__ */ new Map();
323
- const byBaseName = /* @__PURE__ */ new Map();
324
- for (const file of files) {
325
- const pathValue = readNonBlankString(file.path);
326
- if (!pathValue) continue;
327
- if (!byPath.has(pathValue)) byPath.set(pathValue, file.content);
328
- const baseName = getCodexContextFileBasename(pathValue);
329
- if (baseName && !byBaseName.has(baseName)) byBaseName.set(baseName, file.content);
330
- }
331
- return {
332
- byPath,
333
- byBaseName
334
- };
335
- }
336
- function readCodexIndexedContextFileContent(index, pathValue, fileName) {
337
- const pathContent = index.byPath.get(pathValue);
338
- if (pathContent !== void 0) return pathContent;
339
- if (fileName) {
340
- const nameContent = index.byPath.get(fileName);
341
- if (nameContent !== void 0) return nameContent;
342
- }
343
- const baseName = getCodexContextFileBasename(fileName ?? pathValue);
344
- return baseName ? index.byBaseName.get(baseName) : void 0;
345
- }
346
- function readPositiveNumber(value) {
347
- return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : void 0;
348
- }
349
- /**
350
- * Builds OpenClaw-provided workspace prompt context for the current Codex turn.
351
- */
352
- function buildCodexOpenClawPromptContext(params) {
353
- if (!shouldInjectCodexOpenClawPromptContext(params.params)) return;
354
- const sections = [params.workspacePromptContext?.trim() ? [
355
- "## OpenClaw Workspace Context",
356
- "",
357
- params.workspacePromptContext.trim()
358
- ].join("\n") : void 0, params.watchedSessionsContext?.trim() || void 0].filter(isNonEmptyString);
359
- if (sections.length === 0) return;
360
- return [
361
- "OpenClaw runtime context for this turn:",
362
- "Treat this OpenClaw-provided context as supporting project/user reference for the current request.",
363
- "",
364
- ...sections
365
- ].join("\n");
366
- }
367
- /**
368
- * Renders the watched-sessions block for the Codex per-turn runtime context.
369
- * Codex builds its own instruction layers, so the embedded prompt's Watched
370
- * Sessions section must be re-surfaced here or Codex-backed main sessions
371
- * keep refusing cross-session questions (openclaw#114797).
372
- */
373
- function buildCodexWatchedSessionsContext(params) {
374
- if (!shouldInjectCodexOpenClawPromptContext(params.attempt)) return;
375
- return buildWatchedSessionsHarnessContext({
376
- config: params.attempt.config,
377
- sessionKey: params.sessionKey,
378
- sandboxed: params.sandboxed,
379
- toolNames: flattenCodexDynamicToolFunctions(params.dynamicTools).map((tool) => normalizeCodexDynamicToolName(tool.name))
380
- });
381
- }
382
- function shouldInjectCodexOpenClawPromptContext(params) {
383
- return !(params.bootstrapContextMode === "lightweight" && params.bootstrapContextRunKind === "cron");
384
- }
385
- /** Renders loaded OpenClaw skill prompts as Codex collaboration instructions. */
386
- function renderCodexSkillsCollaborationInstructions(params) {
387
- if (!shouldInjectCodexOpenClawPromptContext(params.attempt)) return;
388
- return params.skillsPrompt?.trim() ? [
389
- "## OpenClaw Skills",
390
- "",
391
- params.skillsPrompt.trim()
392
- ].join("\n") : void 0;
393
- }
394
- /**
395
- * Prepends OpenClaw context while preserving leading delivery metadata as
396
- * routing guidance instead of user request text.
397
- */
398
- function prependCodexOpenClawPromptContext(prompt, context, options = {}) {
399
- const { deliveryHint, prompt: promptWithoutDeliveryHint } = splitLeadingCodexDeliveryHint(prompt);
400
- if (!context?.trim() && (!deliveryHint || options.preservePromptWithoutContext)) return prompt;
401
- const promptSection = promptWithoutDeliveryHint.startsWith("OpenClaw assembled context for this turn:") ? promptWithoutDeliveryHint : ["Current user request:", promptWithoutDeliveryHint].join("\n");
402
- const deliverySection = deliveryHint ? [
403
- "OpenClaw delivery metadata:",
404
- "This delivery metadata is runtime routing guidance, not the user's request.",
405
- deliveryHint
406
- ].join("\n") : void 0;
407
- return [
408
- context?.trim(),
409
- deliverySection,
410
- promptSection
411
- ].filter(Boolean).join("\n\n");
412
- }
413
- /**
414
- * Maps the surviving user-request portion of an input range after delivery
415
- * metadata has been relocated before the request.
416
- */
417
- function resolveCodexDeliveryHintPreservedInputRange(params) {
418
- const { prompt, promptInputRange, decoratedPrompt } = params;
419
- const { deliveryHint, prompt: promptWithoutDeliveryHint } = splitLeadingCodexDeliveryHint(prompt);
420
- if (!deliveryHint || !promptInputRange || promptInputRange.start < 0 || promptInputRange.end < promptInputRange.start || promptInputRange.end > prompt.length || !decoratedPrompt.endsWith(promptWithoutDeliveryHint)) return;
421
- const promptWithoutDeliveryHintStart = prompt.length - promptWithoutDeliveryHint.length;
422
- const inputStart = Math.max(promptInputRange.start, promptWithoutDeliveryHintStart);
423
- const inputEnd = Math.max(inputStart, Math.min(promptInputRange.end, promptWithoutDeliveryHint.length + promptWithoutDeliveryHintStart));
424
- const decoratedPromptSuffixStart = decoratedPrompt.length - promptWithoutDeliveryHint.length;
425
- const requestHeader = "Current user request:\n";
426
- const requestHeaderStart = decoratedPromptSuffixStart - 22;
427
- return {
428
- start: inputStart === promptWithoutDeliveryHintStart && decoratedPrompt.slice(requestHeaderStart, decoratedPromptSuffixStart) === requestHeader ? requestHeaderStart : decoratedPromptSuffixStart + inputStart - promptWithoutDeliveryHintStart,
429
- end: decoratedPromptSuffixStart + inputEnd - promptWithoutDeliveryHintStart
430
- };
431
- }
432
- function splitLeadingCodexDeliveryHint(prompt) {
433
- const trimmedStart = prompt.trimStart();
434
- const matchedHint = MESSAGE_TOOL_DELIVERY_HINTS.find((hint) => trimmedStart.startsWith(hint));
435
- if (!matchedHint) return { prompt };
436
- return {
437
- deliveryHint: matchedHint,
438
- prompt: trimmedStart.slice(matchedHint.length).replace(/^\s*\n/, "").trimStart()
439
- };
440
- }
441
- function renderCodexWorkspaceBootstrapPromptContext(contextFiles) {
442
- const files = contextFiles;
443
- if (files.length === 0) return;
444
- const lines = [
445
- "OpenClaw loaded these user-editable workspace files for the current turn. Codex loads project-local AGENTS.md natively. When execution uses another folder, OpenClaw supplies the agent workspace AGENTS.md as thread-level developer instructions. SOUL.md, IDENTITY.md, and USER.md are prepared separately from user input and are not repeated here.",
446
- "",
447
- "# Project Context",
448
- "",
449
- "The following project context files have been loaded:"
450
- ];
451
- lines.push("");
452
- for (const file of files) lines.push(`## ${file.path}`, "", file.content, "");
453
- return lines.join("\n").trim();
454
- }
455
- function selectCodexWorkspacePromptContextFiles(contextFiles, options = {}) {
456
- const excludeMemory = options.excludeMemory ?? true;
457
- return contextFiles.filter((file) => {
458
- const baseName = getCodexContextFileBasename(file.path);
459
- return baseName && !CODEX_NATIVE_PROJECT_DOC_BASENAMES.has(baseName) && !CODEX_WORKSPACE_DEVELOPER_CONTEXT_BASENAMES.has(baseName) && (!excludeMemory || !isCodexWorkspaceRootMemoryContextFile({
460
- file,
461
- workspaceDir: options.memoryWorkspaceDir
462
- })) && !isMissingCodexBootstrapContextFile(file);
463
- }).toSorted(compareCodexContextFiles);
464
- }
465
- function selectCodexWorkspaceTurnScopedDeveloperInstructionFiles(contextFiles) {
466
- return selectCodexWorkspaceDeveloperInstructionFiles(contextFiles, CODEX_TURN_SCOPED_WORKSPACE_DEVELOPER_CONTEXT_BASENAMES);
467
- }
468
- function selectCodexWorkspaceAgentProjectInstructionFiles(contextFiles, agentWorkspaceDir) {
469
- const agentProjectDocPath = path.join(path.resolve(agentWorkspaceDir), "AGENTS.md");
470
- return selectCodexWorkspaceDeveloperInstructionFiles(contextFiles, CODEX_NATIVE_PROJECT_DOC_BASENAMES).filter((file) => path.resolve(file.path) === agentProjectDocPath);
471
- }
472
- function selectCodexWorkspaceDeveloperInstructionFiles(contextFiles, basenames) {
473
- return contextFiles.filter((file) => {
474
- const baseName = getCodexContextFileBasename(file.path);
475
- return baseName && basenames.has(baseName) && !isMissingCodexBootstrapContextFile(file) && file.content.trim().length > 0;
476
- }).toSorted(compareCodexContextFiles);
477
- }
478
- function renderCodexWorkspaceCollaborationDeveloperInstructions(files) {
479
- return renderCodexWorkspaceDeveloperInstructions({
480
- files,
481
- header: "## OpenClaw Agent Soul",
482
- preamble: "OpenClaw loaded these workspace instruction files from the active agent workspace. They are the canonical definitions of who you are, how you think and work, and the human you work alongside. Internalize and follow them accordingly.",
483
- wrapperTag: "AGENT_SOUL"
484
- });
485
- }
486
- function renderCodexWorkspaceDeveloperInstructions(params) {
487
- const { files, header, preamble, wrapperTag } = params;
488
- if (files.length === 0) return;
489
- const lines = [
490
- header,
491
- "",
492
- preamble,
493
- ""
494
- ];
495
- if (wrapperTag) lines.push(`<${wrapperTag}>`, "");
496
- for (const file of files) lines.push(`### ${file.path}`, "", file.content, "");
497
- if (wrapperTag) lines.push(`</${wrapperTag}>`);
498
- return lines.join("\n").trim();
499
- }
500
- function selectCodexWorkspaceMemoryReferenceFiles(params) {
501
- return params.bootstrapFiles.filter((file) => {
502
- return isCodexWorkspaceRootMemoryBootstrapFile({
503
- file,
504
- workspaceDir: params.workspaceDir
505
- }) && !file.missing && (file.content ?? "").trim().length > 0;
506
- }).toSorted(compareCodexBootstrapFiles);
507
- }
508
- /**
509
- * Renders a memory-file reference that points Codex at memory tools instead of
510
- * embedding MEMORY.md contents.
511
- */
512
- function renderCodexWorkspaceMemoryReference(params) {
513
- if (params.files.length === 0) return;
514
- const lines = [
515
- "## OpenClaw Workspace Memory",
516
- "",
517
- `MEMORY.md exists in the active agent workspace as a memory file, not an instruction file. OpenClaw does not paste its contents into native Codex turns; use ${(params.toolNames?.length ? params.toolNames : Array.from(CODEX_MEMORY_TOOL_NAMES)).join(" or ")} when durable memory is relevant and the tools are available.`,
518
- ""
519
- ];
520
- for (const file of params.files) lines.push(`- ${file.path}`);
521
- return lines.join("\n").trim();
522
- }
523
- async function renderCodexWorkspaceMemoryCollaborationInstructions(params) {
524
- const sections = [params.memoryToolRouted ? await renderCodexMemoryRecallInstructions({
525
- toolNames: params.toolNames,
526
- citationsMode: params.citationsMode,
527
- agentId: params.agentId,
528
- agentSessionKey: params.agentSessionKey,
529
- sandboxed: params.sandboxed
530
- }) : void 0, renderCodexWorkspaceMemoryReference({
531
- files: params.files,
532
- toolNames: params.toolNames
533
- })].filter(isNonEmptyString);
534
- return sections.length > 0 ? sections.join("\n\n") : void 0;
535
- }
536
- async function renderCodexMemoryRecallInstructions(params) {
537
- const availableTools = new Set(params.toolNames);
538
- const memoryPrompt = await prepareMemorySystemPromptAddition({
539
- availableTools,
540
- citationsMode: params.citationsMode,
541
- agentId: params.agentId,
542
- agentSessionKey: params.agentSessionKey,
543
- sandboxed: params.sandboxed
544
- });
545
- if (!memoryPrompt) return;
546
- return [memoryPrompt, renderCodexMemoryToolSearchBridge(params.toolNames)].filter(isNonEmptyString).join("\n").trim();
547
- }
548
- function renderCodexMemoryToolSearchBridge(toolNames) {
549
- const memoryToolNames = toolNames.map((name) => normalizeCodexDynamicToolName(name)).filter((name) => CODEX_MEMORY_TOOL_NAMES.has(name)).toSorted();
550
- if (memoryToolNames.length === 0) return;
551
- return `Codex may expose ${memoryToolNames.join(" and ")} as deferred tools. When the memory guidance above calls for memory recall, use an already-loaded memory tool directly. If the needed memory tool is deferred and not currently callable, use \`tool_search\` to load it, then call that memory tool.`;
552
- }
553
- /** Lists available memory tool names understood by Codex workspace memory routing. */
554
- function getCodexWorkspaceMemoryToolNames(tools) {
555
- const availableToolNames = new Set(flattenCodexDynamicToolFunctions(tools).map((tool) => normalizeCodexDynamicToolName(tool.name)));
556
- return Array.from(CODEX_MEMORY_TOOL_NAMES).filter((name) => availableToolNames.has(name));
557
- }
558
- function canRouteCodexWorkspaceMemoryThroughTools(params) {
559
- if (!params.config) return false;
560
- return isSameCodexWorkspacePath(resolveAgentWorkspaceDir(params.config, params.agentId), params.workspaceDir);
561
- }
562
- function isMissingCodexBootstrapContextFile(file) {
563
- return file.content.trimStart().startsWith("[MISSING] Expected at:");
564
- }
565
- function toCodexEmbeddedContextFile(file) {
566
- return {
567
- path: readNonBlankString(file.path) ?? readNonBlankString(file.name) ?? "",
568
- content: file.content ?? ""
569
- };
570
- }
571
- function isCodexWorkspaceRootMemoryBootstrapFile(params) {
572
- return isCodexWorkspaceRootMemoryPath({
573
- filePath: readNonBlankString(params.file.path) ?? readNonBlankString(params.file.name) ?? "",
574
- workspaceDir: params.workspaceDir
575
- });
576
- }
577
- function isCodexWorkspaceRootMemoryContextFile(params) {
578
- if (!params.workspaceDir) return false;
579
- return isCodexWorkspaceRootMemoryPath({
580
- filePath: params.file.path,
581
- workspaceDir: params.workspaceDir
582
- });
583
- }
584
- function isCodexWorkspaceRootMemoryPath(params) {
585
- const filePath = params.filePath.trim();
586
- if (!filePath) return false;
587
- return (path.isAbsolute(filePath) ? path.resolve(filePath) : path.resolve(params.workspaceDir, filePath)) === path.join(path.resolve(params.workspaceDir), "MEMORY.md");
588
- }
589
- function isSameCodexWorkspacePath(left, right) {
590
- return path.resolve(left) === path.resolve(right);
591
- }
592
- /**
593
- * Remaps bootstrap file paths from the resolved workspace to the effective Codex
594
- * workspace while preserving platform path separators.
595
- */
596
- function remapCodexContextFilePath(params) {
597
- const relativePath = path.relative(params.sourceWorkspaceDir, params.file.path);
598
- if (!relativePath || relativePath === ".." || relativePath.startsWith(`..${path.sep}`) || path.isAbsolute(relativePath) || params.sourceWorkspaceDir === params.targetWorkspaceDir) return params.file;
599
- const targetUsesPosixSeparators = params.targetWorkspaceDir.includes("/") && !params.targetWorkspaceDir.includes("\\");
600
- const normalizedRelativePath = targetUsesPosixSeparators ? relativePath.replaceAll("\\", "/") : relativePath.replaceAll("/", "\\");
601
- return {
602
- ...params.file,
603
- path: targetUsesPosixSeparators ? path.posix.join(params.targetWorkspaceDir, normalizedRelativePath) : path.win32.join(params.targetWorkspaceDir, normalizedRelativePath)
604
- };
605
- }
606
- function compareCodexContextFiles(left, right) {
607
- const leftPath = normalizeCodexContextFilePath(left.path);
608
- const rightPath = normalizeCodexContextFilePath(right.path);
609
- const leftBase = getCodexContextFileBasename(left.path);
610
- const rightBase = getCodexContextFileBasename(right.path);
611
- const leftOrder = CODEX_BOOTSTRAP_CONTEXT_ORDER.get(leftBase) ?? Number.MAX_SAFE_INTEGER;
612
- const rightOrder = CODEX_BOOTSTRAP_CONTEXT_ORDER.get(rightBase) ?? Number.MAX_SAFE_INTEGER;
613
- if (leftOrder !== rightOrder) return leftOrder - rightOrder;
614
- if (leftBase !== rightBase) return leftBase.localeCompare(rightBase);
615
- return leftPath.localeCompare(rightPath);
616
- }
617
- function compareCodexBootstrapFiles(left, right) {
618
- return compareCodexContextFiles(toCodexEmbeddedContextFile(left), toCodexEmbeddedContextFile(right));
619
- }
620
- function normalizeCodexContextFilePath(filePath) {
621
- return filePath.trim().replaceAll("\\", "/").toLowerCase();
622
- }
623
- function getCodexContextFileDisplayBasename(filePath) {
624
- return filePath.trim().replaceAll("\\", "/").split("/").pop()?.trim() ?? "";
625
- }
626
- function getCodexContextFileBasename(filePath) {
627
- return normalizeCodexContextFilePath(filePath).split("/").pop() ?? "";
628
- }
629
- function normalizeCodexDynamicToolName(name) {
630
- return name.trim().toLowerCase();
631
- }
632
- function isNonEmptyString(value) {
633
- return typeof value === "string" && value.length > 0;
634
- }
635
- //#endregion
636
- export { getCodexWorkspaceMemoryToolNames as a, readContextEngineThreadBootstrapProjection as c, resolveCodexDeliveryHintPreservedInputRange as d, resolveContextEngineBootstrapProjectionDecision as f, buildCodexWorkspaceBootstrapContext as i, readMirroredSessionHistoryMessages as l, buildCodexSystemPromptReport as n, prepareCodexWorkspaceDeveloperInstructions as o, buildCodexWatchedSessionsContext as r, prependCodexOpenClawPromptContext as s, buildCodexOpenClawPromptContext as t, renderCodexSkillsCollaborationInstructions as u };