@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.
- package/README.md +2 -0
- package/assets/icon.png +0 -0
- package/dist/.setup/{account-usage-runtime-C2MOIvfq.mjs → account-usage-runtime-DFhbh1zz.mjs} +6 -6
- package/dist/.setup/{apply-CJ0ZfmBG.mjs → apply-D3GcSoSa.mjs} +35 -55
- package/dist/.setup/{attempt-client-cleanup-BpYKdTA0.mjs → attempt-client-cleanup-DOP-cW5j.mjs} +179 -73
- package/dist/.setup/attempt-workspace-context-C5HigshI.mjs +164 -0
- package/dist/.setup/{auth-binding-DhLWa_7K.mjs → auth-binding-BLWz7stm.mjs} +14 -1
- package/dist/.setup/{auth-cache-key-QirmgiCo.mjs → auth-cache-key-Dbvq-QgB.mjs} +41 -111
- package/dist/.setup/{auth-profile-WqZtZfXN.mjs → auth-profile-B0okYl2D.mjs} +1 -2
- package/dist/.setup/auth-profile-health-oHizqgye.mjs +53 -0
- package/dist/.setup/auth-profile-recovery-BREezV0L.mjs +14 -0
- package/dist/.setup/auth-start-options-BPIPeEX8.mjs +44 -0
- package/dist/.setup/{binding-connection-Bm38niE8.mjs → binding-connection-DTtN1KrX.mjs} +2 -2
- package/dist/.setup/{binding-connection.runtime-CnRMC0ta.mjs → binding-connection.runtime-6TpgD1M6.mjs} +5 -5
- package/dist/.setup/{bounded-turn-BtlZcivC.mjs → bounded-turn-CbjoN2OW.mjs} +140 -37
- package/dist/.setup/bounded-turn-isolation-B8K_ylqk.mjs +14 -0
- package/dist/.setup/{build-state-Xx9ybZqa.mjs → build-state-Da1_z0kd.mjs} +1 -1
- package/dist/.setup/{capabilities-_vXcZGSx.mjs → capabilities-B3WEZl4e.mjs} +2 -10
- package/dist/.setup/{client-vXs2929Q.mjs → client-N0JpgSzF.mjs} +635 -872
- package/dist/.setup/client-catalog-response-5HHLdcde.mjs +285 -0
- package/dist/.setup/{command-dispatch-naHIZwwF.mjs → command-dispatch-BeAoaovI.mjs} +9 -8
- package/dist/.setup/{command-formatters-CGEkdawF.mjs → command-formatters-R3ckE3Co.mjs} +36 -64
- package/dist/.setup/{command-handlers-BtAJEW1X.mjs → command-handlers-ylTMS00z.mjs} +301 -488
- package/dist/.setup/{command-rpc-DHFpn4le.mjs → command-rpc-CGJGUQ6Y.mjs} +40 -28
- package/dist/.setup/compact-C2WamavS.mjs +776 -0
- package/dist/.setup/{config-CedDWjM-.mjs → config-DKhXquav.mjs} +26 -28
- package/dist/.setup/{config-options-BsanJ8QG.mjs → config-options-CzyWLTJt.mjs} +68 -65
- package/dist/.setup/{config-parsing-CcB9iPoq.mjs → config-parsing-b088LyhT.mjs} +57 -60
- package/dist/.setup/{config-runtime-CeAhl_h4.mjs → config-runtime-C0NbLms1.mjs} +2 -2
- package/dist/.setup/{config-security-BRQ2mgW9.mjs → config-security-CE-FcGw9.mjs} +51 -215
- package/dist/.setup/{config-utils-DujwEnhg.mjs → config-utils-D0CXecki.mjs} +3 -13
- package/dist/.setup/context-engine-projection-PezSESth.mjs +387 -0
- package/dist/.setup/{conversation-binding-DhzrpTM6.mjs → conversation-binding-3Min8qvP.mjs} +71 -105
- package/dist/.setup/{conversation-binding-data-CrcyZk6O.mjs → conversation-binding-data-C746z5Pn.mjs} +8 -12
- package/dist/.setup/{conversation-control-DN53ns41.mjs → conversation-control-CEP8X5JC.mjs} +30 -69
- package/dist/.setup/{cyber-failover-DYwbmf1o.mjs → cyber-failover-XV0nNRZu.mjs} +1 -1
- package/dist/.setup/{cyber-failover-notice-e9G3J9-e.mjs → cyber-failover-notice-RNpGpTyP.mjs} +1 -1
- package/dist/.setup/{dynamic-tools-D16lOp67.mjs → dynamic-tools-DzlsLUuS.mjs} +3136 -3167
- package/dist/.setup/{effective-mcp-catalog-K6kLCN8X.mjs → effective-mcp-catalog-CxUtC-xG.mjs} +8 -17
- package/dist/.setup/{ephemeral-turn-R1gA8Sn6.mjs → ephemeral-turn-CDsPJOa2.mjs} +9 -6
- package/dist/.setup/event-projector-assistant-message-CigreO4K.mjs +69 -0
- package/dist/.setup/{event-projector-usage-C7Ntzs-f.mjs → event-projector-usage-03R0I2dM.mjs} +4 -26
- package/dist/.setup/event-projector-values-DJSz8BTk.mjs +106 -0
- package/dist/.setup/incognito-session-DWYapfwf.mjs +2 -0
- package/dist/.setup/{inference-context-fulhZuz8.mjs → inference-context-D-9gWlTR.mjs} +16 -18
- package/dist/.setup/inference-dispatch-CMZtjQyz.mjs +359 -0
- package/dist/.setup/inference-metadata-CgIf7sOx.mjs +81 -0
- package/dist/.setup/inference-proxy-DhcXOgUE.mjs +561 -0
- package/dist/.setup/{isolated-completion-B6srt48J.mjs → isolated-completion-Dm3PzxJk.mjs} +15 -11
- package/dist/.setup/launch-args-DbFCehO7.mjs +196 -0
- package/dist/.setup/{managed-binary-DP6Rib3P.mjs → managed-binary-kiWRhNRE.mjs} +16 -9
- package/dist/.setup/{model-catalog-DkvUuBey.mjs → model-catalog-PAuZgJC6.mjs} +14 -14
- package/dist/.setup/model-runtime-BdqzOMkU.mjs +11 -0
- package/dist/.setup/{models-BDFgm_G-.mjs → models-DHXZtVVk.mjs} +9 -18
- package/dist/.setup/{native-auth-BLZGqFjw.mjs → native-auth-CuG53tu4.mjs} +5 -5
- package/dist/.setup/{native-execution-policy-YBMHSzC4.mjs → native-execution-policy-BxZJy5mP.mjs} +6 -31
- package/dist/.setup/{native-subagent-monitor-B1hxzIOy.mjs → native-subagent-monitor-Dpsmf2wz.mjs} +4422 -3808
- package/dist/.setup/native-subagent-pending-assignments-DwkCzLvD.mjs +203 -0
- package/dist/.setup/native-task-assignments-DMQ0g3hu.mjs +194 -0
- package/dist/.setup/{node-cli-sessions-Cl8b2ZF3.mjs → node-cli-sessions-HC4W6FLI.mjs} +99 -111
- package/dist/.setup/node-exec-server.runtime-BgBfWQqo.mjs +244 -0
- package/dist/.setup/{plan-xD7WKYTM.mjs → plan-Y-QIvrKB.mjs} +118 -163
- package/dist/.setup/{plugin-activation-r8nq5Jzp.mjs → plugin-activation-cNHRfaxU.mjs} +10 -47
- package/dist/.setup/{plugin-app-cache-key-BOxKP7db.mjs → plugin-app-cache-key-BL9B5H0L.mjs} +9 -42
- package/dist/.setup/{plugin-inventory-DUle8DLz.mjs → plugin-inventory-Cky2XJUw.mjs} +32 -23
- package/dist/.setup/{plugin-marketplace-discovery-P-Vndfqq.mjs → plugin-marketplace-discovery-D_dV9FXa.mjs} +22 -25
- package/dist/.setup/{plugin-metadata-cache-DsS5buNa.mjs → plugin-metadata-cache-DsjsL1dr.mjs} +328 -318
- package/dist/.setup/protocol-CANUwXJ3.mjs +17 -0
- package/dist/.setup/provider-DH8NSzGt.mjs +51 -0
- package/dist/.setup/{provider-capabilities-B8J4Dy-O.mjs → provider-capabilities-CAxoF-X1.mjs} +35 -12
- package/dist/.setup/{rate-limits-DOEGYRNs.mjs → rate-limits-B7-X2TgG.mjs} +123 -166
- package/dist/.setup/{request-BioXJLYa.mjs → request-BHZ1nz8d.mjs} +25 -16
- package/dist/.setup/responses-oauth-twnuTaAa.mjs +93 -0
- package/dist/.setup/rpc-error-BlD2vuzn.mjs +31 -0
- package/dist/.setup/{run-attempt-rlA07pUv.mjs → run-attempt-D8RZUOzY.mjs} +2046 -1454
- package/dist/.setup/{run-attempt-lifecycle-B7JbY4-F.mjs → run-attempt-lifecycle-C-6O3Exn.mjs} +10 -24
- package/dist/.setup/{runtime-artifact-Dy38Z5iU.mjs → runtime-artifact-DDQ-HGXf.mjs} +43 -47
- package/dist/.setup/runtime-artifact-connection-D68qQn1m.mjs +78 -0
- package/dist/.setup/sandbox-guard-DjCz2eOw.mjs +126 -0
- package/dist/.setup/scope-DOC1Xjc8.mjs +6 -0
- package/dist/.setup/session-binding-DGCYAfvD.mjs +443 -0
- package/dist/.setup/{session-binding-record-TH3xA0zj.mjs → session-binding-record-Oe9L-CNY.mjs} +73 -132
- package/dist/.setup/{session-binding-sidecars-CKYEcfNn.mjs → session-binding-sidecars-jo6H8dFr.mjs} +242 -60
- package/dist/.setup/{session-catalog-fUdWDx-U.mjs → session-catalog-4sCdv5qx.mjs} +598 -452
- package/dist/.setup/{session-catalog-adoption-CR_whkEW.mjs → session-catalog-adoption-BU_pHWG7.mjs} +59 -26
- package/dist/.setup/{session-catalog-archive-CwZaPacf.mjs → session-catalog-archive-spHfihri.mjs} +7 -7
- package/dist/.setup/session-catalog-events-DePDzzjc.mjs +139 -0
- package/dist/.setup/session-catalog-home-id-vlih0B_g.mjs +22 -0
- package/dist/.setup/{session-catalog-index-B141u15s.mjs → session-catalog-index-CZvDzC6z.mjs} +286 -182
- package/dist/.setup/{session-catalog-index-order-Cc5BzlQr.mjs → session-catalog-index-order-BcQpHks3.mjs} +2 -2
- package/dist/.setup/{session-catalog-index-state-BAuDztHN.mjs → session-catalog-index-state-TeO7EyO-.mjs} +6 -2
- package/dist/.setup/session-catalog-limits-DDxOsQeC.mjs +14 -0
- package/dist/.setup/session-catalog-list-request-CvtxrYSe.mjs +170 -0
- package/dist/.setup/session-catalog-native-projection-DjhwGL6x.mjs +178 -0
- package/dist/.setup/{session-catalog-node-adoption-BVRsYOSh.mjs → session-catalog-node-adoption-DgXvSGu0.mjs} +30 -35
- package/dist/.setup/{session-catalog-node-continue-Dowv8osw.mjs → session-catalog-node-continue-DjKXHBbi.mjs} +25 -18
- package/dist/.setup/session-catalog-node-lookup-CtAXI5W5.mjs +56 -0
- package/dist/.setup/{session-catalog-native-projection-ChV3cCtm.mjs → session-catalog-parsing-CPGaPYr-.mjs} +14 -180
- package/dist/.setup/{session-catalog-projection-C1Bj9Jl-.mjs → session-catalog-projection-Cr5qP5Dj.mjs} +15 -5
- package/dist/.setup/session-catalog-provenance-DoAvktcj.mjs +95 -0
- package/dist/.setup/{session-cli-DIj-IE-E.mjs → session-cli-Cn_nCqfq.mjs} +11 -24
- package/dist/.setup/{session-history-C--SrLI8.mjs → session-history-D83lJWHG.mjs} +16 -23
- package/dist/.setup/{session-history-import-JHXT5Xfi.mjs → session-history-import-WhX-X33a.mjs} +7 -10
- package/dist/.setup/session-history-read-Ov3StuL4.mjs +133 -0
- package/dist/.setup/{session-history.worker-CpNj7H_P.mjs → session-history.worker-MnPKncqP.mjs} +14 -23
- package/dist/.setup/session-initialization-6aveB9qb.mjs +22 -0
- package/dist/.setup/{session-permission-policy-DhurXY0l.mjs → session-permission-policy-Ci_fVX6y.mjs} +4 -8
- package/dist/.setup/{session-retirement-CU87AOg9.mjs → session-retirement-qMTxkNx2.mjs} +31 -12
- package/dist/.setup/{settled-turn-context-fmwouT5I.mjs → settled-turn-context-D4yj4rxf.mjs} +1 -1
- package/dist/.setup/{settled-turn-finalizer-CiY2bLFK.mjs → settled-turn-finalizer-BsvEabkw.mjs} +17 -13
- package/dist/.setup/{shared-client-BpTtuLQ5.mjs → shared-client-DqyTMYug.mjs} +826 -485
- package/dist/.setup/shared-client-lifecycle-DJIgqgMw.mjs +153 -0
- package/dist/.setup/{side-question-DSCZyoBD.mjs → side-question-C4kCmQy1.mjs} +206 -334
- package/dist/.setup/{source-Bjp4UQij.mjs → source-CS_7GFJZ.mjs} +82 -139
- package/dist/.setup/spawn-error-CL3n6MAa.mjs +57 -0
- package/dist/.setup/{thread-archive-guard-jmecf6OJ.mjs → thread-archive-guard-C9frICzX.mjs} +10 -3
- package/dist/.setup/thread-lifecycle-DPflntEJ.mjs +2362 -0
- package/dist/.setup/{incognito-session-uhrBF6wJ.mjs → thread-ownership-queue-Dp24d7-F.mjs} +1 -2
- package/dist/.setup/{thread-ownership-skomxnIt.mjs → thread-ownership-roNP0l1c.mjs} +47 -10
- package/dist/.setup/thread-policy-DTd-DtkX.mjs +109 -0
- package/dist/.setup/thread-requests-B_bRnMGN.mjs +2102 -0
- package/dist/.setup/{thread-resume-BkNpj9Pz.mjs → thread-resume-CdDaoc7T.mjs} +6 -6
- package/dist/.setup/timeout-CXOfNoaX.mjs +46 -0
- package/dist/.setup/transcript-history-projection-DRSifI-1.mjs +201 -0
- package/dist/.setup/{transcript-mirror-attestation-CzM-94NC.mjs → transcript-mirror-attestation-YSegaktH.mjs} +3 -4
- package/dist/.setup/{transcript-mirror-D4qp_leP.mjs → transcript-mirror-kxmCYsuF.mjs} +224 -206
- package/dist/.setup/{transport-stdio-Cmx94Oiy.mjs → transport-stdio-Bdegpn2V.mjs} +138 -75
- package/dist/.setup/transport-websocket-BTBE-LD9.mjs +211 -0
- package/dist/.setup/{upstream-prompt-provenance-LphB8slG.mjs → upstream-prompt-provenance-fXkKbPVC.mjs} +3 -9
- package/dist/.setup/{upstream-session-fork-D3UKxgVD.mjs → upstream-session-fork-CBeVjBpT.mjs} +48 -40
- package/dist/.setup/{usage-BOgBEKso.mjs → usage-BMzNxeR_.mjs} +5 -4
- package/dist/.setup/{usage-limit-error-C0ow7DOc.mjs → usage-limit-error-QXerDo3i.mjs} +5 -20
- package/dist/.setup/{web-search-provider.runtime-CTGuJt6i.mjs → web-search-provider.runtime-P77OUeoo.mjs} +10 -20
- package/dist/api.js +25 -16
- package/dist/catalog-page-worker-entrypoint.js +12 -0
- package/dist/catalog-page.worker.js +9 -0
- package/dist/cli-metadata.js +1 -1
- package/dist/doctor-contract-api.js +50 -8
- package/dist/harness.js +344 -1
- package/dist/index.js +345 -346
- package/dist/media-understanding-provider.js +9 -22
- package/dist/migration-provider-api.js +1 -1
- package/dist/provider-discovery.js +1 -1
- package/dist/session-history-worker-runtime.js +16 -33
- package/dist/session-history.worker.js +1 -1
- package/openclaw.plugin.json +14 -2
- package/package.json +11 -7
- package/dist/.setup/attempt-context-VXVwTCfS.mjs +0 -636
- package/dist/.setup/compact-C3i3qlzj.mjs +0 -687
- package/dist/.setup/event-projector-assistant-message-DNUR1s0A.mjs +0 -105
- package/dist/.setup/event-projector-items-DyTQ_XqL.mjs +0 -200
- package/dist/.setup/harness-rxaaoN-o.mjs +0 -349
- package/dist/.setup/history-rejection-B4nOXNXF.mjs +0 -13
- package/dist/.setup/image-payload-sanitizer-tupAr-2o.mjs +0 -79
- package/dist/.setup/inference-proxy-CC15HuSi.mjs +0 -311
- package/dist/.setup/launch-args-DnMak49W.mjs +0 -111
- package/dist/.setup/local-runtime-attribution-B_2mnqhb.mjs +0 -19
- package/dist/.setup/native-subagent-history-YXaL6dMd.mjs +0 -135
- package/dist/.setup/native-subagent-task-ids-DsuOonKv.mjs +0 -411
- package/dist/.setup/node-exec-server.runtime-BaViBKNz.mjs +0 -226
- package/dist/.setup/plugin-approval-roundtrip-CjfzafAZ.mjs +0 -122
- package/dist/.setup/provider-fFh_-VR3.mjs +0 -50
- package/dist/.setup/rolldown-runtime-8H4AJuhK.mjs +0 -14
- package/dist/.setup/sandbox-guard-BBP-RbTf.mjs +0 -166
- package/dist/.setup/session-binding-_0W_fHRr.mjs +0 -721
- package/dist/.setup/session-catalog-events-jMcYfQyd.mjs +0 -250
- package/dist/.setup/session-history-read-B3ZfSUbF.mjs +0 -50
- package/dist/.setup/session-initialization-DH1z6fXn.mjs +0 -75
- package/dist/.setup/thread-history-page-BTx-4xsg.mjs +0 -83
- package/dist/.setup/thread-lifecycle-Cik28qWn.mjs +0 -4904
- package/dist/.setup/thread-policy-Cjs4B8xf.mjs +0 -54
- package/dist/.setup/timeout-DZF05XrR.mjs +0 -63
- package/dist/.setup/transcript-history-projection-DHNBDhCU.mjs +0 -243
- 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 };
|