@openclaw/codex 2026.9.6 → 2026.9.8

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 (158) hide show
  1. package/README.md +2 -0
  2. package/assets/icon.png +0 -0
  3. package/dist/.setup/{account-usage-runtime-Eem_WGqY.mjs → account-usage-runtime-G348lY1q.mjs} +5 -5
  4. package/dist/.setup/{apply-DDOi8uNx.mjs → apply-Cqb-YoCS.mjs} +22 -36
  5. package/dist/.setup/{attempt-client-cleanup-CEv1cKwF.mjs → attempt-client-cleanup-B-S7ngS_.mjs} +128 -37
  6. package/dist/.setup/attempt-workspace-context-BJ5Z_olH.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-B2mpaI9D.mjs → auth-cache-key-Dnps4W4_.mjs} +36 -34
  9. package/dist/.setup/{auth-profile-WqZtZfXN.mjs → auth-profile-B0okYl2D.mjs} +1 -2
  10. package/dist/.setup/auth-start-options-BPIPeEX8.mjs +44 -0
  11. package/dist/.setup/{binding-connection-ThoatDcb.mjs → binding-connection-DTtN1KrX.mjs} +2 -2
  12. package/dist/.setup/{binding-connection.runtime-yoHrABt-.mjs → binding-connection.runtime-6TpgD1M6.mjs} +4 -4
  13. package/dist/.setup/{bounded-turn-B2HScEgT.mjs → bounded-turn-BNunZPtz.mjs} +15 -18
  14. package/dist/.setup/bounded-turn-isolation-B8K_ylqk.mjs +14 -0
  15. package/dist/.setup/{build-state-C7EnDVgr.mjs → build-state-DIQ5O_-S.mjs} +1 -1
  16. package/dist/.setup/{capabilities-CDXOOFdZ.mjs → capabilities-B3WEZl4e.mjs} +2 -10
  17. package/dist/.setup/{client-catalog-response-BMgt_4q4.mjs → client-catalog-response-DRvx_wCC.mjs} +1 -1
  18. package/dist/.setup/{client-Cs08OXVQ.mjs → client-qyUBJlGZ.mjs} +138 -399
  19. package/dist/.setup/{command-dispatch-B4JuOsOk.mjs → command-dispatch-Btrs1D6f.mjs} +5 -8
  20. package/dist/.setup/{command-formatters-Bmqvr9tO.mjs → command-formatters-R3ckE3Co.mjs} +29 -61
  21. package/dist/.setup/{command-handlers-DW7Lx9oH.mjs → command-handlers-DvlCHJch.mjs} +222 -343
  22. package/dist/.setup/{command-rpc-DixIj3HW.mjs → command-rpc-skzRq4wD.mjs} +15 -18
  23. package/dist/.setup/compact-8ttks5U5.mjs +776 -0
  24. package/dist/.setup/{config-BoTP_mrL.mjs → config-DKhXquav.mjs} +26 -28
  25. package/dist/.setup/{config-options-BvaRs51b.mjs → config-options-CzyWLTJt.mjs} +24 -37
  26. package/dist/.setup/{config-parsing-CcB9iPoq.mjs → config-parsing-b088LyhT.mjs} +57 -60
  27. package/dist/.setup/{config-runtime-C8Rw1m1m.mjs → config-runtime-C0NbLms1.mjs} +2 -2
  28. package/dist/.setup/{config-security-BEReZ6go.mjs → config-security-CE-FcGw9.mjs} +32 -111
  29. package/dist/.setup/{config-utils-DujwEnhg.mjs → config-utils-D0CXecki.mjs} +3 -13
  30. package/dist/.setup/context-engine-projection-PezSESth.mjs +387 -0
  31. package/dist/.setup/{conversation-binding-DP-gMrBP.mjs → conversation-binding-74LaGGH-.mjs} +67 -90
  32. package/dist/.setup/{conversation-binding-data-CrcyZk6O.mjs → conversation-binding-data-C746z5Pn.mjs} +8 -12
  33. package/dist/.setup/{conversation-control-uK9Jomlc.mjs → conversation-control-OrN6zuaY.mjs} +8 -8
  34. package/dist/.setup/{cyber-failover-DYwbmf1o.mjs → cyber-failover-XV0nNRZu.mjs} +1 -1
  35. package/dist/.setup/{cyber-failover-notice-e9G3J9-e.mjs → cyber-failover-notice-RNpGpTyP.mjs} +1 -1
  36. package/dist/.setup/{dynamic-tools-BDXl-8Cw.mjs → dynamic-tools-Db2sY5cZ.mjs} +2305 -2606
  37. package/dist/.setup/{effective-mcp-catalog-CvnvnGIe.mjs → effective-mcp-catalog-Bi6-SQ7i.mjs} +8 -17
  38. package/dist/.setup/{ephemeral-turn-poidXgek.mjs → ephemeral-turn-DiCS1ijR.mjs} +3 -3
  39. package/dist/.setup/event-projector-assistant-message-MV_1dj-3.mjs +69 -0
  40. package/dist/.setup/{event-projector-usage-CnBS8Wa3.mjs → event-projector-usage-03R0I2dM.mjs} +3 -25
  41. package/dist/.setup/event-projector-values-DJSz8BTk.mjs +106 -0
  42. package/dist/.setup/incognito-session-DWYapfwf.mjs +2 -0
  43. package/dist/.setup/{inference-context-D96l9-ew.mjs → inference-context-D-9gWlTR.mjs} +16 -18
  44. package/dist/.setup/inference-dispatch-CMZtjQyz.mjs +359 -0
  45. package/dist/.setup/inference-metadata-CgIf7sOx.mjs +81 -0
  46. package/dist/.setup/{inference-proxy-b-aJMSxm.mjs → inference-proxy-DhcXOgUE.mjs} +174 -214
  47. package/dist/.setup/{isolated-completion-BIZFhTNG.mjs → isolated-completion-D80IXfQF.mjs} +9 -12
  48. package/dist/.setup/{managed-binary-BnshlFag.mjs → managed-binary-kiWRhNRE.mjs} +8 -12
  49. package/dist/.setup/{model-catalog-CfXJf9Ay.mjs → model-catalog-DiC0Tkha.mjs} +11 -10
  50. package/dist/.setup/model-runtime-BdqzOMkU.mjs +11 -0
  51. package/dist/.setup/{models-KnqBv0hE.mjs → models-DfLmPV0k.mjs} +9 -18
  52. package/dist/.setup/{native-auth-rWbGbMn3.mjs → native-auth-CuG53tu4.mjs} +4 -4
  53. package/dist/.setup/{native-execution-policy-umd0tgh4.mjs → native-execution-policy-BxZJy5mP.mjs} +5 -30
  54. package/dist/.setup/{native-subagent-monitor-D3filLY2.mjs → native-subagent-monitor-BwkQXf9e.mjs} +4395 -3609
  55. package/dist/.setup/native-subagent-pending-assignments-DwkCzLvD.mjs +203 -0
  56. package/dist/.setup/native-task-assignments-DMQ0g3hu.mjs +194 -0
  57. package/dist/.setup/{node-cli-sessions-r3avj02l.mjs → node-cli-sessions-HC4W6FLI.mjs} +19 -49
  58. package/dist/.setup/{node-exec-server.runtime-BDwWXVpK.mjs → node-exec-server.runtime-BgBfWQqo.mjs} +3 -6
  59. package/dist/.setup/{plan-CN3VwfNU.mjs → plan-DPdMk1Oy.mjs} +49 -92
  60. package/dist/.setup/{plugin-activation-DT3MNtqj.mjs → plugin-activation-cNHRfaxU.mjs} +8 -36
  61. package/dist/.setup/{plugin-app-cache-key-B2CsSdnV.mjs → plugin-app-cache-key-BL9B5H0L.mjs} +6 -23
  62. package/dist/.setup/{plugin-inventory-BoRei8Z4.mjs → plugin-inventory-Cky2XJUw.mjs} +21 -21
  63. package/dist/.setup/{plugin-marketplace-discovery-CDOi8IFs.mjs → plugin-marketplace-discovery-D_dV9FXa.mjs} +18 -24
  64. package/dist/.setup/{plugin-metadata-cache-Ctmo83k_.mjs → plugin-metadata-cache-BRwtRct9.mjs} +116 -176
  65. package/dist/.setup/{provider-BOsxQHOM.mjs → provider-D6F_7p1I.mjs} +11 -14
  66. package/dist/.setup/{provider-capabilities-BfE88FZ5.mjs → provider-capabilities-DG5qbsUZ.mjs} +13 -18
  67. package/dist/.setup/{rate-limits-CMU3DUD0.mjs → rate-limits-B7-X2TgG.mjs} +9 -31
  68. package/dist/.setup/{request-D2L0zMrq.mjs → request-BZOfsSXW.mjs} +7 -6
  69. package/dist/.setup/responses-oauth-twnuTaAa.mjs +93 -0
  70. package/dist/.setup/rpc-error-BlD2vuzn.mjs +31 -0
  71. package/dist/.setup/{run-attempt-BHu11r7h.mjs → run-attempt-dYJhjZrp.mjs} +1035 -1023
  72. package/dist/.setup/{run-attempt-lifecycle-B7JbY4-F.mjs → run-attempt-lifecycle-C-6O3Exn.mjs} +10 -24
  73. package/dist/.setup/{runtime-artifact-CLZ8udh-.mjs → runtime-artifact-DDQ-HGXf.mjs} +16 -4
  74. package/dist/.setup/runtime-artifact-connection-D68qQn1m.mjs +78 -0
  75. package/dist/.setup/sandbox-guard-DjCz2eOw.mjs +126 -0
  76. package/dist/.setup/scope-DOC1Xjc8.mjs +6 -0
  77. package/dist/.setup/session-binding-DGCYAfvD.mjs +443 -0
  78. package/dist/.setup/{session-binding-record-BGoz8wOK.mjs → session-binding-record-Oe9L-CNY.mjs} +52 -130
  79. package/dist/.setup/{session-binding-sidecars-BlB5EvIS.mjs → session-binding-sidecars-jo6H8dFr.mjs} +196 -17
  80. package/dist/.setup/{session-catalog-Pno1xGcl.mjs → session-catalog-BFafIiF6.mjs} +185 -350
  81. package/dist/.setup/{session-catalog-adoption-BI6UTDZT.mjs → session-catalog-adoption-BU_pHWG7.mjs} +7 -6
  82. package/dist/.setup/{session-catalog-archive-lHBqzhaO.mjs → session-catalog-archive-spHfihri.mjs} +6 -6
  83. package/dist/.setup/session-catalog-events-BMCFMZw-.mjs +139 -0
  84. package/dist/.setup/session-catalog-home-id-vlih0B_g.mjs +22 -0
  85. package/dist/.setup/{session-catalog-index-B9_VQIUz.mjs → session-catalog-index-DwJjnF5k.mjs} +126 -122
  86. package/dist/.setup/{session-catalog-index-order-hcdz07yN.mjs → session-catalog-index-order-BcQpHks3.mjs} +1 -1
  87. package/dist/.setup/{session-catalog-index-state-Dgh8ORJm.mjs → session-catalog-index-state-TeO7EyO-.mjs} +3 -2
  88. package/dist/.setup/session-catalog-limits-DDxOsQeC.mjs +14 -0
  89. package/dist/.setup/session-catalog-list-request-CvtxrYSe.mjs +170 -0
  90. package/dist/.setup/session-catalog-native-projection-CuaFZuQE.mjs +178 -0
  91. package/dist/.setup/{session-catalog-node-adoption-ITddWx_X.mjs → session-catalog-node-adoption-DgXvSGu0.mjs} +10 -27
  92. package/dist/.setup/{session-catalog-node-continue-6g6qi4A9.mjs → session-catalog-node-continue-DjKXHBbi.mjs} +8 -10
  93. package/dist/.setup/session-catalog-node-lookup-CtAXI5W5.mjs +56 -0
  94. package/dist/.setup/{session-catalog-native-projection-DowriLid.mjs → session-catalog-parsing-CPGaPYr-.mjs} +11 -194
  95. package/dist/.setup/{session-catalog-projection-zK_PUsiE.mjs → session-catalog-projection-CGfzfP93.mjs} +6 -4
  96. package/dist/.setup/session-catalog-provenance-DoAvktcj.mjs +95 -0
  97. package/dist/.setup/{session-cli-irrD-uo7.mjs → session-cli-DlmBHYIe.mjs} +9 -22
  98. package/dist/.setup/{session-history-BrqhSCf9.mjs → session-history-D83lJWHG.mjs} +4 -6
  99. package/dist/.setup/{session-history-import-D-3wAgOP.mjs → session-history-import-WhX-X33a.mjs} +7 -10
  100. package/dist/.setup/session-history-read-Ov3StuL4.mjs +133 -0
  101. package/dist/.setup/{session-history.worker-CaCh0xF_.mjs → session-history.worker-MnPKncqP.mjs} +9 -5
  102. package/dist/.setup/session-initialization-6aveB9qb.mjs +22 -0
  103. package/dist/.setup/{session-permission-policy-BI1QK_98.mjs → session-permission-policy-Ci_fVX6y.mjs} +4 -8
  104. package/dist/.setup/{session-retirement-BH-S6qkJ.mjs → session-retirement-LlYWBKTJ.mjs} +17 -17
  105. package/dist/.setup/{settled-turn-context-fmwouT5I.mjs → settled-turn-context-D4yj4rxf.mjs} +1 -1
  106. package/dist/.setup/{settled-turn-finalizer-DiAi6Kx6.mjs → settled-turn-finalizer-DW9W3gza.mjs} +14 -10
  107. package/dist/.setup/{shared-client-DA4VR4Eb.mjs → shared-client-CJCTeFpQ.mjs} +783 -412
  108. package/dist/.setup/shared-client-lifecycle-7xgtlo15.mjs +153 -0
  109. package/dist/.setup/{side-question-BJ1wSDcB.mjs → side-question-BLeGj7TQ.mjs} +79 -143
  110. package/dist/.setup/{source-CUzJq5WN.mjs → source-CJis_1EF.mjs} +80 -137
  111. package/dist/.setup/{thread-lifecycle-B3mfz1TG.mjs → thread-lifecycle-_bAbjedG.mjs} +294 -737
  112. package/dist/.setup/{thread-ownership-DcTtAcXj.mjs → thread-ownership-B6pPt21M.mjs} +45 -10
  113. package/dist/.setup/{incognito-session-uhrBF6wJ.mjs → thread-ownership-queue-Dp24d7-F.mjs} +1 -2
  114. package/dist/.setup/{thread-policy-DGuQsuFC.mjs → thread-policy-gNPzzpVp.mjs} +46 -7
  115. package/dist/.setup/{thread-requests-BLvGkP2R.mjs → thread-requests-OWGOiDaV.mjs} +199 -302
  116. package/dist/.setup/{thread-resume-DIBXwOpE.mjs → thread-resume-GOry0AYh.mjs} +6 -6
  117. package/dist/.setup/{timeout-C910MdAB.mjs → timeout-CXOfNoaX.mjs} +1 -35
  118. package/dist/.setup/{transcript-history-projection-ZZpkFkJ_.mjs → transcript-history-projection-DRSifI-1.mjs} +17 -89
  119. package/dist/.setup/{transcript-mirror-attestation-CzM-94NC.mjs → transcript-mirror-attestation-YSegaktH.mjs} +3 -4
  120. package/dist/.setup/{transcript-mirror-BtHDBp1G.mjs → transcript-mirror-kxmCYsuF.mjs} +7 -9
  121. package/dist/.setup/{transport-stdio-h2VHOskC.mjs → transport-stdio-Bdegpn2V.mjs} +5 -22
  122. package/dist/.setup/transport-websocket-BTBE-LD9.mjs +211 -0
  123. package/dist/.setup/{upstream-prompt-provenance-LphB8slG.mjs → upstream-prompt-provenance-fXkKbPVC.mjs} +3 -9
  124. package/dist/.setup/{upstream-session-fork-BUr4OUbC.mjs → upstream-session-fork-gkdRj2yH.mjs} +23 -23
  125. package/dist/.setup/{usage-BML0r-ua.mjs → usage-CApUvLOV.mjs} +4 -4
  126. package/dist/.setup/{usage-limit-error-DUMbefVY.mjs → usage-limit-error-wSMQkbpV.mjs} +4 -19
  127. package/dist/.setup/{web-search-provider.runtime-CDKlN-Rv.mjs → web-search-provider.runtime-UKgeiBUG.mjs} +8 -19
  128. package/dist/api.js +9 -11
  129. package/dist/catalog-page.worker.js +1 -1
  130. package/dist/cli-metadata.js +1 -1
  131. package/dist/doctor-contract-api.js +50 -8
  132. package/dist/harness.js +344 -1
  133. package/dist/index.js +193 -245
  134. package/dist/media-understanding-provider.js +9 -22
  135. package/dist/migration-provider-api.js +1 -1
  136. package/dist/provider-discovery.js +1 -1
  137. package/dist/session-history-worker-runtime.js +3 -3
  138. package/dist/session-history.worker.js +1 -1
  139. package/openclaw.plugin.json +14 -2
  140. package/package.json +7 -6
  141. package/dist/.setup/attempt-workspace-context-DUVEn_CS.mjs +0 -331
  142. package/dist/.setup/compact-Du5UvtxA.mjs +0 -680
  143. package/dist/.setup/event-projector-assistant-message-BsruvNrH.mjs +0 -103
  144. package/dist/.setup/event-projector-items-C6L_5ZiT.mjs +0 -234
  145. package/dist/.setup/harness-a_MsE4-_.mjs +0 -355
  146. package/dist/.setup/history-rejection-B4nOXNXF.mjs +0 -13
  147. package/dist/.setup/image-payload-sanitizer-tupAr-2o.mjs +0 -79
  148. package/dist/.setup/local-runtime-attribution-B_2mnqhb.mjs +0 -19
  149. package/dist/.setup/native-subagent-history-0nYYgo0k.mjs +0 -148
  150. package/dist/.setup/native-subagent-task-ids-wb8CKZGN.mjs +0 -441
  151. package/dist/.setup/plugin-approval-roundtrip-C0MZzCuP.mjs +0 -122
  152. package/dist/.setup/rolldown-runtime-8H4AJuhK.mjs +0 -14
  153. package/dist/.setup/sandbox-guard-C2sRMOEY.mjs +0 -166
  154. package/dist/.setup/session-binding-Cm0apEbd.mjs +0 -692
  155. package/dist/.setup/session-catalog-events-Bj6j94E_.mjs +0 -347
  156. package/dist/.setup/session-history-read-B3ZfSUbF.mjs +0 -50
  157. package/dist/.setup/session-initialization-rcgbZiid.mjs +0 -75
  158. package/dist/.setup/thread-history-page-DoVpnHim.mjs +0 -83
@@ -1,680 +0,0 @@
1
- import { m as sessionBindingIdentity } from "./session-binding-record-BGoz8wOK.mjs";
2
- import { i as isJsonObject } from "./protocol-CANUwXJ3.mjs";
3
- import { n as withCodexAppServerThreadMutation, t as isIncognitoSessionKey } from "./incognito-session-uhrBF6wJ.mjs";
4
- import { o as CodexAppServerRpcError } from "./timeout-C910MdAB.mjs";
5
- import { i as resolveCodexBindingAppServerConnection } from "./binding-connection-ThoatDcb.mjs";
6
- import { N as consumeCodexAppServerLiveThread, W as retainCodexAppServerLiveThread, c as getLeasedSharedCodexAppServerClient, h as releaseLeasedSharedCodexAppServerClient } from "./shared-client-DA4VR4Eb.mjs";
7
- import { u as isCodexAppServerPrewriteRequestCancellationError } from "./client-Cs08OXVQ.mjs";
8
- import { b as readCodexNotificationTurnId, l as isCodexNoActiveTurnInterruptError, o as closeCodexStartupClientBestEffort, p as unsubscribeCodexThreadBestEffort, r as CodexAppServerUnsafeSubscriptionError, y as readCodexNotificationThreadId } from "./attempt-client-cleanup-CEv1cKwF.mjs";
9
- import { c as readCodexNotificationItem, n as readCodexThreadContextSnapshot } from "./event-projector-usage-CnBS8Wa3.mjs";
10
- import { o as resolveCodexSessionBinding, t as CODEX_APP_SERVER_BINDING_GUARDED_REQUEST_TIMEOUT_MS } from "./session-binding-Cm0apEbd.mjs";
11
- import { i as assertCodexSupervisionThreadLineage } from "./thread-policy-DGuQsuFC.mjs";
12
- import { t as resumeCodexAppServerThread } from "./thread-resume-DIBXwOpE.mjs";
13
- import { t as isSameCodexAppServerThreadOwner } from "./thread-ownership-DcTtAcXj.mjs";
14
- import { t as persistCodexContextCompactionActivity } from "./context-compaction-activity-CMla5FPJ.mjs";
15
- import { t as resolveCodexNativeExecutionBlock } from "./sandbox-guard-C2sRMOEY.mjs";
16
- import { asOptionalRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
17
- import { coerceErrorMessage } from "openclaw/plugin-sdk/error-runtime";
18
- import { AsyncLocalStorage } from "node:async_hooks";
19
- import { createDeferred } from "openclaw/plugin-sdk/extension-shared";
20
- import { resolveAgentDir } from "openclaw/plugin-sdk/agent-runtime";
21
- import { embeddedAgentLog, resolveCompactionTimeoutMs } from "openclaw/plugin-sdk/agent-harness-runtime";
22
- import { createDedupeCache } from "openclaw/plugin-sdk/dedupe-runtime";
23
- //#region extensions/codex/src/app-server/compact.ts
24
- const warnedIgnoredCompactionOverrides = createDedupeCache({
25
- ttlMs: 0,
26
- maxSize: 4096
27
- });
28
- const CODEX_NATIVE_COMPACTION_INTERRUPT_GRACE_MS = 3e4;
29
- function watchCodexNativeCompactionCompletion(params) {
30
- const runOutsideBindingLease = AsyncLocalStorage.snapshot();
31
- let settled = false;
32
- let requestStarted = false;
33
- let abortRequested = false;
34
- let interruptRequested = false;
35
- let retirementStarted = false;
36
- let compactionTurnId;
37
- let compactionItemId;
38
- let compactionItemCompleted = false;
39
- let tokensAfter;
40
- const { promise: completion, resolve: resolveCompletion } = createDeferred();
41
- let removeNotificationHandler = () => {};
42
- let removeCloseHandler = () => {};
43
- let removeAbortHandler = () => {};
44
- let completionTimeout;
45
- let interruptGraceTimeout;
46
- const finish = (result) => {
47
- if (settled) return;
48
- settled = true;
49
- removeNotificationHandler();
50
- removeCloseHandler();
51
- removeAbortHandler();
52
- clearTimeout(completionTimeout);
53
- clearTimeout(interruptGraceTimeout);
54
- resolveCompletion(result);
55
- };
56
- const complete = () => finish({
57
- completed: true,
58
- ...compactionTurnId ? { turnId: compactionTurnId } : {},
59
- ...compactionItemId ? { itemId: compactionItemId } : {},
60
- ...tokensAfter !== void 0 ? { tokensAfter } : {}
61
- });
62
- const fail = (reason) => finish({
63
- completed: false,
64
- reason
65
- });
66
- const retireUnconfirmed = (reason) => {
67
- if (settled || retirementStarted) return;
68
- retirementStarted = true;
69
- runOutsideBindingLease(() => params.retireUnconfirmed()).then(() => fail(reason)).catch((error) => {
70
- embeddedAgentLog.error("failed to retire unconfirmed codex app-server compaction", {
71
- threadId: params.threadId,
72
- turnId: compactionTurnId,
73
- reason: coerceErrorMessage(error)
74
- });
75
- });
76
- };
77
- const requestInterrupt = () => {
78
- if (settled || !requestStarted || !abortRequested || !compactionTurnId || interruptRequested) return;
79
- interruptRequested = true;
80
- params.client.request("turn/interrupt", {
81
- threadId: params.threadId,
82
- turnId: compactionTurnId
83
- }, { timeoutMs: Math.max(1, params.interruptGraceMs) }).catch((error) => {
84
- if (isCodexNoActiveTurnInterruptError(error)) return;
85
- embeddedAgentLog.warn("codex app-server compaction interrupt request failed", {
86
- threadId: params.threadId,
87
- turnId: compactionTurnId,
88
- reason: coerceErrorMessage(error)
89
- });
90
- });
91
- };
92
- const beginInterruptGrace = () => {
93
- if (settled || !requestStarted || interruptGraceTimeout) return;
94
- requestInterrupt();
95
- interruptGraceTimeout = setTimeout(() => {
96
- embeddedAgentLog.warn("codex app-server compaction did not reach terminal state after interruption", {
97
- threadId: params.threadId,
98
- turnId: compactionTurnId,
99
- interruptGraceMs: params.interruptGraceMs
100
- });
101
- retireUnconfirmed("codex app-server compaction did not reach terminal state after interruption");
102
- }, Math.max(1, params.interruptGraceMs));
103
- interruptGraceTimeout.unref?.();
104
- };
105
- const beginCompletionTimeout = () => {
106
- completionTimeout = setTimeout(() => {
107
- abortRequested = true;
108
- beginInterruptGrace();
109
- embeddedAgentLog.warn("codex app-server compaction exceeded its completion budget", {
110
- threadId: params.threadId,
111
- timeoutMs: params.timeoutMs,
112
- interruptRequested
113
- });
114
- }, Math.max(1, params.timeoutMs));
115
- completionTimeout.unref?.();
116
- };
117
- removeNotificationHandler = params.client.addNotificationHandler((notification) => {
118
- if (!requestStarted) return;
119
- if (!isJsonObject(notification.params)) return;
120
- if (readCodexNotificationThreadId(notification.params) !== params.threadId) return;
121
- const notificationTurnId = readCodexNotificationTurnId(notification.params);
122
- if (notification.method === "turn/started") {
123
- compactionTurnId = notificationTurnId;
124
- requestInterrupt();
125
- return;
126
- }
127
- if (compactionTurnId && notificationTurnId !== compactionTurnId) return;
128
- if (notification.method === "thread/tokenUsage/updated") {
129
- tokensAfter = readCodexThreadContextSnapshot(notification.params).activeContextTokens ?? tokensAfter;
130
- return;
131
- }
132
- const item = readCodexNotificationItem(notification.params);
133
- if (item?.type === "contextCompaction") {
134
- if (notification.method === "item/started") {
135
- compactionTurnId = compactionTurnId ?? notificationTurnId;
136
- compactionItemId = item.id;
137
- requestInterrupt();
138
- return;
139
- }
140
- if (notification.method === "item/completed" && compactionItemId === item.id) {
141
- compactionItemCompleted = true;
142
- return;
143
- }
144
- }
145
- if (notification.method !== "turn/completed" || !compactionTurnId || notificationTurnId !== compactionTurnId) return;
146
- const turn = isJsonObject(notification.params.turn) ? notification.params.turn : void 0;
147
- const status = typeof turn?.status === "string" ? turn.status : void 0;
148
- if (status !== "completed") {
149
- fail(`codex app-server compaction turn ended with status ${status ?? "unknown"}`);
150
- return;
151
- }
152
- const incompleteReason = !compactionItemId ? "codex app-server compaction turn completed without a compaction item" : !compactionItemCompleted ? "codex app-server compaction turn completed before its compaction item" : void 0;
153
- if (incompleteReason) {
154
- fail(incompleteReason);
155
- return;
156
- }
157
- complete();
158
- });
159
- removeCloseHandler = params.client.addCloseHandler(() => {
160
- retireUnconfirmed("codex app-server closed before native compaction completed");
161
- });
162
- if (params.signal) {
163
- const onAbort = () => {
164
- abortRequested = true;
165
- beginInterruptGrace();
166
- };
167
- params.signal.addEventListener("abort", onAbort, { once: true });
168
- removeAbortHandler = () => params.signal?.removeEventListener("abort", onAbort);
169
- if (params.signal.aborted) onAbort();
170
- }
171
- return {
172
- completion,
173
- beginRequest: () => {
174
- requestStarted = true;
175
- beginCompletionTimeout();
176
- if (abortRequested) beginInterruptGrace();
177
- },
178
- confirmRequestRejected: () => fail("codex app-server rejected the compaction request"),
179
- retireUnconfirmedRequest: async (reason) => {
180
- retireUnconfirmed(reason);
181
- return await completion;
182
- },
183
- cancel: () => {
184
- if (!requestStarted) fail("compaction request did not start");
185
- }
186
- };
187
- }
188
- async function runExclusiveCodexNativeCompaction(threadId, signal, run) {
189
- signal?.throwIfAborted();
190
- let started = false;
191
- const queued = withCodexAppServerThreadMutation(threadId, async () => {
192
- started = true;
193
- signal?.throwIfAborted();
194
- return run();
195
- });
196
- if (!signal) return queued;
197
- let removeAbortListener = () => {};
198
- const aborted = new Promise((_, reject) => {
199
- const onAbort = () => {
200
- if (!started) reject(signal.reason instanceof Error ? signal.reason : /* @__PURE__ */ new Error("compaction aborted"));
201
- };
202
- removeAbortListener = () => signal.removeEventListener("abort", onAbort);
203
- signal.addEventListener("abort", onAbort, { once: true });
204
- });
205
- try {
206
- return await Promise.race([queued, aborted]);
207
- } finally {
208
- removeAbortListener();
209
- }
210
- }
211
- /**
212
- * Starts native Codex compaction for a manually requested bound session, or
213
- * reports why Codex-owned automatic compaction should handle the trigger.
214
- */
215
- async function maybeCompactCodexAppServerSession(params, options) {
216
- warnIfIgnoringOpenClawCompactionOverrides(params);
217
- return compactCodexNativeThread(params, options);
218
- }
219
- function warnIfIgnoringOpenClawCompactionOverrides(params) {
220
- const ignoredConfig = readIgnoredCompactionOverridePaths(params);
221
- if (ignoredConfig.length === 0) return;
222
- const warningKey = ignoredConfig.join("\0");
223
- if (warnedIgnoredCompactionOverrides.check(warningKey)) return;
224
- embeddedAgentLog.warn("ignoring OpenClaw compaction overrides for Codex app-server compaction; Codex uses native server-side compaction", {
225
- sessionId: params.sessionId,
226
- sessionKey: params.sessionKey,
227
- ignoredConfig
228
- });
229
- }
230
- function readIgnoredCompactionOverridePaths(params) {
231
- const compaction = asOptionalRecord(params.config?.agents?.defaults?.compaction);
232
- return [
233
- "model",
234
- "thinkingLevel",
235
- "provider"
236
- ].flatMap((field) => {
237
- const value = compaction?.[field];
238
- return typeof value === "string" && value.trim() ? [`agents.defaults.compaction.${field}`] : [];
239
- });
240
- }
241
- async function compactCodexNativeThread(params, options) {
242
- if (params.trigger !== "manual" && !options.allowNonManualNativeRequest) {
243
- embeddedAgentLog.info("skipping codex app-server compaction for non-manual trigger", {
244
- sessionId: params.sessionId,
245
- sessionKey: params.sessionKey,
246
- trigger: params.trigger
247
- });
248
- return codexNativeCompactionResult(params, {
249
- compacted: false,
250
- reason: "codex app-server owns automatic compaction",
251
- details: {
252
- backend: "codex-app-server",
253
- skipped: true,
254
- reason: "non_manual_trigger",
255
- trigger: params.trigger ?? "unknown"
256
- }
257
- });
258
- }
259
- const sandbox = params.sandbox;
260
- const nativeExecutionBlock = resolveCodexNativeExecutionBlock({
261
- config: params.config,
262
- sessionKey: params.sandboxSessionKey ?? params.sessionKey,
263
- sessionId: params.sessionId,
264
- agentId: params.sandboxAgentId ?? params.agentId,
265
- sandbox,
266
- surface: "native compaction"
267
- });
268
- if (nativeExecutionBlock) return {
269
- ok: false,
270
- compacted: false,
271
- reason: nativeExecutionBlock
272
- };
273
- const bindingIdentity = sessionBindingIdentity({
274
- sessionId: params.sessionId,
275
- sessionKey: params.sessionKey,
276
- agentId: params.agentId,
277
- config: params.config
278
- });
279
- const abortedResult = (expectedThreadId, currentThreadId = expectedThreadId) => options.allowNonManualNativeRequest ? skippedCodexNativeCompactionResult(params, {
280
- reason: "codex app-server compaction aborted before native compaction",
281
- code: "aborted_before_native_compaction",
282
- request: options.nativeCompactionRequest ?? "after_context_engine",
283
- ...expectedThreadId ? {
284
- expectedThreadId,
285
- currentThreadId
286
- } : {}
287
- }) : {
288
- ok: false,
289
- compacted: false,
290
- reason: "codex app-server compaction aborted while waiting to start"
291
- };
292
- let resolvedBinding;
293
- try {
294
- resolvedBinding = await resolveCodexSessionBinding({
295
- bindingStore: options.bindingStore,
296
- identity: bindingIdentity,
297
- config: params.config,
298
- storePath: params.sessionTarget?.storePath,
299
- signal: params.abortSignal
300
- });
301
- } catch (error) {
302
- if (!params.abortSignal?.aborted) throw error;
303
- return abortedResult(options.bindingStore.read(bindingIdentity)?.threadId);
304
- }
305
- const { binding: initialBinding, assertCurrent } = resolvedBinding;
306
- if (!initialBinding?.threadId) return failedCodexThreadBindingCompactionResult(params, {
307
- reason: "no codex app-server thread binding",
308
- recovery: "missing_thread_binding"
309
- });
310
- if (params.nativeToolSurface === "host-isolated" || initialBinding.nativeToolPolicyRestricted === true || initialBinding.ringZeroConfigFingerprint !== void 0) return codexNativeCompactionResult(params, {
311
- compacted: false,
312
- reason: "native compaction is unavailable for a host-isolated Codex session",
313
- details: {
314
- backend: "codex-app-server",
315
- skipped: true,
316
- reason: "native_tool_policy_restricted",
317
- expectedThreadId: initialBinding.threadId
318
- }
319
- });
320
- let binding = initialBinding;
321
- const requestedAuthProfileId = params.authProfileId?.trim() || void 0;
322
- let connection;
323
- try {
324
- const config = params.config ?? {};
325
- connection = await resolveCodexBindingAppServerConnection({
326
- binding,
327
- authProfileId: requestedAuthProfileId ?? binding.authProfileId,
328
- pluginConfig: options.pluginConfig,
329
- config,
330
- assertCurrent,
331
- agentDir: resolveAgentDir(config, bindingIdentity.agentId)
332
- });
333
- } catch (error) {
334
- return {
335
- ok: false,
336
- compacted: false,
337
- reason: coerceErrorMessage(error)
338
- };
339
- }
340
- const { appServer, usesSupervisionConnection } = connection;
341
- if (!usesSupervisionConnection && requestedAuthProfileId && binding.authProfileId && binding.authProfileId !== requestedAuthProfileId) return {
342
- ok: false,
343
- compacted: false,
344
- reason: "auth profile mismatch for session binding"
345
- };
346
- const shouldReleaseDefaultLease = !options.clientFactory;
347
- const clientFactory = options.clientFactory ?? getLeasedSharedCodexAppServerClient;
348
- const runtimeAuthPlan = params.runtimeAuthPlan ?? params.runtimePlan?.auth;
349
- const usesPreparedApiKey = !usesSupervisionConnection && appServer.start.homeScope !== "user" && runtimeAuthPlan?.modelRoute?.authRequirement === "api-key";
350
- const preparedApiKey = usesPreparedApiKey ? params.resolvedApiKey?.trim() : void 0;
351
- if (usesPreparedApiKey && !preparedApiKey) return {
352
- ok: false,
353
- compacted: false,
354
- reason: "Prepared Codex Platform compaction route is missing its resolved API key."
355
- };
356
- try {
357
- return await runExclusiveCodexNativeCompaction(binding.threadId, params.abortSignal, async () => {
358
- assertCurrent();
359
- const client = await clientFactory({
360
- startOptions: appServer.start,
361
- ...preparedApiKey ? { preparedAuth: {
362
- kind: "api-key",
363
- apiKey: preparedApiKey
364
- } } : { authProfileId: connection.clientAuthProfileId },
365
- agentDir: params.agentDir,
366
- config: params.config,
367
- assertCurrent
368
- });
369
- let releaseThreadSubscription;
370
- let retainedThreadOwnership;
371
- let compactionSucceeded = false;
372
- let compactionRequestDefinitelyRejected = false;
373
- let tokensAfter;
374
- const releaseCompactionThread = async (threadId) => {
375
- if (await unsubscribeCodexThreadBestEffort(client, {
376
- threadId,
377
- timeoutMs: 5e3
378
- })) return;
379
- await closeCodexStartupClientBestEffort(client);
380
- throw new CodexAppServerUnsafeSubscriptionError(`Codex compaction thread subscription could not be released: ${threadId}`);
381
- };
382
- const completionWatch = watchCodexNativeCompactionCompletion({
383
- client,
384
- threadId: binding.threadId,
385
- signal: params.abortSignal,
386
- timeoutMs: options.nativeCompletionTimeoutMs ?? resolveCompactionTimeoutMs(params.config),
387
- interruptGraceMs: options.nativeInterruptGraceMs ?? CODEX_NATIVE_COMPACTION_INTERRUPT_GRACE_MS,
388
- retireUnconfirmed: async () => {
389
- releaseThreadSubscription = void 0;
390
- const transportStopped = await client.closeAndWait({
391
- exitTimeoutMs: 5e3,
392
- forceKillDelayMs: 250
393
- });
394
- if (appServer.start.transport === "stdio") {
395
- if (transportStopped.exited) return;
396
- throw new Error("failed to stop unconfirmed codex app-server process");
397
- }
398
- if (usesSupervisionConnection) throw new Error("cannot detach an unconfirmed supervised codex thread");
399
- if (await options.bindingStore.mutate(bindingIdentity, {
400
- kind: "clear",
401
- threadId: binding.threadId
402
- }, assertCurrent)) return;
403
- if (options.bindingStore.read(bindingIdentity)?.threadId !== binding.threadId) return;
404
- throw new Error("failed to detach unconfirmed codex app-server thread binding");
405
- }
406
- });
407
- const acquireThreadSubscription = async (timeoutMs) => {
408
- if (!isIncognitoSessionKey(params.sessionKey)) {
409
- retainedThreadOwnership = await consumeCodexAppServerLiveThread(client, binding.threadId);
410
- if (!retainedThreadOwnership) {
411
- const resumed = await resumeCodexAppServerThread({
412
- client,
413
- abandonClient: async () => closeCodexStartupClientBestEffort(client),
414
- request: {
415
- threadId: binding.threadId,
416
- excludeTurns: true
417
- },
418
- timeoutMs: timeoutMs ?? appServer.requestTimeoutMs,
419
- assertCurrent,
420
- ...params.abortSignal ? { signal: params.abortSignal } : {}
421
- });
422
- releaseThreadSubscription = async () => releaseCompactionThread(binding.threadId);
423
- assertCodexSupervisionThreadLineage(binding, resumed.thread);
424
- } else if (binding.connectionScope === "supervision") {
425
- releaseThreadSubscription = async () => retainedThreadOwnership?.release(binding.threadId);
426
- const { thread } = await client.request("thread/read", {
427
- threadId: binding.threadId,
428
- includeTurns: false
429
- }, { assertCurrent });
430
- assertCurrent();
431
- retainedThreadOwnership.assertCurrent();
432
- assertCodexSupervisionThreadLineage(binding, thread);
433
- }
434
- releaseThreadSubscription ??= async () => releaseCompactionThread(binding.threadId);
435
- }
436
- };
437
- try {
438
- const guardedResult = await options.bindingStore.withLease(bindingIdentity, async () => {
439
- const currentBinding = options.bindingStore.read(bindingIdentity);
440
- if (params.abortSignal?.aborted) {
441
- if (!options.allowNonManualNativeRequest) params.abortSignal.throwIfAborted();
442
- return {
443
- started: false,
444
- result: skippedCodexNativeCompactionResult(params, {
445
- reason: "codex app-server compaction aborted before native compaction",
446
- code: "aborted_before_native_compaction",
447
- request: options.nativeCompactionRequest ?? "after_context_engine",
448
- expectedThreadId: binding.threadId,
449
- currentThreadId: currentBinding?.threadId
450
- })
451
- };
452
- }
453
- assertCurrent();
454
- if (!currentBinding || !isSameNativeCompactionBinding(currentBinding, binding)) {
455
- embeddedAgentLog.warn("codex app-server compaction could not use the thread binding because it changed", {
456
- sessionId: params.sessionId,
457
- sessionKey: params.sessionKey,
458
- expectedThreadId: binding.threadId,
459
- currentThreadId: currentBinding?.threadId
460
- });
461
- const isRequiredPreflight = options.nativeCompactionRequest === "required_preflight";
462
- return {
463
- started: false,
464
- result: options.allowNonManualNativeRequest && !isRequiredPreflight ? skippedCodexNativeCompactionResult(params, {
465
- reason: "codex app-server binding changed before native compaction",
466
- code: "binding_changed_before_native_compaction",
467
- request: options.nativeCompactionRequest ?? "after_context_engine",
468
- expectedThreadId: binding.threadId,
469
- currentThreadId: currentBinding?.threadId
470
- }) : failedCodexThreadBindingCompactionResult(params, {
471
- threadId: currentBinding?.threadId ?? binding.threadId,
472
- reason: "codex app-server binding changed before native compaction",
473
- recovery: "stale_thread_binding"
474
- })
475
- };
476
- }
477
- binding = currentBinding;
478
- const guardedRequestTimeoutMs = options.allowNonManualNativeRequest ? Math.min(appServer.requestTimeoutMs, CODEX_APP_SERVER_BINDING_GUARDED_REQUEST_TIMEOUT_MS) : void 0;
479
- await acquireThreadSubscription(guardedRequestTimeoutMs);
480
- await clearContextEngineProjectionBeforeNativeCompaction({
481
- sessionId: params.sessionId,
482
- bindingStore: options.bindingStore,
483
- identity: bindingIdentity,
484
- binding,
485
- assertCurrent
486
- });
487
- assertCurrent();
488
- try {
489
- completionWatch.beginRequest();
490
- await client.request("thread/compact/start", { threadId: binding.threadId }, {
491
- ...guardedRequestTimeoutMs === void 0 ? {} : { timeoutMs: guardedRequestTimeoutMs },
492
- assertCurrent: () => {
493
- try {
494
- assertCurrent();
495
- } catch (error) {
496
- compactionRequestDefinitelyRejected = true;
497
- throw error;
498
- }
499
- }
500
- });
501
- return {
502
- started: true,
503
- accepted: true
504
- };
505
- } catch (error) {
506
- compactionRequestDefinitelyRejected ||= isCodexAppServerPrewriteRequestCancellationError(error);
507
- if (compactionRequestDefinitelyRejected || error instanceof CodexAppServerRpcError) {
508
- completionWatch.confirmRequestRejected();
509
- if (!compactionRequestDefinitelyRejected) {
510
- await options.bindingStore.mutate(bindingIdentity, {
511
- kind: "set",
512
- binding
513
- }, assertCurrent);
514
- compactionRequestDefinitelyRejected = !isCodexThreadNotFoundError(error);
515
- }
516
- }
517
- return {
518
- started: true,
519
- accepted: false,
520
- error
521
- };
522
- }
523
- });
524
- if (!guardedResult.started) return guardedResult.result;
525
- if (!guardedResult.accepted) {
526
- if (!compactionRequestDefinitelyRejected && !(guardedResult.error instanceof CodexAppServerRpcError)) await completionWatch.retireUnconfirmedRequest(`codex app-server compaction start was unconfirmed: ${coerceErrorMessage(guardedResult.error)}`);
527
- throw guardedResult.error;
528
- }
529
- embeddedAgentLog.info("started codex app-server compaction", {
530
- sessionId: params.sessionId,
531
- threadId: binding.threadId
532
- });
533
- const completion = await completionWatch.completion;
534
- assertCurrent();
535
- if (!completion.completed) throw new Error(completion.reason);
536
- tokensAfter = completion.tokensAfter;
537
- if (completion.turnId && completion.itemId) await persistCodexContextCompactionActivity({
538
- sessionTarget: params.sessionTarget,
539
- config: params.config,
540
- cwd: params.workspaceDir,
541
- runId: params.runId,
542
- threadId: binding.threadId,
543
- turnId: completion.turnId,
544
- itemId: completion.itemId,
545
- timestamp: Date.now()
546
- });
547
- assertCurrent();
548
- embeddedAgentLog.info("completed codex app-server compaction", {
549
- sessionId: params.sessionId,
550
- threadId: binding.threadId
551
- });
552
- compactionSucceeded = true;
553
- } catch (error) {
554
- if (isCodexThreadNotFoundError(error)) return failedCodexThreadBindingCompactionResult(params, {
555
- threadId: binding.threadId,
556
- reason: coerceErrorMessage(error),
557
- recovery: "stale_thread_binding"
558
- });
559
- embeddedAgentLog.warn("codex app-server compaction failed", {
560
- sessionId: params.sessionId,
561
- sessionKey: params.sessionKey,
562
- threadId: binding.threadId,
563
- reason: coerceErrorMessage(error)
564
- });
565
- return {
566
- ok: false,
567
- compacted: false,
568
- reason: coerceErrorMessage(error)
569
- };
570
- } finally {
571
- completionWatch.cancel();
572
- try {
573
- if ((compactionSucceeded || compactionRequestDefinitelyRejected) && retainedThreadOwnership) {
574
- const ownership = retainedThreadOwnership;
575
- const currentBinding = options.bindingStore.read(bindingIdentity);
576
- if (!(isSameCodexAppServerThreadOwner(currentBinding, binding) && await options.bindingStore.withLease(bindingIdentity, async () => {
577
- const leasedBinding = options.bindingStore.read(bindingIdentity);
578
- if (!isSameCodexAppServerThreadOwner(leasedBinding, binding)) return false;
579
- return await retainCodexAppServerLiveThread(client, binding.threadId, ownership.release, ownership.configFingerprint, ownership.serviceTier);
580
- }))) await releaseThreadSubscription?.();
581
- } else await releaseThreadSubscription?.();
582
- } finally {
583
- if (shouldReleaseDefaultLease) releaseLeasedSharedCodexAppServerClient(client);
584
- }
585
- }
586
- const details = {
587
- backend: "codex-app-server",
588
- threadId: binding.threadId,
589
- signal: "thread/compact/start",
590
- pending: false,
591
- completed: true,
592
- ...options.allowNonManualNativeRequest ? {
593
- request: options.nativeCompactionRequest ?? "after_context_engine",
594
- trigger: params.trigger ?? "unknown"
595
- } : {}
596
- };
597
- return codexNativeCompactionResult(params, {
598
- compacted: true,
599
- tokensAfter,
600
- details
601
- });
602
- });
603
- } catch (error) {
604
- if (params.abortSignal?.aborted) return abortedResult(initialBinding.threadId, binding.threadId);
605
- throw error;
606
- }
607
- }
608
- function codexNativeCompactionResult(params, outcome) {
609
- return {
610
- ok: true,
611
- compacted: outcome.compacted,
612
- ...outcome.reason ? { reason: outcome.reason } : {},
613
- result: {
614
- summary: "",
615
- firstKeptEntryId: "",
616
- tokensBefore: params.currentTokenCount ?? 0,
617
- ...outcome.tokensAfter !== void 0 ? { tokensAfter: outcome.tokensAfter } : {},
618
- details: outcome.details
619
- }
620
- };
621
- }
622
- function skippedCodexNativeCompactionResult(params, skipped) {
623
- return codexNativeCompactionResult(params, {
624
- compacted: false,
625
- reason: skipped.reason,
626
- details: {
627
- backend: "codex-app-server",
628
- skipped: true,
629
- reason: skipped.code,
630
- request: skipped.request ?? "after_context_engine",
631
- trigger: params.trigger ?? "unknown",
632
- ...skipped.expectedThreadId ? { expectedThreadId: skipped.expectedThreadId } : {},
633
- ...skipped.currentThreadId ? { currentThreadId: skipped.currentThreadId } : {}
634
- }
635
- });
636
- }
637
- function failedCodexThreadBindingCompactionResult(params, recovery) {
638
- embeddedAgentLog.warn("codex app-server compaction could not use thread binding", {
639
- sessionId: params.sessionId,
640
- sessionKey: params.sessionKey,
641
- threadId: recovery.threadId,
642
- reason: recovery.reason,
643
- recovery: recovery.recovery
644
- });
645
- return {
646
- ok: false,
647
- compacted: false,
648
- reason: recovery.reason,
649
- failure: {
650
- reason: recovery.recovery,
651
- rawError: recovery.reason
652
- }
653
- };
654
- }
655
- async function clearContextEngineProjectionBeforeNativeCompaction(params) {
656
- const contextEngineBinding = params.binding.contextEngine;
657
- if (!contextEngineBinding?.projection) return;
658
- await params.bindingStore.mutate(params.identity, {
659
- kind: "patch",
660
- threadId: params.binding.threadId,
661
- patch: { contextEngine: {
662
- ...contextEngineBinding,
663
- projection: void 0
664
- } }
665
- }, params.assertCurrent);
666
- embeddedAgentLog.info("cleared codex context-engine projection before native compaction", {
667
- sessionId: params.sessionId,
668
- threadId: params.binding.threadId,
669
- previousEpoch: contextEngineBinding.projection.epoch,
670
- previousFingerprint: contextEngineBinding.projection.fingerprint
671
- });
672
- }
673
- function isSameNativeCompactionBinding(current, expected) {
674
- return isSameCodexAppServerThreadOwner(current, expected) && current.authProfileId === expected.authProfileId && current.contextEngine?.engineId === expected.contextEngine?.engineId && current.contextEngine?.policyFingerprint === expected.contextEngine?.policyFingerprint && current.contextEngine?.projection?.mode === expected.contextEngine?.projection?.mode && current.contextEngine?.projection?.epoch === expected.contextEngine?.projection?.epoch && current.contextEngine?.projection?.fingerprint === expected.contextEngine?.projection?.fingerprint;
675
- }
676
- function isCodexThreadNotFoundError(error) {
677
- return coerceErrorMessage(error).toLowerCase().includes("thread not found");
678
- }
679
- //#endregion
680
- export { maybeCompactCodexAppServerSession };