@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,12 +1,200 @@
1
- import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
2
1
  import { t as readCodexAsyncQuestions } from "./async-questions-DdhOCwGi.mjs";
3
- import { i as readUpstreamUserText, n as attachUpstreamUserText, r as readMirrorIdentity, t as attachCodexMirrorIdentity } from "./upstream-prompt-provenance-LphB8slG.mjs";
4
- import { t as projectBoundedCodexThreadHistory } from "./transcript-history-projection-DHNBDhCU.mjs";
5
- import { a as fingerprintCodexMirrorSourceMessage, c as readCodexMirrorSourceFingerprint, i as buildCodexMirrorDedupeIdentity, n as attachCodexMirrorAttestation, r as attachCodexMirrorRunId, s as isMirroredAgentMessage, t as applyCodexTranscriptTaint } from "./transcript-mirror-attestation-CzM-94NC.mjs";
2
+ import { i as readUpstreamUserText, n as attachUpstreamUserText, r as readMirrorIdentity, t as attachCodexMirrorIdentity } from "./upstream-prompt-provenance-fXkKbPVC.mjs";
3
+ import { t as projectBoundedCodexThreadHistory } from "./transcript-history-projection-DRSifI-1.mjs";
4
+ import { a as fingerprintCodexMirrorSourceMessage, c as readCodexMirrorSourceFingerprint, i as buildCodexMirrorDedupeIdentity, n as attachCodexMirrorAttestation, r as attachCodexMirrorRunId, s as isMirroredAgentMessage, t as applyCodexTranscriptTaint } from "./transcript-mirror-attestation-YSegaktH.mjs";
5
+ import { t as __exportAll } from "./session-binding-sidecars-jo6H8dFr.mjs";
6
6
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { deliverAgentHarnessUserInputPrompt, embeddedAgentLog, formatErrorMessage, projectAgentHarnessTranscriptMessageForDisplay, restorePreparedUserTurnOperationalMetaForRuntime, runAgentHarnessBeforeMessageWriteHook } from "openclaw/plugin-sdk/agent-harness-runtime";
8
8
  import { withCodexSessionTranscriptMirrorWriteLock } from "openclaw/plugin-sdk/codex-session-transcript-runtime";
9
9
  import { publishSessionTranscriptUpdateByIdentity } from "openclaw/plugin-sdk/session-transcript-runtime";
10
+ //#region extensions/codex/src/app-server/transcript-mirror-write.ts
11
+ function readMirroredAssistantText(message) {
12
+ return message?.role === "assistant" ? message.content.flatMap((part) => part.type === "text" ? [part.text] : []).join("\n") || void 0 : void 0;
13
+ }
14
+ async function mirror(params) {
15
+ const messages = params.messages.filter(isMirroredAgentMessage);
16
+ if (messages.length === 0) return {
17
+ assistantMirrorIdentitiesOwned: [],
18
+ anchorsByMirrorIdentity: /* @__PURE__ */ new Map(),
19
+ messagesPresent: [],
20
+ userMessageReceipts: []
21
+ };
22
+ const candidates = messages.map((message) => {
23
+ const dedupeIdentity = buildCodexMirrorDedupeIdentity(message);
24
+ const sourceFingerprint = fingerprintCodexMirrorSourceMessage(message);
25
+ return {
26
+ dedupeIdentity,
27
+ idempotencyKey: (message.role === "user" ? normalizeOptionalString("idempotencyKey" in message ? message.idempotencyKey : void 0) : void 0) ?? (params.idempotencyScope ? `${params.idempotencyScope}:${dedupeIdentity}` : void 0),
28
+ message,
29
+ sourceFingerprint
30
+ };
31
+ });
32
+ const candidateIdempotencyKeys = candidates.flatMap(({ idempotencyKey }) => idempotencyKey ? [idempotencyKey] : []);
33
+ const transcriptTarget = resolveCodexMirrorTranscriptTarget(params);
34
+ const assertWritable = () => {
35
+ params.assertCurrent?.();
36
+ params.assertWriteCurrent?.();
37
+ };
38
+ assertWritable();
39
+ const mirrorBatch = await withCodexSessionTranscriptMirrorWriteLock({
40
+ ...transcriptTarget,
41
+ config: params.config
42
+ }, async (transcript) => {
43
+ assertWritable();
44
+ const nextAppendedUpdates = [];
45
+ const nextAssistantMirrorIdentitiesOwned = /* @__PURE__ */ new Set();
46
+ const nextAnchorsByMirrorIdentity = /* @__PURE__ */ new Map();
47
+ const nextMessagesPresent = [];
48
+ const nextUserMessageReceipts = [];
49
+ const mirrorFacts = await transcript.readMessageFacts({ idempotencyKeys: candidateIdempotencyKeys });
50
+ assertWritable();
51
+ const taint = { tainted: false };
52
+ for (const { dedupeIdentity, idempotencyKey, message, sourceFingerprint } of candidates) {
53
+ const sourceMessage = applyCodexTranscriptTaint(message, taint);
54
+ const mirrorIdentity = readMirrorIdentity(message);
55
+ const ownsRun = Boolean(params.runId && (!params.runMirrorIdentityPrefix || mirrorIdentity?.startsWith(params.runMirrorIdentityPrefix)));
56
+ const terminalOwner = params.terminalAssistantOwner;
57
+ const ownsTerminal = Boolean(ownsRun && terminalOwner && mirrorIdentity === terminalOwner.mirrorIdentity);
58
+ const ownedMessage = ownsRun && params.runId ? attachCodexMirrorRunId(sourceMessage, params.runId, ownsTerminal, terminalOwner?.settlementWarning) : sourceMessage;
59
+ const transcriptMessage = {
60
+ ...attachCodexMirrorAttestation(ownedMessage, sourceFingerprint),
61
+ ...idempotencyKey ? { idempotencyKey } : {}
62
+ };
63
+ if (idempotencyKey && mirrorFacts.existingIdempotencyKeys.has(idempotencyKey)) {
64
+ const persistedMessage = mirrorFacts.messagesByIdempotencyKey.get(idempotencyKey);
65
+ const persistedAnchor = mirrorFacts.anchorsByIdempotencyKey.get(idempotencyKey);
66
+ if (persistedMessage && isMirroredAgentMessage(persistedMessage)) {
67
+ nextMessagesPresent.push(persistedMessage);
68
+ if (persistedMessage.role === "user" && persistedAnchor) nextUserMessageReceipts.push({
69
+ anchor: persistedAnchor,
70
+ appended: false,
71
+ message: persistedMessage
72
+ });
73
+ }
74
+ if (persistedAnchor) nextAnchorsByMirrorIdentity.set(dedupeIdentity, persistedAnchor);
75
+ if (message.role === "assistant") nextAssistantMirrorIdentitiesOwned.add(dedupeIdentity);
76
+ continue;
77
+ }
78
+ assertWritable();
79
+ const preparedUserMessage = transcriptMessage.role === "user" ? {
80
+ ...transcriptMessage,
81
+ __openclaw: { ...Reflect.get(transcriptMessage, "__openclaw") }
82
+ } : void 0;
83
+ if (preparedUserMessage?.["__openclaw"].humanMentions !== void 0) {
84
+ preparedUserMessage.content = structuredClone(preparedUserMessage.content);
85
+ preparedUserMessage["__openclaw"].humanMentions = structuredClone(preparedUserMessage["__openclaw"].humanMentions);
86
+ }
87
+ const asyncSourceText = message.role === "assistant" && message.openclawAsyncDelivery ? readMirroredAssistantText(message) : void 0;
88
+ const nextMessage = runAgentHarnessBeforeMessageWriteHook({
89
+ message: transcriptMessage,
90
+ agentId: params.agentId,
91
+ sessionKey: params.sessionKey,
92
+ skipBeforeMessageWriteHooks: params.skipBeforeMessageWriteHooks,
93
+ prepareAssistantTranscriptMessage: ownsTerminal ? params.prepareAssistantTranscriptMessage : void 0
94
+ });
95
+ if (!nextMessage) {
96
+ if (message.role === "assistant") nextAssistantMirrorIdentitiesOwned.add(dedupeIdentity);
97
+ continue;
98
+ }
99
+ const restoredMessage = restorePreparedUserTurnOperationalMetaForRuntime({
100
+ runtimeMessage: nextMessage,
101
+ preparedMessage: preparedUserMessage
102
+ });
103
+ let messageToAppend = idempotencyKey ? {
104
+ ...attachCodexMirrorAttestation(restoredMessage, sourceFingerprint),
105
+ idempotencyKey
106
+ } : attachCodexMirrorAttestation(restoredMessage, sourceFingerprint);
107
+ if (mirrorIdentity) messageToAppend = attachCodexMirrorIdentity(messageToAppend, mirrorIdentity);
108
+ if (ownsRun && params.runId) messageToAppend = attachCodexMirrorRunId(messageToAppend, params.runId, ownsTerminal, terminalOwner?.settlementWarning);
109
+ if (message.role === "assistant" && message.openclawAsyncDelivery) {
110
+ const questions = isMirroredAgentMessage(messageToAppend) && readMirroredAssistantText(messageToAppend) === asyncSourceText ? readCodexAsyncQuestions(messageToAppend.openclawAsyncDelivery?.questions) : void 0;
111
+ messageToAppend = Object.assign(messageToAppend, { openclawAsyncDelivery: {
112
+ itemId: message.openclawAsyncDelivery.itemId,
113
+ ...questions ? { questions } : {}
114
+ } });
115
+ }
116
+ messageToAppend = applyCodexTranscriptTaint(messageToAppend, taint);
117
+ messageToAppend = projectAgentHarnessTranscriptMessageForDisplay({
118
+ hidden: message.display === false,
119
+ message: messageToAppend
120
+ });
121
+ assertWritable();
122
+ const { lifecycleRevision, messageSeq, result: appended } = await transcript.appendMessageWithMessageSequence({
123
+ message: messageToAppend,
124
+ ...params.assertCurrent || params.assertWriteCurrent ? { prepareMessageAfterIdempotencyCheck: (preparedMessage) => {
125
+ assertWritable();
126
+ return preparedMessage;
127
+ } } : {},
128
+ idempotencyLookup: "scan",
129
+ cwd: params.cwd
130
+ });
131
+ params.assertCurrent?.();
132
+ if (!appended) continue;
133
+ const { messageId, message: appendedMessage } = appended;
134
+ if (isMirroredAgentMessage(appendedMessage)) {
135
+ nextMessagesPresent.push(appendedMessage);
136
+ if (idempotencyKey) mirrorFacts.messagesByIdempotencyKey.set(idempotencyKey, appendedMessage);
137
+ }
138
+ if (message.role === "assistant") nextAssistantMirrorIdentitiesOwned.add(dedupeIdentity);
139
+ if (appended.anchor) nextAnchorsByMirrorIdentity.set(dedupeIdentity, appended.anchor);
140
+ if (appendedMessage.role === "user" && appended.anchor) nextUserMessageReceipts.push({
141
+ anchor: appended.anchor,
142
+ appended: appended.appended,
143
+ message: appendedMessage
144
+ });
145
+ if (appended.appended) nextAppendedUpdates.push({
146
+ lifecycleRevision,
147
+ messageId,
148
+ message: appendedMessage,
149
+ ...messageSeq !== void 0 ? { messageSeq } : {}
150
+ });
151
+ if (idempotencyKey) {
152
+ mirrorFacts.existingIdempotencyKeys.add(idempotencyKey);
153
+ if (appended.anchor) mirrorFacts.anchorsByIdempotencyKey.set(idempotencyKey, appended.anchor);
154
+ }
155
+ }
156
+ return {
157
+ appendedUpdates: nextAppendedUpdates,
158
+ assistantMirrorIdentitiesOwned: [...nextAssistantMirrorIdentitiesOwned],
159
+ anchorsByMirrorIdentity: nextAnchorsByMirrorIdentity,
160
+ messagesPresent: nextMessagesPresent,
161
+ userMessageReceipts: nextUserMessageReceipts
162
+ };
163
+ });
164
+ params.assertCurrent?.();
165
+ const { appendedUpdates, ...result } = mirrorBatch;
166
+ for (const update of appendedUpdates) try {
167
+ const terminalOwner = params.terminalAssistantOwner;
168
+ const terminalRunId = update.message.role === "assistant" && terminalOwner && readMirrorIdentity(update.message) === terminalOwner.mirrorIdentity ? terminalOwner.runId : void 0;
169
+ await publishSessionTranscriptUpdateByIdentity({
170
+ ...transcriptTarget,
171
+ update: {
172
+ lifecycleRevision: update.lifecycleRevision,
173
+ ...params.agentId ? { agentId: params.agentId } : {},
174
+ message: update.message,
175
+ messageId: update.messageId,
176
+ ...update.messageSeq !== void 0 ? { messageSeq: update.messageSeq } : {},
177
+ ...terminalRunId ? { runId: terminalRunId } : {},
178
+ sessionKey: transcriptTarget.sessionKey
179
+ }
180
+ });
181
+ } catch (error) {
182
+ embeddedAgentLog.warn("failed to publish codex app-server transcript update", { error: formatErrorMessage(error) });
183
+ }
184
+ return result;
185
+ }
186
+ function resolveCodexMirrorTranscriptTarget(params) {
187
+ const sessionKey = params.sessionKey?.trim();
188
+ const storePath = params.storePath?.trim();
189
+ if (!sessionKey || !storePath) throw new Error("Codex transcript mirror requires a runtime session identity");
190
+ return {
191
+ ...params.agentId ? { agentId: params.agentId } : {},
192
+ sessionId: params.sessionId,
193
+ sessionKey,
194
+ storePath
195
+ };
196
+ }
197
+ //#endregion
10
198
  //#region extensions/codex/src/app-server/user-prompt-message.ts
11
199
  function buildSenderLabel(params) {
12
200
  const label = params.senderName ?? params.senderUsername ?? params.senderE164 ?? params.senderId;
@@ -41,12 +229,10 @@ function buildFromPrepared(params, preparedUserMessage) {
41
229
  function buildCodexUserPromptMessage(params) {
42
230
  return buildFromPrepared(params, params.userTurnTranscriptRecorder?.message);
43
231
  }
44
- function buildCodexUpstreamPromptMessage(params, identity, upstreamUserText) {
45
- const message = attachCodexMirrorIdentity(buildCodexUserPromptMessage(params), identity);
46
- return upstreamUserText ? attachUpstreamUserText(message, upstreamUserText) : message;
47
- }
48
232
  function promptSnapshot(params, turnId, upstreamUserText) {
49
- return params.suppressNextUserMessagePersistence ? [] : [buildCodexUpstreamPromptMessage(params, `${turnId}:prompt`, upstreamUserText)];
233
+ if (params.suppressNextUserMessagePersistence) return [];
234
+ const message = attachCodexMirrorIdentity(buildCodexUserPromptMessage(params), `${turnId}:prompt`);
235
+ return [upstreamUserText ? attachUpstreamUserText(message, upstreamUserText) : message];
50
236
  }
51
237
  async function buildResolvedCodexUserPromptMessage(params) {
52
238
  return buildFromPrepared(params, await params.userTurnTranscriptRecorder?.resolveMessage() ?? params.userTurnTranscriptRecorder?.message);
@@ -72,9 +258,6 @@ var transcript_mirror_exports = /* @__PURE__ */ __exportAll({
72
258
  mirrorPromptAtTurnStartBestEffort: () => mirrorPromptAtTurnStartBestEffort,
73
259
  projectBoundedCodexThreadHistory: () => projectBoundedCodexThreadHistory
74
260
  });
75
- function readMirroredAssistantText(message) {
76
- return message?.role === "assistant" ? message.content.flatMap((part) => part.type === "text" ? [part.text] : []).join("\n") || void 0 : void 0;
77
- }
78
261
  /** Imports a bounded, user-visible Codex history tail into a new OpenClaw transcript. */
79
262
  async function importCodexThreadHistoryToTranscript(params) {
80
263
  const { transcriptMessages, importedMessages, omittedMessages } = projectBoundedCodexThreadHistory({
@@ -110,6 +293,9 @@ async function mirrorBestEffort(params) {
110
293
  messagesSnapshot: params.result.messagesSnapshot,
111
294
  turnId: params.turnId
112
295
  });
296
+ const recorder = params.params.userTurnTranscriptRecorder;
297
+ const admittedPromptIdentity = recorder?.getAdmissionReceipt() ? `${params.turnId}:prompt` : void 0;
298
+ const admittedPrompt = admittedPromptIdentity ? recorder?.getPersistedMessage?.() : void 0;
113
299
  params.assertWriteCurrent?.();
114
300
  const mirrorResult = await mirror({
115
301
  assertWriteCurrent: params.assertWriteCurrent,
@@ -118,7 +304,7 @@ async function mirrorBestEffort(params) {
118
304
  sessionId: params.params.sessionId,
119
305
  storePath: params.params.sessionTarget?.storePath,
120
306
  cwd: params.cwd,
121
- messages,
307
+ messages: admittedPromptIdentity ? messages.filter((message) => readMirrorIdentity(message) !== admittedPromptIdentity) : messages,
122
308
  idempotencyScope: `codex-app-server:${params.threadId}`,
123
309
  runId: params.params.runId,
124
310
  runMirrorIdentityPrefix: `${params.turnId}:`,
@@ -140,9 +326,10 @@ async function mirrorBestEffort(params) {
140
326
  const identity = readMirrorIdentity(message);
141
327
  return identity ? [[identity, fingerprintCodexMirrorSourceMessage(message)]] : [];
142
328
  }));
143
- const mirroredMessages = mirrorResult.messagesPresent.filter((message) => {
329
+ const mirroredMessages = [...admittedPrompt ? [admittedPrompt] : [], ...mirrorResult.messagesPresent].filter((message) => {
144
330
  const identity = readMirrorIdentity(message);
145
- return identity !== void 0 && readCodexMirrorSourceFingerprint(message) === expectedFingerprints.get(identity);
331
+ const expectedFingerprint = identity ? expectedFingerprints.get(identity) : void 0;
332
+ return expectedFingerprint !== void 0 && readCodexMirrorSourceFingerprint(message) === expectedFingerprint;
146
333
  });
147
334
  const assistantMirrorIdentity = `${params.turnId}:assistant`;
148
335
  const assistantTranscriptMessage = mirroredMessages.find((message) => readMirrorIdentity(message) === assistantMirrorIdentity);
@@ -191,16 +378,26 @@ async function mirrorPromptAtTurnStartBestEffort(params) {
191
378
  inputProvenance: params.params.inputProvenance,
192
379
  message: attachUpstreamUserText(attachCodexMirrorIdentity(await buildResolvedCodexUserPromptMessage(params.params), `${params.turnId}:prompt`), params.upstreamUserText)
193
380
  });
381
+ const annotate = params.params.hostCapabilities.annotateCurrentUserTurn;
382
+ if (annotate) await annotate({
383
+ mirrorIdentity: `${params.turnId}:prompt`,
384
+ upstreamUserText: params.upstreamUserText,
385
+ mirrorOrigin: "codex-app-server",
386
+ mirrorSourceFingerprint: fingerprintCodexMirrorSourceMessage(userPromptMessage)
387
+ });
194
388
  const recorder = params.params.userTurnTranscriptRecorder;
195
- if (recorder?.getAdmissionReceipt() && recorder.getPersistedMessage?.()?.display !== false) {
196
- const annotate = params.params.hostCapabilities.annotateCurrentUserTurn;
197
- if (!annotate || userPromptMessage.role !== "user") throw new Error("current host admission is unavailable for native prompt annotation");
198
- await annotate({
199
- mirrorIdentity: `${params.turnId}:prompt`,
200
- upstreamUserText: params.upstreamUserText,
201
- mirrorOrigin: "codex-app-server",
202
- mirrorSourceFingerprint: fingerprintCodexMirrorSourceMessage(userPromptMessage)
203
- });
389
+ const admission = recorder?.getAdmissionReceipt();
390
+ if (admission) {
391
+ const message = recorder?.getPersistedMessage?.();
392
+ if (message) {
393
+ params.params.hostCapabilities.assertActive();
394
+ params.notifyUserMessagePersisted({
395
+ anchor: admission,
396
+ appended: false,
397
+ message
398
+ });
399
+ }
400
+ return;
204
401
  }
205
402
  const mirrorResult = await mirror({
206
403
  assertCurrent: params.params.hostCapabilities.assertActive,
@@ -227,176 +424,6 @@ async function mirrorPromptAtTurnStartBestEffort(params) {
227
424
  });
228
425
  }
229
426
  }
230
- async function mirror(params) {
231
- const messages = params.messages.filter(isMirroredAgentMessage);
232
- if (messages.length === 0) return {
233
- assistantMirrorIdentitiesOwned: [],
234
- anchorsByMirrorIdentity: /* @__PURE__ */ new Map(),
235
- messagesPresent: [],
236
- userMessageReceipts: []
237
- };
238
- const candidates = messages.map((message) => {
239
- const dedupeIdentity = buildCodexMirrorDedupeIdentity(message);
240
- const sourceFingerprint = fingerprintCodexMirrorSourceMessage(message);
241
- return {
242
- dedupeIdentity,
243
- idempotencyKey: (message.role === "user" ? normalizeOptionalString("idempotencyKey" in message ? message.idempotencyKey : void 0) : void 0) ?? (params.idempotencyScope ? `${params.idempotencyScope}:${dedupeIdentity}` : void 0),
244
- message,
245
- sourceFingerprint
246
- };
247
- });
248
- const candidateIdempotencyKeys = candidates.flatMap(({ idempotencyKey }) => idempotencyKey ? [idempotencyKey] : []);
249
- const transcriptTarget = resolveCodexMirrorTranscriptTarget(params);
250
- const assertWritable = () => {
251
- params.assertCurrent?.();
252
- params.assertWriteCurrent?.();
253
- };
254
- assertWritable();
255
- const mirrorBatch = await withCodexSessionTranscriptMirrorWriteLock({
256
- ...transcriptTarget,
257
- config: params.config
258
- }, async (transcript) => {
259
- assertWritable();
260
- const nextAppendedUpdates = [];
261
- const nextAssistantMirrorIdentitiesOwned = /* @__PURE__ */ new Set();
262
- const nextAnchorsByMirrorIdentity = /* @__PURE__ */ new Map();
263
- const nextMessagesPresent = [];
264
- const nextUserMessageReceipts = [];
265
- const mirrorFacts = await transcript.readMessageFacts({ idempotencyKeys: candidateIdempotencyKeys });
266
- assertWritable();
267
- const taint = { tainted: false };
268
- for (const { dedupeIdentity, idempotencyKey, message, sourceFingerprint } of candidates) {
269
- const sourceMessage = applyCodexTranscriptTaint(message, taint);
270
- const mirrorIdentity = readMirrorIdentity(message);
271
- const ownsRun = Boolean(params.runId && (!params.runMirrorIdentityPrefix || mirrorIdentity?.startsWith(params.runMirrorIdentityPrefix)));
272
- const terminalOwner = params.terminalAssistantOwner;
273
- const ownsTerminal = Boolean(ownsRun && terminalOwner && mirrorIdentity === terminalOwner.mirrorIdentity);
274
- const ownedMessage = ownsRun && params.runId ? attachCodexMirrorRunId(sourceMessage, params.runId, ownsTerminal, terminalOwner?.settlementWarning) : sourceMessage;
275
- const transcriptMessage = {
276
- ...attachCodexMirrorAttestation(ownedMessage, sourceFingerprint),
277
- ...idempotencyKey ? { idempotencyKey } : {}
278
- };
279
- if (idempotencyKey && mirrorFacts.existingIdempotencyKeys.has(idempotencyKey)) {
280
- const persistedMessage = mirrorFacts.messagesByIdempotencyKey.get(idempotencyKey);
281
- const persistedAnchor = mirrorFacts.anchorsByIdempotencyKey.get(idempotencyKey);
282
- if (persistedMessage && isMirroredAgentMessage(persistedMessage)) {
283
- nextMessagesPresent.push(persistedMessage);
284
- if (persistedMessage.role === "user" && persistedAnchor) nextUserMessageReceipts.push({
285
- anchor: persistedAnchor,
286
- appended: false,
287
- message: persistedMessage
288
- });
289
- }
290
- if (persistedAnchor) nextAnchorsByMirrorIdentity.set(dedupeIdentity, persistedAnchor);
291
- if (message.role === "assistant") nextAssistantMirrorIdentitiesOwned.add(dedupeIdentity);
292
- continue;
293
- }
294
- assertWritable();
295
- const preparedUserMessage = transcriptMessage.role === "user" ? {
296
- ...transcriptMessage,
297
- __openclaw: { ...Reflect.get(transcriptMessage, "__openclaw") }
298
- } : void 0;
299
- if (preparedUserMessage?.["__openclaw"].humanMentions !== void 0) {
300
- preparedUserMessage.content = structuredClone(preparedUserMessage.content);
301
- preparedUserMessage["__openclaw"].humanMentions = structuredClone(preparedUserMessage["__openclaw"].humanMentions);
302
- }
303
- const asyncSourceText = message.role === "assistant" && message.openclawAsyncDelivery ? readMirroredAssistantText(message) : void 0;
304
- const nextMessage = runAgentHarnessBeforeMessageWriteHook({
305
- message: transcriptMessage,
306
- agentId: params.agentId,
307
- sessionKey: params.sessionKey,
308
- skipBeforeMessageWriteHooks: params.skipBeforeMessageWriteHooks,
309
- prepareAssistantTranscriptMessage: ownsTerminal ? params.prepareAssistantTranscriptMessage : void 0
310
- });
311
- if (!nextMessage) {
312
- if (message.role === "assistant") nextAssistantMirrorIdentitiesOwned.add(dedupeIdentity);
313
- continue;
314
- }
315
- const restoredMessage = restorePreparedUserTurnOperationalMetaForRuntime({
316
- runtimeMessage: nextMessage,
317
- preparedMessage: preparedUserMessage
318
- });
319
- let messageToAppend = idempotencyKey ? {
320
- ...attachCodexMirrorAttestation(restoredMessage, sourceFingerprint),
321
- idempotencyKey
322
- } : attachCodexMirrorAttestation(restoredMessage, sourceFingerprint);
323
- if (mirrorIdentity) messageToAppend = attachCodexMirrorIdentity(messageToAppend, mirrorIdentity);
324
- if (ownsRun && params.runId) messageToAppend = attachCodexMirrorRunId(messageToAppend, params.runId, ownsTerminal, terminalOwner?.settlementWarning);
325
- if (message.role === "assistant" && message.openclawAsyncDelivery) {
326
- const questions = isMirroredAgentMessage(messageToAppend) && readMirroredAssistantText(messageToAppend) === asyncSourceText ? readCodexAsyncQuestions(messageToAppend.openclawAsyncDelivery?.questions) : void 0;
327
- messageToAppend = Object.assign(messageToAppend, { openclawAsyncDelivery: {
328
- itemId: message.openclawAsyncDelivery.itemId,
329
- ...questions ? { questions } : {}
330
- } });
331
- }
332
- messageToAppend = applyCodexTranscriptTaint(messageToAppend, taint);
333
- messageToAppend = projectAgentHarnessTranscriptMessageForDisplay({
334
- hidden: message.display === false,
335
- message: messageToAppend
336
- });
337
- assertWritable();
338
- const { messageSeq, result: appended } = await transcript.appendMessageWithMessageSequence({
339
- message: messageToAppend,
340
- ...params.assertCurrent || params.assertWriteCurrent ? { prepareMessageAfterIdempotencyCheck: (preparedMessage) => {
341
- assertWritable();
342
- return preparedMessage;
343
- } } : {},
344
- idempotencyLookup: "scan",
345
- cwd: params.cwd
346
- });
347
- params.assertCurrent?.();
348
- if (!appended) continue;
349
- const { messageId, message: appendedMessage } = appended;
350
- if (isMirroredAgentMessage(appendedMessage)) {
351
- nextMessagesPresent.push(appendedMessage);
352
- if (idempotencyKey) mirrorFacts.messagesByIdempotencyKey.set(idempotencyKey, appendedMessage);
353
- }
354
- if (message.role === "assistant") nextAssistantMirrorIdentitiesOwned.add(dedupeIdentity);
355
- if (appended.anchor) nextAnchorsByMirrorIdentity.set(dedupeIdentity, appended.anchor);
356
- if (appendedMessage.role === "user" && appended.anchor) nextUserMessageReceipts.push({
357
- anchor: appended.anchor,
358
- appended: appended.appended,
359
- message: appendedMessage
360
- });
361
- if (appended.appended) nextAppendedUpdates.push({
362
- messageId,
363
- message: appendedMessage,
364
- ...messageSeq !== void 0 ? { messageSeq } : {}
365
- });
366
- if (idempotencyKey) {
367
- mirrorFacts.existingIdempotencyKeys.add(idempotencyKey);
368
- if (appended.anchor) mirrorFacts.anchorsByIdempotencyKey.set(idempotencyKey, appended.anchor);
369
- }
370
- }
371
- return {
372
- appendedUpdates: nextAppendedUpdates,
373
- assistantMirrorIdentitiesOwned: [...nextAssistantMirrorIdentitiesOwned],
374
- anchorsByMirrorIdentity: nextAnchorsByMirrorIdentity,
375
- messagesPresent: nextMessagesPresent,
376
- userMessageReceipts: nextUserMessageReceipts
377
- };
378
- });
379
- params.assertCurrent?.();
380
- const { appendedUpdates, ...result } = mirrorBatch;
381
- for (const update of appendedUpdates) try {
382
- const terminalOwner = params.terminalAssistantOwner;
383
- const terminalRunId = update.message.role === "assistant" && terminalOwner && readMirrorIdentity(update.message) === terminalOwner.mirrorIdentity ? terminalOwner.runId : void 0;
384
- await publishSessionTranscriptUpdateByIdentity({
385
- ...transcriptTarget,
386
- update: {
387
- ...params.agentId ? { agentId: params.agentId } : {},
388
- message: update.message,
389
- messageId: update.messageId,
390
- ...update.messageSeq !== void 0 ? { messageSeq: update.messageSeq } : {},
391
- ...terminalRunId ? { runId: terminalRunId } : {},
392
- sessionKey: transcriptTarget.sessionKey
393
- }
394
- });
395
- } catch (error) {
396
- embeddedAgentLog.warn("failed to publish codex app-server transcript update", { error: formatErrorMessage(error) });
397
- }
398
- return result;
399
- }
400
427
  async function deliverAsyncMessageBestEffort(params) {
401
428
  const mirrorIdentity = `${params.turnId}:async:${params.itemId}`;
402
429
  const deliveryIntentId = `block-reply:v1:codex-app-server:${[
@@ -417,7 +444,9 @@ async function deliverAsyncMessageBestEffort(params) {
417
444
  cwd: params.cwd,
418
445
  config: params.params.config,
419
446
  messages: [attachCodexMirrorIdentity(params.message, mirrorIdentity)],
420
- idempotencyScope: `codex-app-server:${params.threadId}`
447
+ idempotencyScope: `codex-app-server:${params.threadId}`,
448
+ runId: params.params.runId,
449
+ runMirrorIdentityPrefix: `${params.turnId}:`
421
450
  });
422
451
  } catch (error) {
423
452
  embeddedAgentLog.warn("failed to persist codex async agent message", {
@@ -457,16 +486,5 @@ const codexTranscriptMirrorRuntime = {
457
486
  async function deliverAsyncBlockReply(onBlockReply, text, deliveryIntentId) {
458
487
  await deliverAgentHarnessUserInputPrompt({ onBlockReply: (payload) => onBlockReply(payload, { deliveryIntentId }) }, [], { intro: text });
459
488
  }
460
- function resolveCodexMirrorTranscriptTarget(params) {
461
- const sessionKey = params.sessionKey?.trim();
462
- const storePath = params.storePath?.trim();
463
- if (!sessionKey || !storePath) throw new Error("Codex transcript mirror requires a runtime session identity");
464
- return {
465
- ...params.agentId ? { agentId: params.agentId } : {},
466
- sessionId: params.sessionId,
467
- sessionKey,
468
- storePath
469
- };
470
- }
471
489
  //#endregion
472
490
  export { transcript_mirror_exports as a, promptSnapshot as c, mirrorPromptAtTurnStartBestEffort as i, createCodexAppServerUserMessagePersistenceNotifier as n, buildCodexUserPromptMessage as o, importCodexThreadHistoryToTranscript as r, buildResolvedCodexUserPromptMessage as s, codexTranscriptMirrorRuntime as t };