@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,9 +1,8 @@
1
- import { m as isJsonObject } from "./config-security-BRQ2mgW9.mjs";
2
- import { C as readNonEmptyString, _ as normalizeOptionalString$1, c as itemName, l as itemStatus, m as shouldSynthesizeToolProgressForItem, w as readNonEmptyStringArray } from "./event-projector-items-DyTQ_XqL.mjs";
1
+ import { i as isJsonObject } from "./protocol-CANUwXJ3.mjs";
2
+ import { T as readNonEmptyStringArray, c as itemName, h as unknownItemStatus, l as itemStatus, m as shouldSynthesizeToolProgressForItem, t as auditNativeToolName, v as normalizeOptionalString$1, w as readNonEmptyString } from "./event-projector-items-C6L_5ZiT.mjs";
3
3
  import { asNonArrayRecord, normalizeOptionalString, readStringField } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
5
- import { formatToolAggregate, formatToolProgressOutput, inferToolMetaFromArgs } from "openclaw/plugin-sdk/agent-harness-runtime";
6
- import { redactSensitiveFieldValue, redactToolPayloadText } from "openclaw/plugin-sdk/logging-core";
5
+ import { formatToolAggregate, formatToolProgressOutput, inferToolMetaFromArgs, projectAgentToolActivity, sanitizeToolArgs } from "openclaw/plugin-sdk/agent-harness-runtime";
7
6
  //#region extensions/codex/src/app-server/event-projector-tool-output.ts
8
7
  const TOOL_TRANSCRIPT_OUTPUT_MAX_CHARS = 1e4;
9
8
  const TOOL_PROGRESS_ECHO_PREFIX_MIN_CHARS = 1024;
@@ -16,6 +15,9 @@ var ToolOutputAccumulator = class {
16
15
  this.truncatedItemIds = /* @__PURE__ */ new Set();
17
16
  this.textByItem = /* @__PURE__ */ new Map();
18
17
  }
18
+ isTruncated(itemId) {
19
+ return this.truncatedItemIds.has(itemId);
20
+ }
19
21
  append(itemId, delta) {
20
22
  const originalLength = (this.originalLengthByItem.get(itemId) ?? this.textByItem.get(itemId)?.length ?? 0) + delta.length;
21
23
  this.originalLengthByItem.set(itemId, originalLength);
@@ -74,6 +76,17 @@ function collectDynamicToolContentText(contentItems) {
74
76
  return text ? [text] : [];
75
77
  }).join("\n");
76
78
  }
79
+ function readCodexResponseOutput(item) {
80
+ if (typeof item.output === "string") return item.output;
81
+ if (!Array.isArray(item.output)) return;
82
+ return JSON.stringify(item.output.map((part) => isJsonObject(part) && part.type === "input_text" && typeof part.text === "string" ? {
83
+ type: part.type,
84
+ text: part.text
85
+ } : {
86
+ type: isJsonObject(part) ? part.type : "unknown",
87
+ omitted: true
88
+ }), null, 2);
89
+ }
77
90
  function appendBoundedToolTranscriptText(currentPrefix, delta, originalLength) {
78
91
  if (originalLength <= 1e4) {
79
92
  const rawPrefix = currentPrefix + delta;
@@ -146,26 +159,9 @@ function isCodexCommandBearingToolCall(name, args) {
146
159
  const normalizedName = name?.trim().toLowerCase();
147
160
  return normalizedName === "exec" || normalizedName === "bash" || normalizedName === "shell" || typeof args?.command === "string" && args.command.trim().length > 0;
148
161
  }
149
- /** Recursively redacts sensitive strings and handles circular values in event payloads. */
150
- function sanitizeCodexAgentEventValue(value, seen = /* @__PURE__ */ new WeakSet()) {
151
- if (typeof value === "string") return redactToolPayloadText(value);
152
- if (Array.isArray(value)) {
153
- if (seen.has(value)) return "[Circular]";
154
- seen.add(value);
155
- return value.map((entry) => sanitizeCodexAgentEventValue(entry, seen));
156
- }
157
- if (value && typeof value === "object") {
158
- if (seen.has(value)) return "[Circular]";
159
- seen.add(value);
160
- const out = {};
161
- for (const [key, child] of Object.entries(value)) out[key] = typeof child === "string" ? redactSensitiveFieldValue(key, child) : sanitizeCodexAgentEventValue(child, seen);
162
- return out;
163
- }
164
- return value;
165
- }
166
162
  /** Sanitizes a record-shaped Codex agent event payload. */
167
163
  function sanitizeCodexAgentEventRecord(value) {
168
- return sanitizeCodexAgentEventValue(value);
164
+ return sanitizeToolArgs(value);
169
165
  }
170
166
  /** Sanitizes dynamic-tool arguments before diagnostic/event emission. */
171
167
  function sanitizeCodexToolArguments(value) {
@@ -182,6 +178,46 @@ function inferCodexDynamicToolMeta(call, detailMode) {
182
178
  }
183
179
  //#endregion
184
180
  //#region extensions/codex/src/app-server/event-projector-tool-items.ts
181
+ const CODE_MODE_NATIVE_PATCH_SOURCE_RE = /^\s*(?:\/\/[^\r\n]*\r?\n\s*)?(?:const|let)\s+([A-Za-z_$][\w$]*)\s*=\s*await\s+tools\.apply_patch\(\s*("(?:\\[\s\S]|[^"\\])*")\s*\)\s*;?\s*text\(\s*\1\s*\)\s*;?\s*$/u;
182
+ function readCodeModeNativePatchInput(source) {
183
+ if (typeof source !== "string") return;
184
+ const match = CODE_MODE_NATIVE_PATCH_SOURCE_RE.exec(source);
185
+ if (!match?.[2]) return;
186
+ try {
187
+ const patch = JSON.parse(match[2]);
188
+ return typeof patch === "string" && /^\*\*\* Begin Patch\r?\n[\s\S]*\r?\n\*\*\* End Patch(?:\r?\n)?$/u.test(patch) ? patch : void 0;
189
+ } catch {
190
+ return;
191
+ }
192
+ }
193
+ function readInterceptedNativePatchInput(command) {
194
+ if (typeof command !== "string") return;
195
+ const lines = command.replace(/\r\n?/gu, "\n").split("\n");
196
+ const patchStart = lines.indexOf("*** Begin Patch");
197
+ const invocation = /^[\t ]*(?:cd[\t ]+(?:'([^'\n]+)'|([A-Za-z0-9_./-]+))[\t ]+&&[\t ]+)?apply_patch[\t ]*<<-?[\t ]*'([^'\n]+)'[\t ]*$/u.exec(lines[0] ?? "");
198
+ if (!invocation || patchStart !== 1) return;
199
+ const patchEnd = lines.indexOf("*** End Patch", patchStart + 1);
200
+ const cwd = invocation[1] ?? invocation[2];
201
+ const delimiter = invocation[3];
202
+ if (patchEnd < 0 || lines[patchEnd + 1] !== delimiter || lines.slice(patchEnd + 2).some((line) => line.trim().length > 0)) return;
203
+ return {
204
+ input: `${lines.slice(patchStart, patchEnd + 1).join("\n")}\n`,
205
+ ...cwd ? { cwd } : {}
206
+ };
207
+ }
208
+ function projectCodexToolActivity(item, phase, meta) {
209
+ const name = itemName(item) ?? auditNativeToolName(item);
210
+ return name ? projectAgentToolActivity({
211
+ toolCallId: item.id,
212
+ name,
213
+ phase,
214
+ args: item.type === "dynamicToolCall" ? void 0 : itemToolArgs(item),
215
+ meta,
216
+ status: item.type === "collabAgentToolCall" && item.status === "interrupted" ? "failed" : unknownItemStatus(item) ? "unknown" : itemStatus(item),
217
+ result: { details: itemToolResult(item).result },
218
+ ...item.type === "collabAgentToolCall" && item.tool === "wait" ? { nativeOperation: "wait" } : {}
219
+ }) : void 0;
220
+ }
185
221
  function isNativePostToolUseRelayItem(item) {
186
222
  switch (item.type) {
187
223
  case "commandExecution":
@@ -344,25 +380,19 @@ function itemMeta(item, detailMode = "explain") {
344
380
  if ((item.type === "dynamicToolCall" || item.type === "mcpToolCall") && toolName) return inferToolMetaFromArgs(toolName, item.arguments, { detailMode });
345
381
  }
346
382
  function itemOutputText(item, outputTextByItem) {
347
- if (item.type === "commandExecution") {
348
- const output = item.aggregatedOutput?.trim() || outputTextByItem?.get(item.id)?.trim();
349
- return output ? truncateToolTranscriptText(output) : void 0;
350
- }
351
- if (item.type === "dynamicToolCall") {
352
- const output = collectDynamicToolContentText(item.contentItems).trim();
353
- return output ? truncateToolTranscriptText(output) : void 0;
354
- }
355
- if (item.type === "mcpToolCall") {
356
- const output = item.error ? stringifyJsonValue(item.error) : item.result ? stringifyJsonValue(item.result) : void 0;
357
- return output ? truncateToolTranscriptText(output) : void 0;
358
- }
383
+ const output = itemObservedOutputText(item, outputTextByItem)?.trim();
384
+ return output ? truncateToolTranscriptText(output) : void 0;
385
+ }
386
+ function itemObservedOutputText(item, outputTextByItem) {
387
+ if (item.type === "commandExecution") return item.aggregatedOutput ?? outputTextByItem?.get(item.id);
388
+ if (item.type === "dynamicToolCall") return collectDynamicToolContentText(item.contentItems);
389
+ if (item.type === "mcpToolCall") return item.error ? stringifyJsonValue(item.error) : item.result ? stringifyJsonValue(item.result) : void 0;
359
390
  }
360
391
  function itemTranscriptResultText(item, outputTextByItem) {
361
- const output = itemOutputText(item, outputTextByItem);
362
- if (output) return output;
392
+ const output = itemObservedOutputText(item, outputTextByItem);
393
+ if (output !== void 0) return output;
363
394
  const result = itemToolResult(item).result;
364
- const resultText = result ? stringifyJsonValue(result) : void 0;
365
- return resultText ? truncateToolTranscriptText(resultText) : itemStatus(item);
395
+ return (result ? stringifyJsonValue(result) : void 0) ?? itemStatus(item);
366
396
  }
367
397
  function stringifyJsonValue(value) {
368
398
  try {
@@ -408,4 +438,4 @@ function readNativeSubagentThreadIds(value) {
408
438
  return value.filter((entry) => typeof entry === "string" && entry.trim() !== "");
409
439
  }
410
440
  //#endregion
411
- export { truncateToolTranscriptText as A, TOOL_TRANSCRIPT_OUTPUT_MAX_CHARS as C, formatToolSummary as D, formatToolOutput as E, normalizeToolTranscriptArguments as O, TOOL_PROGRESS_ECHO_PREFIX_MIN_CHARS as S, collectDynamicToolContentText as T, inferCodexDynamicToolMeta as _, readCodexNativeSubagentRunId as a, sanitizeCodexToolArguments as b, isCommandBearingToolItem as c, itemOutputText as d, itemToolArgs as f, shouldSuppressChannelProgressForItem as g, itemTranscriptResultText as h, codexNativeSubagentRunId as i, toolOutputRawEchoSignature as k, isNativePostToolUseRelayItem as l, itemToolResult as m, CODEX_NATIVE_SUBAGENT_RUN_ID_PREFIX as n, readNativeSubagentThreadIds as o, itemToolError as p, CODEX_NATIVE_SUBAGENT_TASK_KIND as r, readNativeTaskAssignment as s, CODEX_NATIVE_SUBAGENT_RUNTIME as t, itemMeta as u, isCodexCommandBearingToolCall as v, ToolOutputAccumulator as w, sanitizeCodexToolResponse as x, resolveCodexToolProgressDetailMode as y };
441
+ export { formatToolSummary as A, sanitizeCodexToolArguments as C, ToolOutputAccumulator as D, TOOL_TRANSCRIPT_OUTPUT_MAX_CHARS as E, readCodexResponseOutput as M, toolOutputRawEchoSignature as N, collectDynamicToolContentText as O, truncateToolTranscriptText as P, resolveCodexToolProgressDetailMode as S, TOOL_PROGRESS_ECHO_PREFIX_MIN_CHARS as T, readCodeModeNativePatchInput as _, readCodexNativeSubagentRunId as a, inferCodexDynamicToolMeta as b, isCommandBearingToolItem as c, itemOutputText as d, itemToolArgs as f, projectCodexToolActivity as g, itemTranscriptResultText as h, codexNativeSubagentRunId as i, normalizeToolTranscriptArguments as j, formatToolOutput as k, isNativePostToolUseRelayItem as l, itemToolResult as m, CODEX_NATIVE_SUBAGENT_RUN_ID_PREFIX as n, readNativeSubagentThreadIds as o, itemToolError as p, CODEX_NATIVE_SUBAGENT_TASK_KIND as r, readNativeTaskAssignment as s, CODEX_NATIVE_SUBAGENT_RUNTIME as t, itemMeta as u, readInterceptedNativePatchInput as v, sanitizeCodexToolResponse as w, isCodexCommandBearingToolCall as x, shouldSuppressChannelProgressForItem as y };
@@ -1,19 +1,22 @@
1
- import { o as formatCodexDisplayText } from "./command-formatters-CGEkdawF.mjs";
1
+ import { p as resolveCodexAppServerUserHomeDir } from "./config-security-BEReZ6go.mjs";
2
+ import { N as readBoundedOptionalString } from "./session-catalog-native-projection-DowriLid.mjs";
3
+ import { s as codexCatalogHomeId } from "./session-catalog-events-Bj6j94E_.mjs";
4
+ import { o as formatCodexDisplayText } from "./command-formatters-Bmqvr9tO.mjs";
2
5
  import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
3
6
  import { timestampMsToIsoString } from "openclaw/plugin-sdk/number-runtime";
4
- import { runCommandBuffered } from "openclaw/plugin-sdk/process-runtime";
7
+ import { runCommandBuffered, withCommandProcessScope } from "openclaw/plugin-sdk/process-runtime";
5
8
  import { materializeWindowsSpawnProgram, resolveWindowsSpawnProgram } from "openclaw/plugin-sdk/windows-spawn";
6
9
  import path from "node:path";
7
- import os from "node:os";
8
10
  import fs from "node:fs/promises";
9
11
  import { expectDefined } from "openclaw/plugin-sdk/expect-runtime";
10
12
  import process from "node:process";
13
+ import { parseAgentSessionKey } from "openclaw/plugin-sdk/routing";
11
14
  import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path";
12
15
  import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
13
16
  //#region extensions/codex/src/jsonl-lines.ts
14
17
  const JSONL_STREAM_THRESHOLD_BYTES = 4194304;
15
18
  const JSONL_READ_CHUNK_BYTES = 1048576;
16
- async function visitJsonlLines(file, visitor, chunkBytes = JSONL_READ_CHUNK_BYTES) {
19
+ async function visitJsonlLines(file, visitor) {
17
20
  let size;
18
21
  try {
19
22
  size = (await fs.stat(file)).size;
@@ -40,7 +43,7 @@ async function visitJsonlLines(file, visitor, chunkBytes = JSONL_READ_CHUNK_BYTE
40
43
  let lineCount = 0;
41
44
  for (const line of content.split(/\r?\n/u)) {
42
45
  lineCount += 1;
43
- if (visitor(line) === false) break;
46
+ visitor(line);
44
47
  }
45
48
  return {
46
49
  ok: true,
@@ -56,7 +59,7 @@ async function visitJsonlLines(file, visitor, chunkBytes = JSONL_READ_CHUNK_BYTE
56
59
  lineCount: 0
57
60
  };
58
61
  }
59
- const buffer = Buffer.allocUnsafe(chunkBytes);
62
+ const buffer = Buffer.allocUnsafe(JSONL_READ_CHUNK_BYTES);
60
63
  const decoder = new TextDecoder();
61
64
  let pendingFragments = [];
62
65
  let lineCount = 0;
@@ -77,10 +80,7 @@ async function visitJsonlLines(file, visitor, chunkBytes = JSONL_READ_CHUNK_BYTE
77
80
  }
78
81
  const line = rawLine.endsWith("\r") ? rawLine.slice(0, -1) : rawLine;
79
82
  lineCount += 1;
80
- if (visitor(line) === false) return {
81
- ok: true,
82
- lineCount
83
- };
83
+ visitor(line);
84
84
  lineStart = newline + 1;
85
85
  }
86
86
  if (lineStart < content.length) pendingFragments.push(content.slice(lineStart));
@@ -110,21 +110,25 @@ async function visitJsonlLines(file, visitor, chunkBytes = JSONL_READ_CHUNK_BYTE
110
110
  //#region extensions/codex/src/node-cli-sessions.ts
111
111
  const CODEX_CLI_SESSIONS_LIST_COMMAND = "codex.cli.sessions.list";
112
112
  const CODEX_CLI_SESSION_RESUME_COMMAND = "codex.cli.session.resume";
113
+ const CODEX_CLI_SESSION_SOURCE_CAPABILITY = "codex-cli-session-source";
114
+ const CODEX_CLI_SESSION_SOURCE_UPGRADE_MESSAGE = "Update the node and approve its refreshed capabilities before continuing this Codex catalog session.";
113
115
  const DEFAULT_SESSION_LIMIT = 10;
114
116
  const MAX_SESSION_LIMIT = 50;
115
117
  const DEFAULT_RESUME_TIMEOUT_MS = 12e5;
116
118
  const SESSION_ID_PATTERN = /^[A-Za-z0-9._:-]{1,128}$/;
117
119
  const activeResumeSessions = /* @__PURE__ */ new Set();
118
- function createCodexCliSessionNodeHostCommands() {
120
+ function createCodexCliSessionNodeHostCommands(resolveCatalogSource) {
119
121
  return [{
120
122
  command: CODEX_CLI_SESSIONS_LIST_COMMAND,
121
123
  cap: "codex-cli-sessions",
124
+ hasActiveWork: () => false,
122
125
  handle: listLocalCodexCliSessions
123
126
  }, {
124
127
  command: CODEX_CLI_SESSION_RESUME_COMMAND,
125
- cap: "codex-cli-sessions",
128
+ cap: CODEX_CLI_SESSION_SOURCE_CAPABILITY,
126
129
  dangerous: true,
127
- handle: resumeLocalCodexCliSession
130
+ hasActiveWork: () => activeResumeSessions.size > 0,
131
+ handle: (paramsJSON, _io, context) => resumeLocalCodexCliSession(paramsJSON, resolveCatalogSource, context)
128
132
  }];
129
133
  }
130
134
  function createCodexCliSessionNodeInvokePolicies() {
@@ -139,7 +143,11 @@ function createCodexCliSessionNodeInvokePolicies() {
139
143
  }, {
140
144
  commands: [CODEX_CLI_SESSION_RESUME_COMMAND],
141
145
  dangerous: true,
142
- handle: (ctx) => ctx.invokeNode()
146
+ handle: (ctx) => isRecord(ctx.params) && (ctx.params.agentId !== void 0 || ctx.params.sourceHomeId !== void 0) && !ctx.node?.caps?.includes("codex-cli-session-source") ? {
147
+ ok: false,
148
+ code: "CODEX_NODE_SOURCE_UNAVAILABLE",
149
+ message: CODEX_CLI_SESSION_SOURCE_UPGRADE_MESSAGE
150
+ } : ctx.invokeNode()
143
151
  }];
144
152
  }
145
153
  async function listCodexCliSessionsOnNode(params) {
@@ -176,11 +184,30 @@ async function resolveCodexCliSessionForBindingOnNode(params) {
176
184
  };
177
185
  }
178
186
  async function resumeCodexCliSessionOnNode(params) {
187
+ let catalogAgentId;
188
+ let catalogHomeId;
189
+ if (params.sessionKey) {
190
+ const { adoptionSessionKeyRest, CODEX_NODE_SESSION_KEY_PREFIX, readNodeSessionMarker } = await import("./session-catalog-node-adoption-ITddWx_X.mjs");
191
+ const entry = params.runtime.agent.session.getSessionEntry({
192
+ sessionKey: params.sessionKey,
193
+ readConsistency: "latest"
194
+ });
195
+ const codex = entry?.pluginExtensions?.codex;
196
+ if (adoptionSessionKeyRest(params.sessionKey).startsWith(CODEX_NODE_SESSION_KEY_PREFIX) || isRecord(codex) && codex.sessionCatalog !== void 0) {
197
+ const marker = entry ? readNodeSessionMarker(entry) : void 0;
198
+ catalogAgentId = params.agentId?.trim();
199
+ if (!catalogAgentId || parseAgentSessionKey(params.sessionKey)?.agentId !== catalogAgentId || !marker || marker.initializing === true || marker.nodeId !== params.nodeId || marker.sourceHostId !== `node:${params.nodeId}` || marker.sourceThreadId !== params.sessionId || entry?.initializationPending === true || entry?.agentHarnessId !== "codex" || entry.modelSelectionLocked !== true) throw new Error("Codex catalog session changed before its node turn could run.");
200
+ if (!marker.sourceHomeId) throw new Error("This Codex catalog session has no saved source home. Reopen it from the catalog to continue in a new chat.");
201
+ catalogHomeId = marker.sourceHomeId;
202
+ }
203
+ }
179
204
  const payload = unwrapNodeInvokePayload(await params.runtime.nodes.invoke({
180
205
  nodeId: params.nodeId,
181
206
  command: CODEX_CLI_SESSION_RESUME_COMMAND,
182
207
  params: {
183
208
  sessionId: params.sessionId,
209
+ ...catalogAgentId ? { agentId: catalogAgentId } : {},
210
+ ...catalogHomeId ? { sourceHomeId: catalogHomeId } : {},
184
211
  prompt: params.prompt,
185
212
  cwd: params.cwd,
186
213
  timeoutMs: params.timeoutMs
@@ -206,9 +233,8 @@ async function listLocalCodexCliSessions(paramsJSON) {
206
233
  const params = readRecordParam(paramsJSON);
207
234
  const limit = normalizeLimit(params.limit);
208
235
  const filter = typeof params.filter === "string" ? params.filter.trim().toLowerCase() : "";
209
- const codexHome = resolveCodexHome();
236
+ const codexHome = resolveCodexAppServerUserHomeDir();
210
237
  const summaries = await readHistorySessions(codexHome);
211
- await hydrateSessionFiles(codexHome, summaries);
212
238
  await hydrateSessionsFromSessionFiles(codexHome, summaries);
213
239
  const sessions = [...summaries.values()].filter((session) => {
214
240
  if (!filter) return true;
@@ -223,20 +249,39 @@ async function listLocalCodexCliSessions(paramsJSON) {
223
249
  codexHome
224
250
  });
225
251
  }
226
- async function resumeLocalCodexCliSession(paramsJSON) {
252
+ async function resumeLocalCodexCliSession(paramsJSON, resolveCatalogSource, context) {
253
+ context?.signal?.throwIfAborted();
227
254
  const params = readRecordParam(paramsJSON);
228
255
  const sessionId = typeof params.sessionId === "string" ? params.sessionId.trim() : "";
229
256
  const prompt = typeof params.prompt === "string" ? params.prompt.trim() : "";
257
+ const expectedHomeId = readBoundedOptionalString(params, "sourceHomeId", 256);
230
258
  if (!sessionId || !SESSION_ID_PATTERN.test(sessionId)) throw new Error("Missing or invalid Codex CLI session id.");
231
259
  if (!prompt) throw new Error("Missing Codex CLI prompt.");
232
- if (activeResumeSessions.has(sessionId)) throw new Error(`Codex CLI session ${sessionId} already has an active resume turn.`);
233
- activeResumeSessions.add(sessionId);
260
+ let codexHome = resolveCodexAppServerUserHomeDir();
261
+ let sourceHomeId;
262
+ let assertCurrent;
263
+ if (params.agentId !== void 0) {
264
+ if (typeof params.agentId !== "string" || !params.agentId.trim()) throw new Error("Codex catalog agent id must be a nonempty string.");
265
+ const source = await resolveCatalogSource(params.agentId.trim());
266
+ if (source.transport !== "stdio") throw new Error("Codex CLI continuation requires a local Codex catalog source.");
267
+ codexHome = source.codexHome;
268
+ sourceHomeId = source.sourceHomeId;
269
+ assertCurrent = () => source.assertCurrent();
270
+ } else sourceHomeId = codexCatalogHomeId(codexHome);
271
+ if (expectedHomeId && expectedHomeId !== sourceHomeId) throw new Error("Codex catalog source home changed. Reopen the session from the catalog.");
272
+ context?.signal?.throwIfAborted();
273
+ const resumeKey = `${sourceHomeId}\0${sessionId}`;
274
+ if (activeResumeSessions.has(resumeKey)) throw new Error(`Codex CLI session ${sessionId} already has an active resume turn.`);
275
+ activeResumeSessions.add(resumeKey);
234
276
  try {
235
277
  const text = await runCodexExecResume({
236
278
  sessionId,
237
279
  prompt,
238
280
  cwd: typeof params.cwd === "string" && params.cwd.trim() ? params.cwd.trim() : void 0,
239
- timeoutMs: normalizeTimeoutMs(params.timeoutMs)
281
+ timeoutMs: normalizeTimeoutMs(params.timeoutMs),
282
+ codexHome,
283
+ assertCurrent,
284
+ signal: context?.signal
240
285
  });
241
286
  return JSON.stringify({
242
287
  ok: true,
@@ -244,7 +289,7 @@ async function resumeLocalCodexCliSession(paramsJSON) {
244
289
  text: text.trim() || "Codex completed without a text reply."
245
290
  });
246
291
  } finally {
247
- activeResumeSessions.delete(sessionId);
292
+ activeResumeSessions.delete(resumeKey);
248
293
  }
249
294
  }
250
295
  async function runCodexExecResume(params) {
@@ -266,22 +311,31 @@ async function runCodexExecResume(params) {
266
311
  execPath: process.execPath,
267
312
  packageName: "@openai/codex"
268
313
  }), args);
269
- const result = await runCommandBuffered([invocation.command, ...invocation.argv], {
270
- cwd: params.cwd || process.cwd(),
271
- input: params.prompt,
272
- env: process.env,
273
- killGraceMs: 2e3,
274
- killProcessTree: false,
275
- terminateOnOutputError: true,
276
- timeoutMs: params.timeoutMs
277
- });
314
+ const result = await withCommandProcessScope(() => {
315
+ params.assertCurrent?.();
316
+ return runCommandBuffered([invocation.command, ...invocation.argv], {
317
+ cwd: params.cwd || process.cwd(),
318
+ input: params.prompt,
319
+ env: {
320
+ ...process.env,
321
+ CODEX_HOME: params.codexHome
322
+ },
323
+ killGraceMs: 2e3,
324
+ signal: params.signal,
325
+ terminateOnOutputError: true,
326
+ timeoutMs: params.timeoutMs
327
+ });
328
+ }, params.signal);
329
+ params.signal?.throwIfAborted();
278
330
  if (result.termination === "timeout") throw new Error(`codex exec resume timed out after ${String(params.timeoutMs)}ms`);
279
331
  if (result.termination === "error" && result.error) throw result.error;
280
332
  if (result.code !== 0) {
281
333
  const message = result.stderr.toString("utf8").trim() || result.stdout.toString("utf8").trim() || `codex exec resume exited with code ${String(result.code)}`;
282
334
  throw new Error(message);
283
335
  }
284
- return await fs.readFile(outputPath, "utf8");
336
+ const text = await fs.readFile(outputPath, "utf8");
337
+ params.signal?.throwIfAborted();
338
+ return text;
285
339
  } finally {
286
340
  await fs.rm(path.dirname(outputPath), {
287
341
  recursive: true,
@@ -314,23 +368,6 @@ async function readHistorySessions(codexHome) {
314
368
  })).ok) return /* @__PURE__ */ new Map();
315
369
  return summaries;
316
370
  }
317
- async function hydrateSessionFiles(codexHome, summaries) {
318
- if (summaries.size === 0) return;
319
- const files = await findSessionFiles(path.join(codexHome, "sessions"), 4);
320
- const pending = new Set(summaries.keys());
321
- for (const file of files) {
322
- const basename = path.basename(file);
323
- const sessionId = [...pending].find((id) => basename.includes(id));
324
- if (!sessionId) continue;
325
- const entry = summaries.get(sessionId);
326
- if (!entry) continue;
327
- entry.sessionFile = file;
328
- const cwd = readSessionMetaCwd(await readFirstLine(file) ?? "");
329
- if (cwd) entry.cwd = cwd;
330
- pending.delete(sessionId);
331
- if (pending.size === 0) return;
332
- }
333
- }
334
371
  async function hydrateSessionsFromSessionFiles(codexHome, summaries) {
335
372
  const files = await findSessionFiles(path.join(codexHome, "sessions"), 4);
336
373
  for (const file of files) {
@@ -405,15 +442,6 @@ async function findSessionFiles(dir, maxDepth) {
405
442
  }
406
443
  return files;
407
444
  }
408
- function readSessionMetaCwd(line) {
409
- try {
410
- const parsed = JSON.parse(line);
411
- if (!isRecord(parsed) || parsed.type !== "session_meta" || !isRecord(parsed.payload)) return;
412
- return typeof parsed.payload.cwd === "string" && parsed.payload.cwd.trim() ? parsed.payload.cwd.trim() : void 0;
413
- } catch {
414
- return;
415
- }
416
- }
417
445
  function readResponseItemMessageText(parsed) {
418
446
  if (parsed.type !== "response_item" || !isRecord(parsed.payload)) return;
419
447
  if (parsed.payload.type !== "message") return;
@@ -482,16 +510,6 @@ function readRecordParam(paramsJSON) {
482
510
  return {};
483
511
  }
484
512
  }
485
- function resolveCodexHome() {
486
- return process.env.CODEX_HOME?.trim() || path.join(os.homedir(), ".codex");
487
- }
488
- async function readFirstLine(file) {
489
- let firstLine;
490
- return (await visitJsonlLines(file, (line) => {
491
- firstLine = line;
492
- return false;
493
- }, 65536)).ok ? firstLine : void 0;
494
- }
495
513
  async function readFileMtimeIso(file) {
496
514
  try {
497
515
  return (await fs.stat(file)).mtime.toISOString();
@@ -524,4 +542,4 @@ function formatNodeLabel(node) {
524
542
  ].filter(Boolean).join(" / ") || "node";
525
543
  }
526
544
  //#endregion
527
- export { listCodexCliSessionsOnNode as a, formatCodexCliSessions as i, createCodexCliSessionNodeHostCommands as n, resolveCodexCliSessionForBindingOnNode as o, createCodexCliSessionNodeInvokePolicies as r, resumeCodexCliSessionOnNode as s, CODEX_CLI_SESSION_RESUME_COMMAND as t };
545
+ export { createCodexCliSessionNodeInvokePolicies as a, resolveCodexCliSessionForBindingOnNode as c, createCodexCliSessionNodeHostCommands as i, resumeCodexCliSessionOnNode as l, CODEX_CLI_SESSION_SOURCE_CAPABILITY as n, formatCodexCliSessions as o, CODEX_CLI_SESSION_SOURCE_UPGRADE_MESSAGE as r, listCodexCliSessionsOnNode as s, CODEX_CLI_SESSION_RESUME_COMMAND as t };