@openclaw/codex 2026.9.5 → 2026.9.6

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 (120) hide show
  1. package/dist/.setup/{account-usage-runtime-C2MOIvfq.mjs → account-usage-runtime-Eem_WGqY.mjs} +5 -5
  2. package/dist/.setup/{apply-CJ0ZfmBG.mjs → apply-DDOi8uNx.mjs} +22 -28
  3. package/dist/.setup/{attempt-client-cleanup-BpYKdTA0.mjs → attempt-client-cleanup-CEv1cKwF.mjs} +58 -43
  4. package/dist/.setup/attempt-workspace-context-DUVEn_CS.mjs +331 -0
  5. package/dist/.setup/{auth-cache-key-QirmgiCo.mjs → auth-cache-key-B2mpaI9D.mjs} +9 -81
  6. package/dist/.setup/auth-profile-health-oHizqgye.mjs +53 -0
  7. package/dist/.setup/auth-profile-recovery-BREezV0L.mjs +14 -0
  8. package/dist/.setup/{binding-connection-Bm38niE8.mjs → binding-connection-ThoatDcb.mjs} +1 -1
  9. package/dist/.setup/{binding-connection.runtime-CnRMC0ta.mjs → binding-connection.runtime-yoHrABt-.mjs} +4 -4
  10. package/dist/.setup/{bounded-turn-BtlZcivC.mjs → bounded-turn-B2HScEgT.mjs} +138 -32
  11. package/dist/.setup/{build-state-Xx9ybZqa.mjs → build-state-C7EnDVgr.mjs} +1 -1
  12. package/dist/.setup/{capabilities-_vXcZGSx.mjs → capabilities-CDXOOFdZ.mjs} +1 -1
  13. package/dist/.setup/{client-vXs2929Q.mjs → client-Cs08OXVQ.mjs} +583 -559
  14. package/dist/.setup/client-catalog-response-BMgt_4q4.mjs +285 -0
  15. package/dist/.setup/{command-dispatch-naHIZwwF.mjs → command-dispatch-B4JuOsOk.mjs} +8 -4
  16. package/dist/.setup/{command-formatters-CGEkdawF.mjs → command-formatters-Bmqvr9tO.mjs} +8 -4
  17. package/dist/.setup/{command-handlers-BtAJEW1X.mjs → command-handlers-DW7Lx9oH.mjs} +106 -172
  18. package/dist/.setup/{command-rpc-DHFpn4le.mjs → command-rpc-DixIj3HW.mjs} +36 -21
  19. package/dist/.setup/{compact-C3i3qlzj.mjs → compact-Du5UvtxA.mjs} +14 -21
  20. package/dist/.setup/{config-CedDWjM-.mjs → config-BoTP_mrL.mjs} +3 -3
  21. package/dist/.setup/{config-options-BsanJ8QG.mjs → config-options-BvaRs51b.mjs} +46 -30
  22. package/dist/.setup/{config-runtime-CeAhl_h4.mjs → config-runtime-C8Rw1m1m.mjs} +1 -1
  23. package/dist/.setup/{config-security-BRQ2mgW9.mjs → config-security-BEReZ6go.mjs} +35 -120
  24. package/dist/.setup/{conversation-binding-DhzrpTM6.mjs → conversation-binding-DP-gMrBP.mjs} +21 -32
  25. package/dist/.setup/{conversation-control-DN53ns41.mjs → conversation-control-uK9Jomlc.mjs} +28 -67
  26. package/dist/.setup/{dynamic-tools-D16lOp67.mjs → dynamic-tools-BDXl-8Cw.mjs} +848 -578
  27. package/dist/.setup/{effective-mcp-catalog-K6kLCN8X.mjs → effective-mcp-catalog-CvnvnGIe.mjs} +3 -3
  28. package/dist/.setup/{ephemeral-turn-R1gA8Sn6.mjs → ephemeral-turn-poidXgek.mjs} +9 -6
  29. package/dist/.setup/{event-projector-assistant-message-DNUR1s0A.mjs → event-projector-assistant-message-BsruvNrH.mjs} +2 -4
  30. package/dist/.setup/{event-projector-items-DyTQ_XqL.mjs → event-projector-items-C6L_5ZiT.mjs} +42 -8
  31. package/dist/.setup/{event-projector-usage-C7Ntzs-f.mjs → event-projector-usage-CnBS8Wa3.mjs} +1 -1
  32. package/dist/.setup/{harness-rxaaoN-o.mjs → harness-a_MsE4-_.mjs} +23 -17
  33. package/dist/.setup/{inference-context-fulhZuz8.mjs → inference-context-D96l9-ew.mjs} +1 -1
  34. package/dist/.setup/inference-proxy-b-aJMSxm.mjs +601 -0
  35. package/dist/.setup/{isolated-completion-B6srt48J.mjs → isolated-completion-BIZFhTNG.mjs} +17 -10
  36. package/dist/.setup/launch-args-DbFCehO7.mjs +196 -0
  37. package/dist/.setup/{managed-binary-DP6Rib3P.mjs → managed-binary-BnshlFag.mjs} +13 -2
  38. package/dist/.setup/{model-catalog-DkvUuBey.mjs → model-catalog-CfXJf9Ay.mjs} +9 -10
  39. package/dist/.setup/{models-BDFgm_G-.mjs → models-KnqBv0hE.mjs} +3 -3
  40. package/dist/.setup/{native-auth-BLZGqFjw.mjs → native-auth-rWbGbMn3.mjs} +4 -4
  41. package/dist/.setup/{native-subagent-history-YXaL6dMd.mjs → native-subagent-history-0nYYgo0k.mjs} +26 -13
  42. package/dist/.setup/{native-subagent-monitor-B1hxzIOy.mjs → native-subagent-monitor-D3filLY2.mjs} +145 -317
  43. package/dist/.setup/{native-subagent-task-ids-DsuOonKv.mjs → native-subagent-task-ids-wb8CKZGN.mjs} +69 -39
  44. package/dist/.setup/{node-cli-sessions-Cl8b2ZF3.mjs → node-cli-sessions-r3avj02l.mjs} +86 -68
  45. package/dist/.setup/node-exec-server.runtime-BDwWXVpK.mjs +247 -0
  46. package/dist/.setup/{plan-xD7WKYTM.mjs → plan-CN3VwfNU.mjs} +74 -76
  47. package/dist/.setup/{plugin-activation-r8nq5Jzp.mjs → plugin-activation-DT3MNtqj.mjs} +7 -16
  48. package/dist/.setup/{plugin-app-cache-key-BOxKP7db.mjs → plugin-app-cache-key-B2CsSdnV.mjs} +4 -20
  49. package/dist/.setup/{plugin-approval-roundtrip-CjfzafAZ.mjs → plugin-approval-roundtrip-C0MZzCuP.mjs} +1 -1
  50. package/dist/.setup/{plugin-inventory-DUle8DLz.mjs → plugin-inventory-BoRei8Z4.mjs} +16 -7
  51. package/dist/.setup/{plugin-marketplace-discovery-P-Vndfqq.mjs → plugin-marketplace-discovery-CDOi8IFs.mjs} +4 -1
  52. package/dist/.setup/{plugin-metadata-cache-DsS5buNa.mjs → plugin-metadata-cache-Ctmo83k_.mjs} +224 -154
  53. package/dist/.setup/protocol-CANUwXJ3.mjs +17 -0
  54. package/dist/.setup/{provider-fFh_-VR3.mjs → provider-BOsxQHOM.mjs} +9 -5
  55. package/dist/.setup/{provider-capabilities-B8J4Dy-O.mjs → provider-capabilities-BfE88FZ5.mjs} +31 -3
  56. package/dist/.setup/{rate-limits-DOEGYRNs.mjs → rate-limits-CMU3DUD0.mjs} +116 -137
  57. package/dist/.setup/{request-BioXJLYa.mjs → request-D2L0zMrq.mjs} +23 -15
  58. package/dist/.setup/{run-attempt-rlA07pUv.mjs → run-attempt-BHu11r7h.mjs} +1197 -617
  59. package/dist/.setup/{runtime-artifact-Dy38Z5iU.mjs → runtime-artifact-CLZ8udh-.mjs} +29 -45
  60. package/dist/.setup/{sandbox-guard-BBP-RbTf.mjs → sandbox-guard-C2sRMOEY.mjs} +1 -1
  61. package/dist/.setup/{session-binding-_0W_fHRr.mjs → session-binding-Cm0apEbd.mjs} +3 -32
  62. package/dist/.setup/{session-binding-record-TH3xA0zj.mjs → session-binding-record-BGoz8wOK.mjs} +22 -3
  63. package/dist/.setup/{session-binding-sidecars-CKYEcfNn.mjs → session-binding-sidecars-BlB5EvIS.mjs} +48 -45
  64. package/dist/.setup/{session-catalog-fUdWDx-U.mjs → session-catalog-Pno1xGcl.mjs} +482 -182
  65. package/dist/.setup/{session-catalog-adoption-CR_whkEW.mjs → session-catalog-adoption-BI6UTDZT.mjs} +57 -25
  66. package/dist/.setup/{session-catalog-archive-CwZaPacf.mjs → session-catalog-archive-lHBqzhaO.mjs} +6 -6
  67. package/dist/.setup/{session-catalog-events-jMcYfQyd.mjs → session-catalog-events-Bj6j94E_.mjs} +122 -25
  68. package/dist/.setup/{session-catalog-index-B141u15s.mjs → session-catalog-index-B9_VQIUz.mjs} +178 -78
  69. package/dist/.setup/{session-catalog-index-order-Cc5BzlQr.mjs → session-catalog-index-order-hcdz07yN.mjs} +2 -2
  70. package/dist/.setup/{session-catalog-index-state-BAuDztHN.mjs → session-catalog-index-state-Dgh8ORJm.mjs} +5 -2
  71. package/dist/.setup/{session-catalog-native-projection-ChV3cCtm.mjs → session-catalog-native-projection-DowriLid.mjs} +30 -13
  72. package/dist/.setup/{session-catalog-node-adoption-BVRsYOSh.mjs → session-catalog-node-adoption-ITddWx_X.mjs} +24 -12
  73. package/dist/.setup/{session-catalog-node-continue-Dowv8osw.mjs → session-catalog-node-continue-6g6qi4A9.mjs} +22 -13
  74. package/dist/.setup/{session-catalog-projection-C1Bj9Jl-.mjs → session-catalog-projection-zK_PUsiE.mjs} +13 -5
  75. package/dist/.setup/{session-cli-DIj-IE-E.mjs → session-cli-irrD-uo7.mjs} +4 -4
  76. package/dist/.setup/{session-history-C--SrLI8.mjs → session-history-BrqhSCf9.mjs} +17 -22
  77. package/dist/.setup/{session-history-import-JHXT5Xfi.mjs → session-history-import-D-3wAgOP.mjs} +4 -4
  78. package/dist/.setup/{session-history.worker-CpNj7H_P.mjs → session-history.worker-CaCh0xF_.mjs} +5 -18
  79. package/dist/.setup/{session-initialization-DH1z6fXn.mjs → session-initialization-rcgbZiid.mjs} +2 -2
  80. package/dist/.setup/{session-permission-policy-DhurXY0l.mjs → session-permission-policy-BI1QK_98.mjs} +2 -2
  81. package/dist/.setup/{session-retirement-CU87AOg9.mjs → session-retirement-BH-S6qkJ.mjs} +25 -6
  82. package/dist/.setup/{settled-turn-finalizer-CiY2bLFK.mjs → settled-turn-finalizer-DiAi6Kx6.mjs} +8 -8
  83. package/dist/.setup/{shared-client-BpTtuLQ5.mjs → shared-client-DA4VR4Eb.mjs} +59 -89
  84. package/dist/.setup/{side-question-DSCZyoBD.mjs → side-question-BJ1wSDcB.mjs} +147 -211
  85. package/dist/.setup/{source-Bjp4UQij.mjs → source-CUzJq5WN.mjs} +9 -9
  86. package/dist/.setup/spawn-error-CL3n6MAa.mjs +57 -0
  87. package/dist/.setup/{thread-archive-guard-jmecf6OJ.mjs → thread-archive-guard-C9frICzX.mjs} +10 -3
  88. package/dist/.setup/{thread-history-page-BTx-4xsg.mjs → thread-history-page-DoVpnHim.mjs} +1 -1
  89. package/dist/.setup/{thread-lifecycle-Cik28qWn.mjs → thread-lifecycle-B3mfz1TG.mjs} +172 -2271
  90. package/dist/.setup/{thread-ownership-skomxnIt.mjs → thread-ownership-DcTtAcXj.mjs} +4 -2
  91. package/dist/.setup/{thread-policy-Cjs4B8xf.mjs → thread-policy-DGuQsuFC.mjs} +19 -3
  92. package/dist/.setup/thread-requests-BLvGkP2R.mjs +2205 -0
  93. package/dist/.setup/{thread-resume-BkNpj9Pz.mjs → thread-resume-DIBXwOpE.mjs} +6 -6
  94. package/dist/.setup/{timeout-DZF05XrR.mjs → timeout-C910MdAB.mjs} +19 -2
  95. package/dist/.setup/{transcript-history-projection-DHNBDhCU.mjs → transcript-history-projection-ZZpkFkJ_.mjs} +94 -64
  96. package/dist/.setup/{transcript-mirror-D4qp_leP.mjs → transcript-mirror-BtHDBp1G.mjs} +218 -198
  97. package/dist/.setup/{transport-stdio-Cmx94Oiy.mjs → transport-stdio-h2VHOskC.mjs} +135 -55
  98. package/dist/.setup/{upstream-session-fork-D3UKxgVD.mjs → upstream-session-fork-BUr4OUbC.mjs} +44 -36
  99. package/dist/.setup/{usage-BOgBEKso.mjs → usage-BML0r-ua.mjs} +5 -4
  100. package/dist/.setup/{usage-limit-error-C0ow7DOc.mjs → usage-limit-error-DUMbefVY.mjs} +4 -4
  101. package/dist/.setup/{web-search-provider.runtime-CTGuJt6i.mjs → web-search-provider.runtime-CDKlN-Rv.mjs} +4 -3
  102. package/dist/api.js +23 -12
  103. package/dist/catalog-page-worker-entrypoint.js +12 -0
  104. package/dist/catalog-page.worker.js +9 -0
  105. package/dist/cli-metadata.js +1 -1
  106. package/dist/doctor-contract-api.js +2 -2
  107. package/dist/harness.js +1 -1
  108. package/dist/index.js +221 -170
  109. package/dist/media-understanding-provider.js +2 -2
  110. package/dist/migration-provider-api.js +1 -1
  111. package/dist/provider-discovery.js +1 -1
  112. package/dist/session-history-worker-runtime.js +15 -32
  113. package/dist/session-history.worker.js +1 -1
  114. package/package.json +9 -6
  115. package/dist/.setup/attempt-context-VXVwTCfS.mjs +0 -636
  116. package/dist/.setup/inference-proxy-CC15HuSi.mjs +0 -311
  117. package/dist/.setup/launch-args-DnMak49W.mjs +0 -111
  118. package/dist/.setup/node-exec-server.runtime-BaViBKNz.mjs +0 -226
  119. package/dist/.setup/version-CoqzXPgK.mjs +0 -12
  120. package/dist/.setup/{native-execution-policy-YBMHSzC4.mjs → native-execution-policy-umd0tgh4.mjs} +1 -1
@@ -1,12 +1,200 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
2
2
  import { t as readCodexAsyncQuestions } from "./async-questions-DdhOCwGi.mjs";
3
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";
4
+ import { t as projectBoundedCodexThreadHistory } from "./transcript-history-projection-ZZpkFkJ_.mjs";
5
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";
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;
@@ -72,9 +260,6 @@ var transcript_mirror_exports = /* @__PURE__ */ __exportAll({
72
260
  mirrorPromptAtTurnStartBestEffort: () => mirrorPromptAtTurnStartBestEffort,
73
261
  projectBoundedCodexThreadHistory: () => projectBoundedCodexThreadHistory
74
262
  });
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
263
  /** Imports a bounded, user-visible Codex history tail into a new OpenClaw transcript. */
79
264
  async function importCodexThreadHistoryToTranscript(params) {
80
265
  const { transcriptMessages, importedMessages, omittedMessages } = projectBoundedCodexThreadHistory({
@@ -110,6 +295,9 @@ async function mirrorBestEffort(params) {
110
295
  messagesSnapshot: params.result.messagesSnapshot,
111
296
  turnId: params.turnId
112
297
  });
298
+ const recorder = params.params.userTurnTranscriptRecorder;
299
+ const admittedPromptIdentity = recorder?.getAdmissionReceipt() ? `${params.turnId}:prompt` : void 0;
300
+ const admittedPrompt = admittedPromptIdentity ? recorder?.getPersistedMessage?.() : void 0;
113
301
  params.assertWriteCurrent?.();
114
302
  const mirrorResult = await mirror({
115
303
  assertWriteCurrent: params.assertWriteCurrent,
@@ -118,7 +306,7 @@ async function mirrorBestEffort(params) {
118
306
  sessionId: params.params.sessionId,
119
307
  storePath: params.params.sessionTarget?.storePath,
120
308
  cwd: params.cwd,
121
- messages,
309
+ messages: admittedPromptIdentity ? messages.filter((message) => readMirrorIdentity(message) !== admittedPromptIdentity) : messages,
122
310
  idempotencyScope: `codex-app-server:${params.threadId}`,
123
311
  runId: params.params.runId,
124
312
  runMirrorIdentityPrefix: `${params.turnId}:`,
@@ -140,9 +328,10 @@ async function mirrorBestEffort(params) {
140
328
  const identity = readMirrorIdentity(message);
141
329
  return identity ? [[identity, fingerprintCodexMirrorSourceMessage(message)]] : [];
142
330
  }));
143
- const mirroredMessages = mirrorResult.messagesPresent.filter((message) => {
331
+ const mirroredMessages = [...admittedPrompt ? [admittedPrompt] : [], ...mirrorResult.messagesPresent].filter((message) => {
144
332
  const identity = readMirrorIdentity(message);
145
- return identity !== void 0 && readCodexMirrorSourceFingerprint(message) === expectedFingerprints.get(identity);
333
+ const expectedFingerprint = identity ? expectedFingerprints.get(identity) : void 0;
334
+ return expectedFingerprint !== void 0 && readCodexMirrorSourceFingerprint(message) === expectedFingerprint;
146
335
  });
147
336
  const assistantMirrorIdentity = `${params.turnId}:assistant`;
148
337
  const assistantTranscriptMessage = mirroredMessages.find((message) => readMirrorIdentity(message) === assistantMirrorIdentity);
@@ -191,16 +380,26 @@ async function mirrorPromptAtTurnStartBestEffort(params) {
191
380
  inputProvenance: params.params.inputProvenance,
192
381
  message: attachUpstreamUserText(attachCodexMirrorIdentity(await buildResolvedCodexUserPromptMessage(params.params), `${params.turnId}:prompt`), params.upstreamUserText)
193
382
  });
383
+ const annotate = params.params.hostCapabilities.annotateCurrentUserTurn;
384
+ if (annotate) await annotate({
385
+ mirrorIdentity: `${params.turnId}:prompt`,
386
+ upstreamUserText: params.upstreamUserText,
387
+ mirrorOrigin: "codex-app-server",
388
+ mirrorSourceFingerprint: fingerprintCodexMirrorSourceMessage(userPromptMessage)
389
+ });
194
390
  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
- });
391
+ const admission = recorder?.getAdmissionReceipt();
392
+ if (admission) {
393
+ const message = recorder?.getPersistedMessage?.();
394
+ if (message) {
395
+ params.params.hostCapabilities.assertActive();
396
+ params.notifyUserMessagePersisted({
397
+ anchor: admission,
398
+ appended: false,
399
+ message
400
+ });
401
+ }
402
+ return;
204
403
  }
205
404
  const mirrorResult = await mirror({
206
405
  assertCurrent: params.params.hostCapabilities.assertActive,
@@ -227,176 +426,6 @@ async function mirrorPromptAtTurnStartBestEffort(params) {
227
426
  });
228
427
  }
229
428
  }
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
429
  async function deliverAsyncMessageBestEffort(params) {
401
430
  const mirrorIdentity = `${params.turnId}:async:${params.itemId}`;
402
431
  const deliveryIntentId = `block-reply:v1:codex-app-server:${[
@@ -417,7 +446,9 @@ async function deliverAsyncMessageBestEffort(params) {
417
446
  cwd: params.cwd,
418
447
  config: params.params.config,
419
448
  messages: [attachCodexMirrorIdentity(params.message, mirrorIdentity)],
420
- idempotencyScope: `codex-app-server:${params.threadId}`
449
+ idempotencyScope: `codex-app-server:${params.threadId}`,
450
+ runId: params.params.runId,
451
+ runMirrorIdentityPrefix: `${params.turnId}:`
421
452
  });
422
453
  } catch (error) {
423
454
  embeddedAgentLog.warn("failed to persist codex async agent message", {
@@ -457,16 +488,5 @@ const codexTranscriptMirrorRuntime = {
457
488
  async function deliverAsyncBlockReply(onBlockReply, text, deliveryIntentId) {
458
489
  await deliverAgentHarnessUserInputPrompt({ onBlockReply: (payload) => onBlockReply(payload, { deliveryIntentId }) }, [], { intro: text });
459
490
  }
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
491
  //#endregion
472
492
  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 };