@openclaw/codex 2026.9.5 → 2026.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +2 -0
  2. package/assets/icon.png +0 -0
  3. package/dist/.setup/{account-usage-runtime-C2MOIvfq.mjs → account-usage-runtime-DFhbh1zz.mjs} +6 -6
  4. package/dist/.setup/{apply-CJ0ZfmBG.mjs → apply-D3GcSoSa.mjs} +35 -55
  5. package/dist/.setup/{attempt-client-cleanup-BpYKdTA0.mjs → attempt-client-cleanup-DOP-cW5j.mjs} +179 -73
  6. package/dist/.setup/attempt-workspace-context-C5HigshI.mjs +164 -0
  7. package/dist/.setup/{auth-binding-DhLWa_7K.mjs → auth-binding-BLWz7stm.mjs} +14 -1
  8. package/dist/.setup/{auth-cache-key-QirmgiCo.mjs → auth-cache-key-Dbvq-QgB.mjs} +41 -111
  9. package/dist/.setup/{auth-profile-WqZtZfXN.mjs → auth-profile-B0okYl2D.mjs} +1 -2
  10. package/dist/.setup/auth-profile-health-oHizqgye.mjs +53 -0
  11. package/dist/.setup/auth-profile-recovery-BREezV0L.mjs +14 -0
  12. package/dist/.setup/auth-start-options-BPIPeEX8.mjs +44 -0
  13. package/dist/.setup/{binding-connection-Bm38niE8.mjs → binding-connection-DTtN1KrX.mjs} +2 -2
  14. package/dist/.setup/{binding-connection.runtime-CnRMC0ta.mjs → binding-connection.runtime-6TpgD1M6.mjs} +5 -5
  15. package/dist/.setup/{bounded-turn-BtlZcivC.mjs → bounded-turn-CbjoN2OW.mjs} +140 -37
  16. package/dist/.setup/bounded-turn-isolation-B8K_ylqk.mjs +14 -0
  17. package/dist/.setup/{build-state-Xx9ybZqa.mjs → build-state-Da1_z0kd.mjs} +1 -1
  18. package/dist/.setup/{capabilities-_vXcZGSx.mjs → capabilities-B3WEZl4e.mjs} +2 -10
  19. package/dist/.setup/{client-vXs2929Q.mjs → client-N0JpgSzF.mjs} +635 -872
  20. package/dist/.setup/client-catalog-response-5HHLdcde.mjs +285 -0
  21. package/dist/.setup/{command-dispatch-naHIZwwF.mjs → command-dispatch-BeAoaovI.mjs} +9 -8
  22. package/dist/.setup/{command-formatters-CGEkdawF.mjs → command-formatters-R3ckE3Co.mjs} +36 -64
  23. package/dist/.setup/{command-handlers-BtAJEW1X.mjs → command-handlers-ylTMS00z.mjs} +301 -488
  24. package/dist/.setup/{command-rpc-DHFpn4le.mjs → command-rpc-CGJGUQ6Y.mjs} +40 -28
  25. package/dist/.setup/compact-C2WamavS.mjs +776 -0
  26. package/dist/.setup/{config-CedDWjM-.mjs → config-DKhXquav.mjs} +26 -28
  27. package/dist/.setup/{config-options-BsanJ8QG.mjs → config-options-CzyWLTJt.mjs} +68 -65
  28. package/dist/.setup/{config-parsing-CcB9iPoq.mjs → config-parsing-b088LyhT.mjs} +57 -60
  29. package/dist/.setup/{config-runtime-CeAhl_h4.mjs → config-runtime-C0NbLms1.mjs} +2 -2
  30. package/dist/.setup/{config-security-BRQ2mgW9.mjs → config-security-CE-FcGw9.mjs} +51 -215
  31. package/dist/.setup/{config-utils-DujwEnhg.mjs → config-utils-D0CXecki.mjs} +3 -13
  32. package/dist/.setup/context-engine-projection-PezSESth.mjs +387 -0
  33. package/dist/.setup/{conversation-binding-DhzrpTM6.mjs → conversation-binding-3Min8qvP.mjs} +71 -105
  34. package/dist/.setup/{conversation-binding-data-CrcyZk6O.mjs → conversation-binding-data-C746z5Pn.mjs} +8 -12
  35. package/dist/.setup/{conversation-control-DN53ns41.mjs → conversation-control-CEP8X5JC.mjs} +30 -69
  36. package/dist/.setup/{cyber-failover-DYwbmf1o.mjs → cyber-failover-XV0nNRZu.mjs} +1 -1
  37. package/dist/.setup/{cyber-failover-notice-e9G3J9-e.mjs → cyber-failover-notice-RNpGpTyP.mjs} +1 -1
  38. package/dist/.setup/{dynamic-tools-D16lOp67.mjs → dynamic-tools-DzlsLUuS.mjs} +3136 -3167
  39. package/dist/.setup/{effective-mcp-catalog-K6kLCN8X.mjs → effective-mcp-catalog-CxUtC-xG.mjs} +8 -17
  40. package/dist/.setup/{ephemeral-turn-R1gA8Sn6.mjs → ephemeral-turn-CDsPJOa2.mjs} +9 -6
  41. package/dist/.setup/event-projector-assistant-message-CigreO4K.mjs +69 -0
  42. package/dist/.setup/{event-projector-usage-C7Ntzs-f.mjs → event-projector-usage-03R0I2dM.mjs} +4 -26
  43. package/dist/.setup/event-projector-values-DJSz8BTk.mjs +106 -0
  44. package/dist/.setup/incognito-session-DWYapfwf.mjs +2 -0
  45. package/dist/.setup/{inference-context-fulhZuz8.mjs → inference-context-D-9gWlTR.mjs} +16 -18
  46. package/dist/.setup/inference-dispatch-CMZtjQyz.mjs +359 -0
  47. package/dist/.setup/inference-metadata-CgIf7sOx.mjs +81 -0
  48. package/dist/.setup/inference-proxy-DhcXOgUE.mjs +561 -0
  49. package/dist/.setup/{isolated-completion-B6srt48J.mjs → isolated-completion-Dm3PzxJk.mjs} +15 -11
  50. package/dist/.setup/launch-args-DbFCehO7.mjs +196 -0
  51. package/dist/.setup/{managed-binary-DP6Rib3P.mjs → managed-binary-kiWRhNRE.mjs} +16 -9
  52. package/dist/.setup/{model-catalog-DkvUuBey.mjs → model-catalog-PAuZgJC6.mjs} +14 -14
  53. package/dist/.setup/model-runtime-BdqzOMkU.mjs +11 -0
  54. package/dist/.setup/{models-BDFgm_G-.mjs → models-DHXZtVVk.mjs} +9 -18
  55. package/dist/.setup/{native-auth-BLZGqFjw.mjs → native-auth-CuG53tu4.mjs} +5 -5
  56. package/dist/.setup/{native-execution-policy-YBMHSzC4.mjs → native-execution-policy-BxZJy5mP.mjs} +6 -31
  57. package/dist/.setup/{native-subagent-monitor-B1hxzIOy.mjs → native-subagent-monitor-Dpsmf2wz.mjs} +4422 -3808
  58. package/dist/.setup/native-subagent-pending-assignments-DwkCzLvD.mjs +203 -0
  59. package/dist/.setup/native-task-assignments-DMQ0g3hu.mjs +194 -0
  60. package/dist/.setup/{node-cli-sessions-Cl8b2ZF3.mjs → node-cli-sessions-HC4W6FLI.mjs} +99 -111
  61. package/dist/.setup/node-exec-server.runtime-BgBfWQqo.mjs +244 -0
  62. package/dist/.setup/{plan-xD7WKYTM.mjs → plan-Y-QIvrKB.mjs} +118 -163
  63. package/dist/.setup/{plugin-activation-r8nq5Jzp.mjs → plugin-activation-cNHRfaxU.mjs} +10 -47
  64. package/dist/.setup/{plugin-app-cache-key-BOxKP7db.mjs → plugin-app-cache-key-BL9B5H0L.mjs} +9 -42
  65. package/dist/.setup/{plugin-inventory-DUle8DLz.mjs → plugin-inventory-Cky2XJUw.mjs} +32 -23
  66. package/dist/.setup/{plugin-marketplace-discovery-P-Vndfqq.mjs → plugin-marketplace-discovery-D_dV9FXa.mjs} +22 -25
  67. package/dist/.setup/{plugin-metadata-cache-DsS5buNa.mjs → plugin-metadata-cache-DsjsL1dr.mjs} +328 -318
  68. package/dist/.setup/protocol-CANUwXJ3.mjs +17 -0
  69. package/dist/.setup/provider-DH8NSzGt.mjs +51 -0
  70. package/dist/.setup/{provider-capabilities-B8J4Dy-O.mjs → provider-capabilities-CAxoF-X1.mjs} +35 -12
  71. package/dist/.setup/{rate-limits-DOEGYRNs.mjs → rate-limits-B7-X2TgG.mjs} +123 -166
  72. package/dist/.setup/{request-BioXJLYa.mjs → request-BHZ1nz8d.mjs} +25 -16
  73. package/dist/.setup/responses-oauth-twnuTaAa.mjs +93 -0
  74. package/dist/.setup/rpc-error-BlD2vuzn.mjs +31 -0
  75. package/dist/.setup/{run-attempt-rlA07pUv.mjs → run-attempt-D8RZUOzY.mjs} +2046 -1454
  76. package/dist/.setup/{run-attempt-lifecycle-B7JbY4-F.mjs → run-attempt-lifecycle-C-6O3Exn.mjs} +10 -24
  77. package/dist/.setup/{runtime-artifact-Dy38Z5iU.mjs → runtime-artifact-DDQ-HGXf.mjs} +43 -47
  78. package/dist/.setup/runtime-artifact-connection-D68qQn1m.mjs +78 -0
  79. package/dist/.setup/sandbox-guard-DjCz2eOw.mjs +126 -0
  80. package/dist/.setup/scope-DOC1Xjc8.mjs +6 -0
  81. package/dist/.setup/session-binding-DGCYAfvD.mjs +443 -0
  82. package/dist/.setup/{session-binding-record-TH3xA0zj.mjs → session-binding-record-Oe9L-CNY.mjs} +73 -132
  83. package/dist/.setup/{session-binding-sidecars-CKYEcfNn.mjs → session-binding-sidecars-jo6H8dFr.mjs} +242 -60
  84. package/dist/.setup/{session-catalog-fUdWDx-U.mjs → session-catalog-4sCdv5qx.mjs} +598 -452
  85. package/dist/.setup/{session-catalog-adoption-CR_whkEW.mjs → session-catalog-adoption-BU_pHWG7.mjs} +59 -26
  86. package/dist/.setup/{session-catalog-archive-CwZaPacf.mjs → session-catalog-archive-spHfihri.mjs} +7 -7
  87. package/dist/.setup/session-catalog-events-DePDzzjc.mjs +139 -0
  88. package/dist/.setup/session-catalog-home-id-vlih0B_g.mjs +22 -0
  89. package/dist/.setup/{session-catalog-index-B141u15s.mjs → session-catalog-index-CZvDzC6z.mjs} +286 -182
  90. package/dist/.setup/{session-catalog-index-order-Cc5BzlQr.mjs → session-catalog-index-order-BcQpHks3.mjs} +2 -2
  91. package/dist/.setup/{session-catalog-index-state-BAuDztHN.mjs → session-catalog-index-state-TeO7EyO-.mjs} +6 -2
  92. package/dist/.setup/session-catalog-limits-DDxOsQeC.mjs +14 -0
  93. package/dist/.setup/session-catalog-list-request-CvtxrYSe.mjs +170 -0
  94. package/dist/.setup/session-catalog-native-projection-DjhwGL6x.mjs +178 -0
  95. package/dist/.setup/{session-catalog-node-adoption-BVRsYOSh.mjs → session-catalog-node-adoption-DgXvSGu0.mjs} +30 -35
  96. package/dist/.setup/{session-catalog-node-continue-Dowv8osw.mjs → session-catalog-node-continue-DjKXHBbi.mjs} +25 -18
  97. package/dist/.setup/session-catalog-node-lookup-CtAXI5W5.mjs +56 -0
  98. package/dist/.setup/{session-catalog-native-projection-ChV3cCtm.mjs → session-catalog-parsing-CPGaPYr-.mjs} +14 -180
  99. package/dist/.setup/{session-catalog-projection-C1Bj9Jl-.mjs → session-catalog-projection-Cr5qP5Dj.mjs} +15 -5
  100. package/dist/.setup/session-catalog-provenance-DoAvktcj.mjs +95 -0
  101. package/dist/.setup/{session-cli-DIj-IE-E.mjs → session-cli-Cn_nCqfq.mjs} +11 -24
  102. package/dist/.setup/{session-history-C--SrLI8.mjs → session-history-D83lJWHG.mjs} +16 -23
  103. package/dist/.setup/{session-history-import-JHXT5Xfi.mjs → session-history-import-WhX-X33a.mjs} +7 -10
  104. package/dist/.setup/session-history-read-Ov3StuL4.mjs +133 -0
  105. package/dist/.setup/{session-history.worker-CpNj7H_P.mjs → session-history.worker-MnPKncqP.mjs} +14 -23
  106. package/dist/.setup/session-initialization-6aveB9qb.mjs +22 -0
  107. package/dist/.setup/{session-permission-policy-DhurXY0l.mjs → session-permission-policy-Ci_fVX6y.mjs} +4 -8
  108. package/dist/.setup/{session-retirement-CU87AOg9.mjs → session-retirement-qMTxkNx2.mjs} +31 -12
  109. package/dist/.setup/{settled-turn-context-fmwouT5I.mjs → settled-turn-context-D4yj4rxf.mjs} +1 -1
  110. package/dist/.setup/{settled-turn-finalizer-CiY2bLFK.mjs → settled-turn-finalizer-BsvEabkw.mjs} +17 -13
  111. package/dist/.setup/{shared-client-BpTtuLQ5.mjs → shared-client-DqyTMYug.mjs} +826 -485
  112. package/dist/.setup/shared-client-lifecycle-DJIgqgMw.mjs +153 -0
  113. package/dist/.setup/{side-question-DSCZyoBD.mjs → side-question-C4kCmQy1.mjs} +206 -334
  114. package/dist/.setup/{source-Bjp4UQij.mjs → source-CS_7GFJZ.mjs} +82 -139
  115. package/dist/.setup/spawn-error-CL3n6MAa.mjs +57 -0
  116. package/dist/.setup/{thread-archive-guard-jmecf6OJ.mjs → thread-archive-guard-C9frICzX.mjs} +10 -3
  117. package/dist/.setup/thread-lifecycle-DPflntEJ.mjs +2362 -0
  118. package/dist/.setup/{incognito-session-uhrBF6wJ.mjs → thread-ownership-queue-Dp24d7-F.mjs} +1 -2
  119. package/dist/.setup/{thread-ownership-skomxnIt.mjs → thread-ownership-roNP0l1c.mjs} +47 -10
  120. package/dist/.setup/thread-policy-DTd-DtkX.mjs +109 -0
  121. package/dist/.setup/thread-requests-B_bRnMGN.mjs +2102 -0
  122. package/dist/.setup/{thread-resume-BkNpj9Pz.mjs → thread-resume-CdDaoc7T.mjs} +6 -6
  123. package/dist/.setup/timeout-CXOfNoaX.mjs +46 -0
  124. package/dist/.setup/transcript-history-projection-DRSifI-1.mjs +201 -0
  125. package/dist/.setup/{transcript-mirror-attestation-CzM-94NC.mjs → transcript-mirror-attestation-YSegaktH.mjs} +3 -4
  126. package/dist/.setup/{transcript-mirror-D4qp_leP.mjs → transcript-mirror-kxmCYsuF.mjs} +224 -206
  127. package/dist/.setup/{transport-stdio-Cmx94Oiy.mjs → transport-stdio-Bdegpn2V.mjs} +138 -75
  128. package/dist/.setup/transport-websocket-BTBE-LD9.mjs +211 -0
  129. package/dist/.setup/{upstream-prompt-provenance-LphB8slG.mjs → upstream-prompt-provenance-fXkKbPVC.mjs} +3 -9
  130. package/dist/.setup/{upstream-session-fork-D3UKxgVD.mjs → upstream-session-fork-CBeVjBpT.mjs} +48 -40
  131. package/dist/.setup/{usage-BOgBEKso.mjs → usage-BMzNxeR_.mjs} +5 -4
  132. package/dist/.setup/{usage-limit-error-C0ow7DOc.mjs → usage-limit-error-QXerDo3i.mjs} +5 -20
  133. package/dist/.setup/{web-search-provider.runtime-CTGuJt6i.mjs → web-search-provider.runtime-P77OUeoo.mjs} +10 -20
  134. package/dist/api.js +25 -16
  135. package/dist/catalog-page-worker-entrypoint.js +12 -0
  136. package/dist/catalog-page.worker.js +9 -0
  137. package/dist/cli-metadata.js +1 -1
  138. package/dist/doctor-contract-api.js +50 -8
  139. package/dist/harness.js +344 -1
  140. package/dist/index.js +345 -346
  141. package/dist/media-understanding-provider.js +9 -22
  142. package/dist/migration-provider-api.js +1 -1
  143. package/dist/provider-discovery.js +1 -1
  144. package/dist/session-history-worker-runtime.js +16 -33
  145. package/dist/session-history.worker.js +1 -1
  146. package/openclaw.plugin.json +14 -2
  147. package/package.json +11 -7
  148. package/dist/.setup/attempt-context-VXVwTCfS.mjs +0 -636
  149. package/dist/.setup/compact-C3i3qlzj.mjs +0 -687
  150. package/dist/.setup/event-projector-assistant-message-DNUR1s0A.mjs +0 -105
  151. package/dist/.setup/event-projector-items-DyTQ_XqL.mjs +0 -200
  152. package/dist/.setup/harness-rxaaoN-o.mjs +0 -349
  153. package/dist/.setup/history-rejection-B4nOXNXF.mjs +0 -13
  154. package/dist/.setup/image-payload-sanitizer-tupAr-2o.mjs +0 -79
  155. package/dist/.setup/inference-proxy-CC15HuSi.mjs +0 -311
  156. package/dist/.setup/launch-args-DnMak49W.mjs +0 -111
  157. package/dist/.setup/local-runtime-attribution-B_2mnqhb.mjs +0 -19
  158. package/dist/.setup/native-subagent-history-YXaL6dMd.mjs +0 -135
  159. package/dist/.setup/native-subagent-task-ids-DsuOonKv.mjs +0 -411
  160. package/dist/.setup/node-exec-server.runtime-BaViBKNz.mjs +0 -226
  161. package/dist/.setup/plugin-approval-roundtrip-CjfzafAZ.mjs +0 -122
  162. package/dist/.setup/provider-fFh_-VR3.mjs +0 -50
  163. package/dist/.setup/rolldown-runtime-8H4AJuhK.mjs +0 -14
  164. package/dist/.setup/sandbox-guard-BBP-RbTf.mjs +0 -166
  165. package/dist/.setup/session-binding-_0W_fHRr.mjs +0 -721
  166. package/dist/.setup/session-catalog-events-jMcYfQyd.mjs +0 -250
  167. package/dist/.setup/session-history-read-B3ZfSUbF.mjs +0 -50
  168. package/dist/.setup/session-initialization-DH1z6fXn.mjs +0 -75
  169. package/dist/.setup/thread-history-page-BTx-4xsg.mjs +0 -83
  170. package/dist/.setup/thread-lifecycle-Cik28qWn.mjs +0 -4904
  171. package/dist/.setup/thread-policy-Cjs4B8xf.mjs +0 -54
  172. package/dist/.setup/timeout-DZF05XrR.mjs +0 -63
  173. package/dist/.setup/transcript-history-projection-DHNBDhCU.mjs +0 -243
  174. package/dist/.setup/version-CoqzXPgK.mjs +0 -12
@@ -1,687 +0,0 @@
1
- import { p as sessionBindingIdentity } from "./session-binding-record-TH3xA0zj.mjs";
2
- import { m as isJsonObject } from "./config-security-BRQ2mgW9.mjs";
3
- import { u as isCodexAppServerPrewriteRequestCancellationError } from "./client-vXs2929Q.mjs";
4
- import { n as withCodexAppServerThreadMutation, t as isIncognitoSessionKey } from "./incognito-session-uhrBF6wJ.mjs";
5
- import { i as CodexAppServerRpcError } from "./timeout-DZF05XrR.mjs";
6
- import { i as resolveCodexBindingAppServerConnection } from "./binding-connection-Bm38niE8.mjs";
7
- import { N as consumeCodexAppServerLiveThread, W as retainCodexAppServerLiveThread, c as getLeasedSharedCodexAppServerClient, h as releaseLeasedSharedCodexAppServerClient } from "./shared-client-BpTtuLQ5.mjs";
8
- import { a as closeCodexStartupClientBestEffort, b as readCodexNotificationTurnId, c as isCodexNoActiveTurnInterruptError, f as unsubscribeCodexThreadBestEffort, r as CodexAppServerUnsafeSubscriptionError, y as readCodexNotificationThreadId } from "./attempt-client-cleanup-BpYKdTA0.mjs";
9
- import { c as readCodexNotificationItem, n as readCodexThreadContextSnapshot } from "./event-projector-usage-C7Ntzs-f.mjs";
10
- import { o as resolveCodexSessionBinding, t as CODEX_APP_SERVER_BINDING_GUARDED_REQUEST_TIMEOUT_MS } from "./session-binding-_0W_fHRr.mjs";
11
- import { r as assertCodexSupervisionThreadLineage } from "./thread-policy-Cjs4B8xf.mjs";
12
- import { t as resumeCodexAppServerThread } from "./thread-resume-BkNpj9Pz.mjs";
13
- import { t as isSameCodexAppServerThreadOwner } from "./thread-ownership-skomxnIt.mjs";
14
- import { t as persistCodexContextCompactionActivity } from "./context-compaction-activity-CMla5FPJ.mjs";
15
- import { t as resolveCodexNativeExecutionBlock } from "./sandbox-guard-BBP-RbTf.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)) {
85
- if (compactionItemCompleted) {
86
- complete();
87
- return;
88
- }
89
- fail("codex app-server compaction reached terminal state without a completed compaction item");
90
- return;
91
- }
92
- embeddedAgentLog.warn("codex app-server compaction interrupt request failed", {
93
- threadId: params.threadId,
94
- turnId: compactionTurnId,
95
- reason: coerceErrorMessage(error)
96
- });
97
- });
98
- };
99
- const beginInterruptGrace = () => {
100
- if (settled || !requestStarted || interruptGraceTimeout) return;
101
- requestInterrupt();
102
- interruptGraceTimeout = setTimeout(() => {
103
- embeddedAgentLog.warn("codex app-server compaction did not reach terminal state after interruption", {
104
- threadId: params.threadId,
105
- turnId: compactionTurnId,
106
- interruptGraceMs: params.interruptGraceMs
107
- });
108
- retireUnconfirmed("codex app-server compaction did not reach terminal state after interruption");
109
- }, Math.max(1, params.interruptGraceMs));
110
- interruptGraceTimeout.unref?.();
111
- };
112
- const beginCompletionTimeout = () => {
113
- completionTimeout = setTimeout(() => {
114
- abortRequested = true;
115
- beginInterruptGrace();
116
- embeddedAgentLog.warn("codex app-server compaction exceeded its completion budget", {
117
- threadId: params.threadId,
118
- timeoutMs: params.timeoutMs,
119
- interruptRequested
120
- });
121
- }, Math.max(1, params.timeoutMs));
122
- completionTimeout.unref?.();
123
- };
124
- removeNotificationHandler = params.client.addNotificationHandler((notification) => {
125
- if (!requestStarted) return;
126
- if (!isJsonObject(notification.params)) return;
127
- if (readCodexNotificationThreadId(notification.params) !== params.threadId) return;
128
- const notificationTurnId = readCodexNotificationTurnId(notification.params);
129
- if (notification.method === "turn/started") {
130
- compactionTurnId = notificationTurnId;
131
- requestInterrupt();
132
- return;
133
- }
134
- if (compactionTurnId && notificationTurnId !== compactionTurnId) return;
135
- if (notification.method === "thread/tokenUsage/updated") {
136
- tokensAfter = readCodexThreadContextSnapshot(notification.params).activeContextTokens ?? tokensAfter;
137
- return;
138
- }
139
- const item = readCodexNotificationItem(notification.params);
140
- if (item?.type === "contextCompaction") {
141
- if (notification.method === "item/started") {
142
- compactionTurnId = compactionTurnId ?? notificationTurnId;
143
- compactionItemId = item.id;
144
- requestInterrupt();
145
- return;
146
- }
147
- if (notification.method === "item/completed" && compactionItemId === item.id) {
148
- compactionItemCompleted = true;
149
- return;
150
- }
151
- }
152
- if (notification.method !== "turn/completed" || !compactionTurnId || notificationTurnId !== compactionTurnId) return;
153
- const turn = isJsonObject(notification.params.turn) ? notification.params.turn : void 0;
154
- const status = typeof turn?.status === "string" ? turn.status : void 0;
155
- if (status !== "completed") {
156
- fail(`codex app-server compaction turn ended with status ${status ?? "unknown"}`);
157
- return;
158
- }
159
- 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;
160
- if (incompleteReason) {
161
- fail(incompleteReason);
162
- return;
163
- }
164
- complete();
165
- });
166
- removeCloseHandler = params.client.addCloseHandler(() => {
167
- retireUnconfirmed("codex app-server closed before native compaction completed");
168
- });
169
- if (params.signal) {
170
- const onAbort = () => {
171
- abortRequested = true;
172
- beginInterruptGrace();
173
- };
174
- params.signal.addEventListener("abort", onAbort, { once: true });
175
- removeAbortHandler = () => params.signal?.removeEventListener("abort", onAbort);
176
- if (params.signal.aborted) onAbort();
177
- }
178
- return {
179
- completion,
180
- beginRequest: () => {
181
- requestStarted = true;
182
- beginCompletionTimeout();
183
- if (abortRequested) beginInterruptGrace();
184
- },
185
- confirmRequestRejected: () => fail("codex app-server rejected the compaction request"),
186
- retireUnconfirmedRequest: async (reason) => {
187
- retireUnconfirmed(reason);
188
- return await completion;
189
- },
190
- cancel: () => {
191
- if (!requestStarted) fail("compaction request did not start");
192
- }
193
- };
194
- }
195
- async function runExclusiveCodexNativeCompaction(threadId, signal, run) {
196
- signal?.throwIfAborted();
197
- let started = false;
198
- const queued = withCodexAppServerThreadMutation(threadId, async () => {
199
- started = true;
200
- signal?.throwIfAborted();
201
- return run();
202
- });
203
- if (!signal) return queued;
204
- let removeAbortListener = () => {};
205
- const aborted = new Promise((_, reject) => {
206
- const onAbort = () => {
207
- if (!started) reject(signal.reason instanceof Error ? signal.reason : /* @__PURE__ */ new Error("compaction aborted"));
208
- };
209
- removeAbortListener = () => signal.removeEventListener("abort", onAbort);
210
- signal.addEventListener("abort", onAbort, { once: true });
211
- });
212
- try {
213
- return await Promise.race([queued, aborted]);
214
- } finally {
215
- removeAbortListener();
216
- }
217
- }
218
- /**
219
- * Starts native Codex compaction for a manually requested bound session, or
220
- * reports why Codex-owned automatic compaction should handle the trigger.
221
- */
222
- async function maybeCompactCodexAppServerSession(params, options) {
223
- warnIfIgnoringOpenClawCompactionOverrides(params);
224
- return compactCodexNativeThread(params, options);
225
- }
226
- function warnIfIgnoringOpenClawCompactionOverrides(params) {
227
- const ignoredConfig = readIgnoredCompactionOverridePaths(params);
228
- if (ignoredConfig.length === 0) return;
229
- const warningKey = ignoredConfig.join("\0");
230
- if (warnedIgnoredCompactionOverrides.check(warningKey)) return;
231
- embeddedAgentLog.warn("ignoring OpenClaw compaction overrides for Codex app-server compaction; Codex uses native server-side compaction", {
232
- sessionId: params.sessionId,
233
- sessionKey: params.sessionKey,
234
- ignoredConfig
235
- });
236
- }
237
- function readIgnoredCompactionOverridePaths(params) {
238
- const compaction = asOptionalRecord(params.config?.agents?.defaults?.compaction);
239
- return [
240
- "model",
241
- "thinkingLevel",
242
- "provider"
243
- ].flatMap((field) => {
244
- const value = compaction?.[field];
245
- return typeof value === "string" && value.trim() ? [`agents.defaults.compaction.${field}`] : [];
246
- });
247
- }
248
- async function compactCodexNativeThread(params, options) {
249
- if (params.trigger !== "manual" && !options.allowNonManualNativeRequest) {
250
- embeddedAgentLog.info("skipping codex app-server compaction for non-manual trigger", {
251
- sessionId: params.sessionId,
252
- sessionKey: params.sessionKey,
253
- trigger: params.trigger
254
- });
255
- return codexNativeCompactionResult(params, {
256
- compacted: false,
257
- reason: "codex app-server owns automatic compaction",
258
- details: {
259
- backend: "codex-app-server",
260
- skipped: true,
261
- reason: "non_manual_trigger",
262
- trigger: params.trigger ?? "unknown"
263
- }
264
- });
265
- }
266
- const sandbox = params.sandbox;
267
- const nativeExecutionBlock = resolveCodexNativeExecutionBlock({
268
- config: params.config,
269
- sessionKey: params.sandboxSessionKey ?? params.sessionKey,
270
- sessionId: params.sessionId,
271
- agentId: params.sandboxAgentId ?? params.agentId,
272
- sandbox,
273
- surface: "native compaction"
274
- });
275
- if (nativeExecutionBlock) return {
276
- ok: false,
277
- compacted: false,
278
- reason: nativeExecutionBlock
279
- };
280
- const bindingIdentity = sessionBindingIdentity({
281
- sessionId: params.sessionId,
282
- sessionKey: params.sessionKey,
283
- agentId: params.agentId,
284
- config: params.config
285
- });
286
- const abortedResult = (expectedThreadId, currentThreadId = expectedThreadId) => options.allowNonManualNativeRequest ? skippedCodexNativeCompactionResult(params, {
287
- reason: "codex app-server compaction aborted before native compaction",
288
- code: "aborted_before_native_compaction",
289
- request: options.nativeCompactionRequest ?? "after_context_engine",
290
- ...expectedThreadId ? {
291
- expectedThreadId,
292
- currentThreadId
293
- } : {}
294
- }) : {
295
- ok: false,
296
- compacted: false,
297
- reason: "codex app-server compaction aborted while waiting to start"
298
- };
299
- let resolvedBinding;
300
- try {
301
- resolvedBinding = await resolveCodexSessionBinding({
302
- bindingStore: options.bindingStore,
303
- identity: bindingIdentity,
304
- config: params.config,
305
- storePath: params.sessionTarget?.storePath,
306
- signal: params.abortSignal
307
- });
308
- } catch (error) {
309
- if (!params.abortSignal?.aborted) throw error;
310
- return abortedResult(options.bindingStore.read(bindingIdentity)?.threadId);
311
- }
312
- const { binding: initialBinding, assertCurrent } = resolvedBinding;
313
- if (!initialBinding?.threadId) return failedCodexThreadBindingCompactionResult(params, {
314
- reason: "no codex app-server thread binding",
315
- recovery: "missing_thread_binding"
316
- });
317
- if (params.nativeToolSurface === "host-isolated" || initialBinding.nativeToolPolicyRestricted === true || initialBinding.ringZeroConfigFingerprint !== void 0) return codexNativeCompactionResult(params, {
318
- compacted: false,
319
- reason: "native compaction is unavailable for a host-isolated Codex session",
320
- details: {
321
- backend: "codex-app-server",
322
- skipped: true,
323
- reason: "native_tool_policy_restricted",
324
- expectedThreadId: initialBinding.threadId
325
- }
326
- });
327
- let binding = initialBinding;
328
- const requestedAuthProfileId = params.authProfileId?.trim() || void 0;
329
- let connection;
330
- try {
331
- const config = params.config ?? {};
332
- connection = await resolveCodexBindingAppServerConnection({
333
- binding,
334
- authProfileId: requestedAuthProfileId ?? binding.authProfileId,
335
- pluginConfig: options.pluginConfig,
336
- config,
337
- assertCurrent,
338
- agentDir: resolveAgentDir(config, bindingIdentity.agentId)
339
- });
340
- } catch (error) {
341
- return {
342
- ok: false,
343
- compacted: false,
344
- reason: coerceErrorMessage(error)
345
- };
346
- }
347
- const { appServer, usesSupervisionConnection } = connection;
348
- if (!usesSupervisionConnection && requestedAuthProfileId && binding.authProfileId && binding.authProfileId !== requestedAuthProfileId) return {
349
- ok: false,
350
- compacted: false,
351
- reason: "auth profile mismatch for session binding"
352
- };
353
- const shouldReleaseDefaultLease = !options.clientFactory;
354
- const clientFactory = options.clientFactory ?? getLeasedSharedCodexAppServerClient;
355
- const runtimeAuthPlan = params.runtimeAuthPlan ?? params.runtimePlan?.auth;
356
- const usesPreparedApiKey = !usesSupervisionConnection && appServer.start.homeScope !== "user" && runtimeAuthPlan?.modelRoute?.authRequirement === "api-key";
357
- const preparedApiKey = usesPreparedApiKey ? params.resolvedApiKey?.trim() : void 0;
358
- if (usesPreparedApiKey && !preparedApiKey) return {
359
- ok: false,
360
- compacted: false,
361
- reason: "Prepared Codex Platform compaction route is missing its resolved API key."
362
- };
363
- try {
364
- return await runExclusiveCodexNativeCompaction(binding.threadId, params.abortSignal, async () => {
365
- assertCurrent();
366
- const client = await clientFactory({
367
- startOptions: appServer.start,
368
- ...preparedApiKey ? { preparedAuth: {
369
- kind: "api-key",
370
- apiKey: preparedApiKey
371
- } } : { authProfileId: connection.clientAuthProfileId },
372
- agentDir: params.agentDir,
373
- config: params.config,
374
- assertCurrent
375
- });
376
- let releaseThreadSubscription;
377
- let retainedThreadOwnership;
378
- let compactionSucceeded = false;
379
- let compactionRequestDefinitelyRejected = false;
380
- let tokensAfter;
381
- const releaseCompactionThread = async (threadId) => {
382
- if (await unsubscribeCodexThreadBestEffort(client, {
383
- threadId,
384
- timeoutMs: 5e3
385
- })) return;
386
- await closeCodexStartupClientBestEffort(client);
387
- throw new CodexAppServerUnsafeSubscriptionError(`Codex compaction thread subscription could not be released: ${threadId}`);
388
- };
389
- const completionWatch = watchCodexNativeCompactionCompletion({
390
- client,
391
- threadId: binding.threadId,
392
- signal: params.abortSignal,
393
- timeoutMs: options.nativeCompletionTimeoutMs ?? resolveCompactionTimeoutMs(params.config),
394
- interruptGraceMs: options.nativeInterruptGraceMs ?? CODEX_NATIVE_COMPACTION_INTERRUPT_GRACE_MS,
395
- retireUnconfirmed: async () => {
396
- releaseThreadSubscription = void 0;
397
- const transportStopped = await client.closeAndWait({
398
- exitTimeoutMs: 5e3,
399
- forceKillDelayMs: 250
400
- });
401
- if (appServer.start.transport === "stdio") {
402
- if (transportStopped.exited) return;
403
- throw new Error("failed to stop unconfirmed codex app-server process");
404
- }
405
- if (usesSupervisionConnection) throw new Error("cannot detach an unconfirmed supervised codex thread");
406
- if (await options.bindingStore.mutate(bindingIdentity, {
407
- kind: "clear",
408
- threadId: binding.threadId
409
- }, assertCurrent)) return;
410
- if (options.bindingStore.read(bindingIdentity)?.threadId !== binding.threadId) return;
411
- throw new Error("failed to detach unconfirmed codex app-server thread binding");
412
- }
413
- });
414
- const acquireThreadSubscription = async (timeoutMs) => {
415
- if (!isIncognitoSessionKey(params.sessionKey)) {
416
- retainedThreadOwnership = await consumeCodexAppServerLiveThread(client, binding.threadId);
417
- if (!retainedThreadOwnership) {
418
- const resumed = await resumeCodexAppServerThread({
419
- client,
420
- abandonClient: async () => closeCodexStartupClientBestEffort(client),
421
- request: {
422
- threadId: binding.threadId,
423
- excludeTurns: true
424
- },
425
- timeoutMs: timeoutMs ?? appServer.requestTimeoutMs,
426
- assertCurrent,
427
- ...params.abortSignal ? { signal: params.abortSignal } : {}
428
- });
429
- releaseThreadSubscription = async () => releaseCompactionThread(binding.threadId);
430
- assertCodexSupervisionThreadLineage(binding, resumed.thread);
431
- } else if (binding.connectionScope === "supervision") {
432
- releaseThreadSubscription = async () => retainedThreadOwnership?.release(binding.threadId);
433
- const { thread } = await client.request("thread/read", {
434
- threadId: binding.threadId,
435
- includeTurns: false
436
- }, { assertCurrent });
437
- assertCurrent();
438
- retainedThreadOwnership.assertCurrent();
439
- assertCodexSupervisionThreadLineage(binding, thread);
440
- }
441
- releaseThreadSubscription ??= async () => releaseCompactionThread(binding.threadId);
442
- }
443
- };
444
- try {
445
- const guardedResult = await options.bindingStore.withLease(bindingIdentity, async () => {
446
- const currentBinding = options.bindingStore.read(bindingIdentity);
447
- if (params.abortSignal?.aborted) {
448
- if (!options.allowNonManualNativeRequest) params.abortSignal.throwIfAborted();
449
- return {
450
- started: false,
451
- result: skippedCodexNativeCompactionResult(params, {
452
- reason: "codex app-server compaction aborted before native compaction",
453
- code: "aborted_before_native_compaction",
454
- request: options.nativeCompactionRequest ?? "after_context_engine",
455
- expectedThreadId: binding.threadId,
456
- currentThreadId: currentBinding?.threadId
457
- })
458
- };
459
- }
460
- assertCurrent();
461
- if (!currentBinding || !isSameNativeCompactionBinding(currentBinding, binding)) {
462
- embeddedAgentLog.warn("codex app-server compaction could not use the thread binding because it changed", {
463
- sessionId: params.sessionId,
464
- sessionKey: params.sessionKey,
465
- expectedThreadId: binding.threadId,
466
- currentThreadId: currentBinding?.threadId
467
- });
468
- const isRequiredPreflight = options.nativeCompactionRequest === "required_preflight";
469
- return {
470
- started: false,
471
- result: options.allowNonManualNativeRequest && !isRequiredPreflight ? skippedCodexNativeCompactionResult(params, {
472
- reason: "codex app-server binding changed before native compaction",
473
- code: "binding_changed_before_native_compaction",
474
- request: options.nativeCompactionRequest ?? "after_context_engine",
475
- expectedThreadId: binding.threadId,
476
- currentThreadId: currentBinding?.threadId
477
- }) : failedCodexThreadBindingCompactionResult(params, {
478
- threadId: currentBinding?.threadId ?? binding.threadId,
479
- reason: "codex app-server binding changed before native compaction",
480
- recovery: "stale_thread_binding"
481
- })
482
- };
483
- }
484
- binding = currentBinding;
485
- const guardedRequestTimeoutMs = options.allowNonManualNativeRequest ? Math.min(appServer.requestTimeoutMs, CODEX_APP_SERVER_BINDING_GUARDED_REQUEST_TIMEOUT_MS) : void 0;
486
- await acquireThreadSubscription(guardedRequestTimeoutMs);
487
- await clearContextEngineProjectionBeforeNativeCompaction({
488
- sessionId: params.sessionId,
489
- bindingStore: options.bindingStore,
490
- identity: bindingIdentity,
491
- binding,
492
- assertCurrent
493
- });
494
- assertCurrent();
495
- try {
496
- completionWatch.beginRequest();
497
- await client.request("thread/compact/start", { threadId: binding.threadId }, {
498
- ...guardedRequestTimeoutMs === void 0 ? {} : { timeoutMs: guardedRequestTimeoutMs },
499
- assertCurrent: () => {
500
- try {
501
- assertCurrent();
502
- } catch (error) {
503
- compactionRequestDefinitelyRejected = true;
504
- throw error;
505
- }
506
- }
507
- });
508
- return {
509
- started: true,
510
- accepted: true
511
- };
512
- } catch (error) {
513
- compactionRequestDefinitelyRejected ||= isCodexAppServerPrewriteRequestCancellationError(error);
514
- if (compactionRequestDefinitelyRejected || error instanceof CodexAppServerRpcError) {
515
- completionWatch.confirmRequestRejected();
516
- if (!compactionRequestDefinitelyRejected) {
517
- await options.bindingStore.mutate(bindingIdentity, {
518
- kind: "set",
519
- binding
520
- }, assertCurrent);
521
- compactionRequestDefinitelyRejected = !isCodexThreadNotFoundError(error);
522
- }
523
- }
524
- return {
525
- started: true,
526
- accepted: false,
527
- error
528
- };
529
- }
530
- });
531
- if (!guardedResult.started) return guardedResult.result;
532
- if (!guardedResult.accepted) {
533
- if (!compactionRequestDefinitelyRejected && !(guardedResult.error instanceof CodexAppServerRpcError)) await completionWatch.retireUnconfirmedRequest(`codex app-server compaction start was unconfirmed: ${coerceErrorMessage(guardedResult.error)}`);
534
- throw guardedResult.error;
535
- }
536
- embeddedAgentLog.info("started codex app-server compaction", {
537
- sessionId: params.sessionId,
538
- threadId: binding.threadId
539
- });
540
- const completion = await completionWatch.completion;
541
- assertCurrent();
542
- if (!completion.completed) throw new Error(completion.reason);
543
- tokensAfter = completion.tokensAfter;
544
- if (completion.turnId && completion.itemId) await persistCodexContextCompactionActivity({
545
- sessionTarget: params.sessionTarget,
546
- config: params.config,
547
- cwd: params.workspaceDir,
548
- runId: params.runId,
549
- threadId: binding.threadId,
550
- turnId: completion.turnId,
551
- itemId: completion.itemId,
552
- timestamp: Date.now()
553
- });
554
- assertCurrent();
555
- embeddedAgentLog.info("completed codex app-server compaction", {
556
- sessionId: params.sessionId,
557
- threadId: binding.threadId
558
- });
559
- compactionSucceeded = true;
560
- } catch (error) {
561
- if (isCodexThreadNotFoundError(error)) return failedCodexThreadBindingCompactionResult(params, {
562
- threadId: binding.threadId,
563
- reason: coerceErrorMessage(error),
564
- recovery: "stale_thread_binding"
565
- });
566
- embeddedAgentLog.warn("codex app-server compaction failed", {
567
- sessionId: params.sessionId,
568
- sessionKey: params.sessionKey,
569
- threadId: binding.threadId,
570
- reason: coerceErrorMessage(error)
571
- });
572
- return {
573
- ok: false,
574
- compacted: false,
575
- reason: coerceErrorMessage(error)
576
- };
577
- } finally {
578
- completionWatch.cancel();
579
- try {
580
- if ((compactionSucceeded || compactionRequestDefinitelyRejected) && retainedThreadOwnership) {
581
- const ownership = retainedThreadOwnership;
582
- const currentBinding = options.bindingStore.read(bindingIdentity);
583
- if (!(isSameCodexAppServerThreadOwner(currentBinding, binding) && await options.bindingStore.withLease(bindingIdentity, async () => {
584
- const leasedBinding = options.bindingStore.read(bindingIdentity);
585
- if (!isSameCodexAppServerThreadOwner(leasedBinding, binding)) return false;
586
- return await retainCodexAppServerLiveThread(client, binding.threadId, ownership.release, ownership.configFingerprint, ownership.serviceTier);
587
- }))) await releaseThreadSubscription?.();
588
- } else await releaseThreadSubscription?.();
589
- } finally {
590
- if (shouldReleaseDefaultLease) releaseLeasedSharedCodexAppServerClient(client);
591
- }
592
- }
593
- const details = {
594
- backend: "codex-app-server",
595
- threadId: binding.threadId,
596
- signal: "thread/compact/start",
597
- pending: false,
598
- completed: true,
599
- ...options.allowNonManualNativeRequest ? {
600
- request: options.nativeCompactionRequest ?? "after_context_engine",
601
- trigger: params.trigger ?? "unknown"
602
- } : {}
603
- };
604
- return codexNativeCompactionResult(params, {
605
- compacted: true,
606
- tokensAfter,
607
- details
608
- });
609
- });
610
- } catch (error) {
611
- if (params.abortSignal?.aborted) return abortedResult(initialBinding.threadId, binding.threadId);
612
- throw error;
613
- }
614
- }
615
- function codexNativeCompactionResult(params, outcome) {
616
- return {
617
- ok: true,
618
- compacted: outcome.compacted,
619
- ...outcome.reason ? { reason: outcome.reason } : {},
620
- result: {
621
- summary: "",
622
- firstKeptEntryId: "",
623
- tokensBefore: params.currentTokenCount ?? 0,
624
- ...outcome.tokensAfter !== void 0 ? { tokensAfter: outcome.tokensAfter } : {},
625
- details: outcome.details
626
- }
627
- };
628
- }
629
- function skippedCodexNativeCompactionResult(params, skipped) {
630
- return codexNativeCompactionResult(params, {
631
- compacted: false,
632
- reason: skipped.reason,
633
- details: {
634
- backend: "codex-app-server",
635
- skipped: true,
636
- reason: skipped.code,
637
- request: skipped.request ?? "after_context_engine",
638
- trigger: params.trigger ?? "unknown",
639
- ...skipped.expectedThreadId ? { expectedThreadId: skipped.expectedThreadId } : {},
640
- ...skipped.currentThreadId ? { currentThreadId: skipped.currentThreadId } : {}
641
- }
642
- });
643
- }
644
- function failedCodexThreadBindingCompactionResult(params, recovery) {
645
- embeddedAgentLog.warn("codex app-server compaction could not use thread binding", {
646
- sessionId: params.sessionId,
647
- sessionKey: params.sessionKey,
648
- threadId: recovery.threadId,
649
- reason: recovery.reason,
650
- recovery: recovery.recovery
651
- });
652
- return {
653
- ok: false,
654
- compacted: false,
655
- reason: recovery.reason,
656
- failure: {
657
- reason: recovery.recovery,
658
- rawError: recovery.reason
659
- }
660
- };
661
- }
662
- async function clearContextEngineProjectionBeforeNativeCompaction(params) {
663
- const contextEngineBinding = params.binding.contextEngine;
664
- if (!contextEngineBinding?.projection) return;
665
- await params.bindingStore.mutate(params.identity, {
666
- kind: "patch",
667
- threadId: params.binding.threadId,
668
- patch: { contextEngine: {
669
- ...contextEngineBinding,
670
- projection: void 0
671
- } }
672
- }, params.assertCurrent);
673
- embeddedAgentLog.info("cleared codex context-engine projection before native compaction", {
674
- sessionId: params.sessionId,
675
- threadId: params.binding.threadId,
676
- previousEpoch: contextEngineBinding.projection.epoch,
677
- previousFingerprint: contextEngineBinding.projection.fingerprint
678
- });
679
- }
680
- function isSameNativeCompactionBinding(current, expected) {
681
- 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;
682
- }
683
- function isCodexThreadNotFoundError(error) {
684
- return coerceErrorMessage(error).toLowerCase().includes("thread not found");
685
- }
686
- //#endregion
687
- export { maybeCompactCodexAppServerSession };