@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,79 +0,0 @@
1
- import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
2
- import { INLINE_IMAGE_DATA_URL_PREFIX, sanitizeInlineImageDataUrl } from "openclaw/plugin-sdk/inline-image-data-url-runtime";
3
- //#region extensions/codex/src/app-server/image-payload-sanitizer.ts
4
- /**
5
- * Sanitizes inline image payloads mirrored through Codex history so invalid
6
- * base64 data becomes readable text instead of poisoning replayed transcripts.
7
- */
8
- const IMAGE_OMITTED_TEXT = "omitted image payload: invalid inline image data";
9
- /** Validates and normalizes an inline image data URL for Codex history payloads. */
10
- function sanitizeInlineImageDataUrl$1(imageUrl) {
11
- return sanitizeInlineImageDataUrl(imageUrl);
12
- }
13
- /** Builds the replacement text inserted when an inline image payload is invalid. */
14
- function invalidInlineImageText(label) {
15
- return `[${label}] ${IMAGE_OMITTED_TEXT}`;
16
- }
17
- function sanitizeImageContentRecord(record, label) {
18
- if (record.type === "image" && typeof record.data === "string") {
19
- const mimeType = typeof record.mimeType === "string" ? record.mimeType : "image/png";
20
- const imageUrl = sanitizeInlineImageDataUrl$1(`data:${mimeType};base64,${record.data}`);
21
- if (!imageUrl) return {
22
- type: "text",
23
- text: invalidInlineImageText(label)
24
- };
25
- const commaIndex = imageUrl.indexOf(",");
26
- const mime = imageUrl.slice(INLINE_IMAGE_DATA_URL_PREFIX.length, commaIndex).split(";")[0] ?? mimeType;
27
- const data = imageUrl.slice(commaIndex + 1);
28
- return mime === record.mimeType && data === record.data ? record : {
29
- ...record,
30
- mimeType: mime,
31
- data
32
- };
33
- }
34
- if (record.type === "inputImage" && typeof record.imageUrl === "string") {
35
- const imageUrl = sanitizeInlineImageDataUrl$1(record.imageUrl);
36
- if (!imageUrl) return {
37
- type: "inputText",
38
- text: invalidInlineImageText(label)
39
- };
40
- return imageUrl === record.imageUrl ? record : {
41
- ...record,
42
- imageUrl
43
- };
44
- }
45
- if (record.type === "input_image" && typeof record.image_url === "string") {
46
- const imageUrl = sanitizeInlineImageDataUrl$1(record.image_url);
47
- if (!imageUrl) return {
48
- type: "input_text",
49
- text: invalidInlineImageText(label)
50
- };
51
- return imageUrl === record.image_url ? record : {
52
- ...record,
53
- image_url: imageUrl
54
- };
55
- }
56
- }
57
- /** Sanitizes images without copying unchanged history or mutating its owned snapshot. */
58
- function sanitizeCodexHistoryImagePayloads(value, label) {
59
- if (Array.isArray(value)) {
60
- let next;
61
- for (let index = 0; index < value.length; index++) {
62
- const child = sanitizeCodexHistoryImagePayloads(value[index], label);
63
- if (child !== value[index]) (next ??= value.slice())[index] = child;
64
- }
65
- return next ?? value;
66
- }
67
- if (!isRecord(value)) return value;
68
- const imageRecord = sanitizeImageContentRecord(value, label);
69
- if (imageRecord) return imageRecord;
70
- let next;
71
- for (const key in value) {
72
- if (!Object.hasOwn(value, key)) continue;
73
- const child = sanitizeCodexHistoryImagePayloads(value[key], label);
74
- if (child !== value[key]) (next ??= { ...value })[key] = child;
75
- }
76
- return next ?? value;
77
- }
78
- //#endregion
79
- export { sanitizeCodexHistoryImagePayloads as n, sanitizeInlineImageDataUrl$1 as r, invalidInlineImageText as t };
@@ -1,311 +0,0 @@
1
- import { m as isJsonObject } from "./config-security-BRQ2mgW9.mjs";
2
- import { n as createCodexInferenceContext } from "./inference-context-fulhZuz8.mjs";
3
- import { promisify } from "node:util";
4
- import { zstdCompress, zstdDecompress } from "node:zlib";
5
- import { Writable } from "node:stream";
6
- import { WebSocket, WebSocketServer } from "openclaw/plugin-sdk/websocket-runtime";
7
- import { createServer } from "node:http";
8
- import { createNodeProxyAgent } from "openclaw/plugin-sdk/fetch-runtime";
9
- import { generateSecureToken } from "openclaw/plugin-sdk/secure-random-runtime";
10
- import { fetchWithSsrFGuard, isBlockedHostnameOrIp, resolvePinnedHostnameWithPolicy } from "openclaw/plugin-sdk/ssrf-runtime";
11
- //#region extensions/codex/src/app-server/inference-proxy.ts
12
- const MAX_BODY_BYTES = 33554432;
13
- const MAX_ERROR_BODY_BYTES = 1048576;
14
- const MAX_CONNECTIONS = 16;
15
- const compress = promisify(zstdCompress);
16
- const decompress = promisify(zstdDecompress);
17
- const HOP_HEADERS = /* @__PURE__ */ new Set([
18
- "connection",
19
- "keep-alive",
20
- "proxy-authenticate",
21
- "proxy-authorization",
22
- "te",
23
- "trailer",
24
- "transfer-encoding",
25
- "upgrade",
26
- "host",
27
- "content-length"
28
- ]);
29
- const FAILURE = "Codex parent-local inference transport failed; retry on a fresh connection.";
30
- /** Private, fixed-destination relay. No upstream credentials or model content are retained. */
31
- async function createCodexInferenceProxy(params) {
32
- const upstream = new URL(params.upstream);
33
- if (upstream.protocol !== "https:" || upstream.username || upstream.password || upstream.hash) throw new Error("Codex inference requires a credential-free HTTPS upstream URL");
34
- const lifetime = new AbortController();
35
- const assertCurrent = () => {
36
- lifetime.signal.throwIfAborted();
37
- params.assertCurrent();
38
- };
39
- const context = createCodexInferenceContext(assertCurrent);
40
- const pathPrefix = "/" + generateSecureToken({
41
- bytes: 32,
42
- redact: true
43
- }) + upstream.pathname.replace(/\/$/, "");
44
- const active = /* @__PURE__ */ new Set();
45
- const sockets = /* @__PURE__ */ new Set();
46
- const wss = new WebSocketServer({
47
- noServer: true,
48
- maxPayload: MAX_BODY_BYTES,
49
- perMessageDeflate: false
50
- });
51
- const handshakeHeaders = /* @__PURE__ */ new WeakMap();
52
- wss.on("headers", (headers, request) => {
53
- for (const [key, value] of Object.entries(handshakeHeaders.get(request) ?? {})) if (!key.startsWith("sec-websocket-")) headers.push(key + ": " + value);
54
- handshakeHeaders.delete(request);
55
- });
56
- const resolveTarget = (request) => {
57
- assertCurrent();
58
- if (request.headers.origin || !request.url?.startsWith(pathPrefix + "/") || isBlockedHostnameOrIp(upstream.hostname)) throw new Error(FAILURE);
59
- const suffix = request.url.slice(pathPrefix.length);
60
- if (suffix.startsWith("//") || suffix.includes("\\") || /%2e|%2f|%5c|(?:^|\/)\.\.?(?:\/|\?|$)/i.test(suffix)) throw new Error(FAILURE);
61
- const target = new URL(upstream);
62
- const incoming = new URL(suffix, "http://localhost");
63
- target.pathname = upstream.pathname.replace(/\/$/, "") + incoming.pathname;
64
- for (const [key, value] of incoming.searchParams) target.searchParams.append(key, value);
65
- return {
66
- target,
67
- sampling: incoming.pathname === "/responses"
68
- };
69
- };
70
- const prepare = (bytes, sampling) => {
71
- assertCurrent();
72
- if (!sampling) return {
73
- bytes,
74
- assertCurrent,
75
- signal: void 0
76
- };
77
- const value = JSON.parse(bytes.toString("utf8"));
78
- if (!isJsonObject(value)) throw new Error(FAILURE);
79
- const prepared = context.prepare(value);
80
- const rewritten = Buffer.from(JSON.stringify(prepared.body));
81
- if (rewritten.length > MAX_BODY_BYTES) throw new Error(FAILURE);
82
- return {
83
- ...prepared,
84
- bytes: rewritten
85
- };
86
- };
87
- const server = createServer((req, res) => {
88
- const controller = new AbortController();
89
- let guarded;
90
- const abort = () => controller.abort();
91
- req.once("aborted", abort);
92
- res.once("close", abort);
93
- (async () => {
94
- try {
95
- const { target, sampling } = resolveTarget(req);
96
- if (req.method !== "POST" || active.size >= MAX_CONNECTIONS) throw new Error(FAILURE);
97
- active.add(controller);
98
- const wire = await readProxyBody(req, MAX_BODY_BYTES);
99
- const encoding = req.headers["content-encoding"];
100
- if (encoding && encoding !== "identity" && encoding !== "zstd") throw new Error(FAILURE);
101
- const decoded = encoding === "zstd" ? await decompress(wire, { maxOutputLength: MAX_BODY_BYTES }) : wire;
102
- assertCurrent();
103
- const prepared = prepare(decoded, sampling);
104
- const body = Buffer.from(encoding === "zstd" ? await compress(prepared.bytes) : prepared.bytes);
105
- prepared.assertCurrent();
106
- const signal = AbortSignal.any([
107
- lifetime.signal,
108
- controller.signal,
109
- ...prepared.signal ? [prepared.signal] : []
110
- ]);
111
- guarded = await fetchWithSsrFGuard({
112
- url: target.toString(),
113
- init: {
114
- method: "POST",
115
- headers: relayHeaders(req.headers),
116
- body,
117
- signal
118
- },
119
- signal,
120
- beforeRequest: prepared.assertCurrent,
121
- requireHttps: true,
122
- maxRedirects: 0,
123
- capture: false,
124
- mode: "trusted_env_proxy",
125
- auditContext: "codex-parent-local-inference"
126
- });
127
- prepared.assertCurrent();
128
- const headers = Object.fromEntries(guarded.response.headers);
129
- delete headers["content-encoding"];
130
- res.writeHead(guarded.response.status, relayHeaders(headers));
131
- if (!guarded.response.body) res.end();
132
- else await guarded.response.body.pipeTo(Writable.toWeb(res), { signal });
133
- } catch {
134
- if (!res.headersSent && !res.destroyed) res.writeHead(502, { "content-type": "text/plain" }).end(FAILURE);
135
- else res.destroy();
136
- } finally {
137
- active.delete(controller);
138
- req.off("aborted", abort);
139
- res.off("close", abort);
140
- await guarded?.release().catch(() => void 0);
141
- }
142
- })();
143
- });
144
- server.maxConnections = MAX_CONNECTIONS;
145
- server.requestTimeout = 3e4;
146
- server.headersTimeout = 1e4;
147
- server.on("upgrade", (req, socket, head) => {
148
- (async () => {
149
- let remote;
150
- let local;
151
- let proxyAgent;
152
- const controller = new AbortController();
153
- const close = () => {
154
- controller.abort();
155
- active.delete(controller);
156
- remote?.terminate();
157
- local?.terminate();
158
- proxyAgent?.destroy();
159
- if (remote) sockets.delete(remote);
160
- if (local) sockets.delete(local);
161
- socket.destroy();
162
- };
163
- try {
164
- const { target, sampling } = resolveTarget(req);
165
- if (!sampling || active.size >= MAX_CONNECTIONS) throw new Error(FAILURE);
166
- active.add(controller);
167
- socket.once("close", close);
168
- socket.once("error", close);
169
- const signal = AbortSignal.any([lifetime.signal, controller.signal]);
170
- proxyAgent = createNodeProxyAgent({
171
- mode: "env",
172
- targetUrl: target.href
173
- });
174
- const lookup = proxyAgent ? void 0 : (await resolvePinnedHostnameWithPolicy(target.hostname, { signal })).lookup;
175
- assertCurrent();
176
- signal.throwIfAborted();
177
- target.protocol = "wss:";
178
- const headers = relayHeaders(req.headers);
179
- for (const key of Object.keys(headers)) if (key.startsWith("sec-websocket-")) delete headers[key];
180
- remote = new WebSocket(target, {
181
- headers,
182
- ...proxyAgent ? { agent: proxyAgent } : { lookup },
183
- followRedirects: false,
184
- perMessageDeflate: false,
185
- maxPayload: MAX_BODY_BYTES,
186
- handshakeTimeout: 1e4
187
- });
188
- sockets.add(remote);
189
- remote.once("upgrade", (response) => {
190
- handshakeHeaders.set(req, relayHeaders(response.headers));
191
- });
192
- remote.once("error", close);
193
- remote.once("close", close);
194
- remote.once("unexpected-response", (_request, response) => {
195
- (async () => {
196
- try {
197
- const body = await readProxyBody(response, MAX_ERROR_BODY_BYTES);
198
- assertCurrent();
199
- signal.throwIfAborted();
200
- const failureHeaders = Object.entries(relayHeaders(response.headers)).map(([key, value]) => key + ": " + value);
201
- failureHeaders.push("Connection: close", "Content-Length: " + body.length);
202
- const status = "HTTP/1.1 " + response.statusCode + " " + (response.statusMessage ?? "Upstream refused");
203
- socket.end(Buffer.concat([Buffer.from(status + "\r\n" + failureHeaders.join("\r\n") + "\r\n\r\n"), body]), close);
204
- } catch {
205
- close();
206
- }
207
- })();
208
- });
209
- remote.once("open", () => {
210
- try {
211
- assertCurrent();
212
- signal.throwIfAborted();
213
- wss.handleUpgrade(req, socket, head, (accepted) => {
214
- local = accepted;
215
- sockets.add(accepted);
216
- accepted.once("error", close);
217
- accepted.once("close", close);
218
- let releaseFrame = () => {};
219
- accepted.on("message", (data, binary) => {
220
- try {
221
- if (binary) throw new Error(FAILURE);
222
- const prepared = prepare(rawBytes(data), true);
223
- prepared.assertCurrent();
224
- releaseFrame();
225
- const onAbort = () => close();
226
- prepared.signal?.addEventListener("abort", onAbort, { once: true });
227
- releaseFrame = () => prepared.signal?.removeEventListener("abort", onAbort);
228
- if (!remote || remote.readyState !== WebSocket.OPEN || remote.bufferedAmount + prepared.bytes.length > MAX_BODY_BYTES) throw new Error(FAILURE);
229
- remote.send(prepared.bytes, { binary: false }, (error) => {
230
- if (error) close();
231
- });
232
- } catch {
233
- close();
234
- }
235
- });
236
- accepted.once("close", () => releaseFrame());
237
- remote.on("message", (data, binary) => {
238
- if (accepted.readyState !== WebSocket.OPEN || accepted.bufferedAmount + rawBytes(data).length > MAX_BODY_BYTES) {
239
- close();
240
- return;
241
- }
242
- accepted.send(data, { binary }, (error) => {
243
- if (error) close();
244
- });
245
- });
246
- });
247
- } catch {
248
- close();
249
- }
250
- });
251
- } catch {
252
- close();
253
- }
254
- })();
255
- });
256
- const close = () => {
257
- lifetime.abort();
258
- context.close();
259
- for (const controller of active) controller.abort();
260
- for (const socket of sockets) socket.terminate();
261
- server.close();
262
- server.closeAllConnections();
263
- wss.close();
264
- };
265
- try {
266
- await new Promise((resolve, reject) => {
267
- server.once("error", reject);
268
- server.listen(0, "127.0.0.1", () => {
269
- server.off("error", reject);
270
- resolve();
271
- });
272
- });
273
- assertCurrent();
274
- server.on("error", close);
275
- const address = server.address();
276
- if (!address || typeof address === "string") throw new Error(FAILURE);
277
- return {
278
- context,
279
- upstream: upstream.toString(),
280
- baseUrl: "http://127.0.0.1:" + address.port + pathPrefix,
281
- assertCurrent,
282
- close
283
- };
284
- } catch (error) {
285
- close();
286
- throw error;
287
- }
288
- }
289
- async function readProxyBody(stream, maxBytes) {
290
- const chunks = [];
291
- let size = 0;
292
- for await (const chunk of stream) {
293
- const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
294
- size += bytes.length;
295
- if (size > maxBytes) throw new Error(FAILURE);
296
- chunks.push(bytes);
297
- }
298
- return Buffer.concat(chunks);
299
- }
300
- function rawBytes(data) {
301
- return Array.isArray(data) ? Buffer.concat(data) : Buffer.isBuffer(data) ? data : Buffer.from(data);
302
- }
303
- function relayHeaders(input) {
304
- const excluded = new Set(HOP_HEADERS);
305
- for (const token of (input.connection ?? "").split(",")) excluded.add(token.trim().toLowerCase());
306
- const output = {};
307
- for (const [key, value] of Object.entries(input)) if (value !== void 0 && !excluded.has(key.toLowerCase())) output[key.toLowerCase()] = Array.isArray(value) ? value.join(", ") : value;
308
- return output;
309
- }
310
- //#endregion
311
- export { createCodexInferenceProxy };
@@ -1,111 +0,0 @@
1
- //#region extensions/codex/src/app-server/launch-args.ts
2
- const CODEX_VALUE_OPTIONS = /* @__PURE__ */ new Set([
3
- "-m",
4
- "--model",
5
- "--local-provider",
6
- "-p",
7
- "--profile",
8
- "-s",
9
- "--sandbox",
10
- "-a",
11
- "--ask-for-approval",
12
- "-C",
13
- "--cd",
14
- "--add-dir",
15
- "--remote",
16
- "--remote-auth-token-env",
17
- "-c",
18
- "--config",
19
- "--enable",
20
- "--disable",
21
- "--listen",
22
- "--code-mode-host",
23
- "--ws-auth",
24
- "--ws-token-file",
25
- "--ws-token-sha256",
26
- "--ws-shared-secret-file",
27
- "--ws-issuer",
28
- "--ws-audience",
29
- "--ws-max-clock-skew-seconds"
30
- ]);
31
- /** One tokenization owner for launch, turn policy, reviewer trust, and private turns. */
32
- function readCodexArgs(args) {
33
- const tokens = [];
34
- let nativeSubcommand = false;
35
- let end = 0;
36
- for (const [index, arg] of args.entries()) {
37
- if (index < end) continue;
38
- end = index + 1;
39
- const attached = /^(--[^=]+)=([\s\S]*)$/u.exec(arg) ?? /^(-[cmpisaC])=?([\s\S]+)$/u.exec(arg);
40
- const name = attached?.[1] ?? arg;
41
- let value = attached?.[2];
42
- if (name === "-i" || name === "--image") while (args[end]?.startsWith("-") === false) end += 1;
43
- else if (!attached && CODEX_VALUE_OPTIONS.has(name)) {
44
- value = args[end];
45
- if (value !== void 0) end += 1;
46
- }
47
- tokens.push({
48
- index,
49
- end,
50
- name,
51
- value
52
- });
53
- if (name === "app-server") nativeSubcommand = true;
54
- if (name === "--" && nativeSubcommand) break;
55
- }
56
- return tokens;
57
- }
58
- /** Uses the native CLI configuration for status without starting its transport. */
59
- function buildCodexLoginStatusArgs(args) {
60
- const options = /* @__PURE__ */ new Set([
61
- "-c",
62
- "--config",
63
- "-p",
64
- "--profile",
65
- "--enable",
66
- "--disable"
67
- ]);
68
- const tokens = readCodexArgs(args);
69
- const subcommandIndex = tokens.findLast(({ name }) => name === "app-server")?.index ?? -1;
70
- const prefix = subcommandIndex < 0 ? [] : args.slice(0, subcommandIndex);
71
- const configArgs = tokens.filter(({ index, name }) => index > subcommandIndex && options.has(name)).flatMap(({ index, end }) => args.slice(index, end));
72
- return [
73
- ...prefix,
74
- ...configArgs,
75
- "login",
76
- "status"
77
- ];
78
- }
79
- function readCodexAppServerConfigOptions(args) {
80
- return readCodexArgs(args).filter(({ name }) => name === "-c" || name === "--config" || name === "-p" || name === "--profile");
81
- }
82
- /** The stdio proxy forwards to an external server; it does not own that runtime. */
83
- function isCodexAppServerProxyLaunch(args) {
84
- const tokens = readCodexArgs(args);
85
- const server = tokens.findLastIndex(({ name }) => name === "app-server");
86
- return server >= 0 && tokens.slice(server + 1).find(({ name }) => !name.startsWith("-"))?.name === "proxy";
87
- }
88
- /** Keeps Codex overrides in one CLI scope without rewriting raw TOML or wrapper prefixes. */
89
- function normalizeCodexAppServerArgs(rawArgs, enforcedOverride) {
90
- const tokens = readCodexArgs(rawArgs);
91
- const subcommandIndex = tokens.findLast(({ name }) => name === "app-server")?.index ?? -1;
92
- const prefix = subcommandIndex < 0 ? [...rawArgs] : rawArgs.slice(0, subcommandIndex);
93
- const suffix = [];
94
- if (subcommandIndex >= 0) for (const token of tokens) {
95
- if (token.index <= subcommandIndex) continue;
96
- if (token.name === "--") {
97
- suffix.push(...rawArgs.slice(token.index));
98
- break;
99
- }
100
- (token.name === "-c" || token.name === "--config" ? prefix : suffix).push(...rawArgs.slice(token.index, token.end));
101
- }
102
- if (enforcedOverride && !(prefix.at(-2) === "-c" && prefix.at(-1) === enforcedOverride)) prefix.push("-c", enforcedOverride);
103
- const normalized = subcommandIndex < 0 ? prefix : [
104
- ...prefix,
105
- "app-server",
106
- ...suffix
107
- ];
108
- return normalized.length === rawArgs.length && normalized.every((arg, index) => arg === rawArgs[index]) ? rawArgs : normalized;
109
- }
110
- //#endregion
111
- export { readCodexAppServerConfigOptions as i, isCodexAppServerProxyLaunch as n, normalizeCodexAppServerArgs as r, buildCodexLoginStatusArgs as t };
@@ -1,19 +0,0 @@
1
- import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
2
- //#region extensions/codex/src/app-server/local-runtime-attribution.ts
3
- const OPENAI_PROVIDER_ID = "openai";
4
- const OPENAI_RESPONSES_API = "openai-responses";
5
- const OPENAI_CODEX_RESPONSES_API = "openai-chatgpt-responses";
6
- /** Maps local Codex runtime plans onto the provider/api pair exposed to event projection. */
7
- function resolveCodexLocalRuntimeAttribution(params) {
8
- const authProfileProvider = normalizeLowercaseStringOrEmpty(params.runtimePlan?.auth?.authProfileProviderForAuth);
9
- if (normalizeLowercaseStringOrEmpty(params.runtimePlan?.observability.harnessId) === "codex" && authProfileProvider !== OPENAI_PROVIDER_ID && normalizeLowercaseStringOrEmpty(params.model.provider) === OPENAI_PROVIDER_ID && normalizeLowercaseStringOrEmpty(params.model.api) === OPENAI_RESPONSES_API) return {
10
- provider: OPENAI_PROVIDER_ID,
11
- api: OPENAI_CODEX_RESPONSES_API
12
- };
13
- return {
14
- provider: params.provider,
15
- api: params.model.api
16
- };
17
- }
18
- //#endregion
19
- export { resolveCodexLocalRuntimeAttribution as t };
@@ -1,135 +0,0 @@
1
- import { S as readCodexNativeSubagentHistoryOwner, p as sessionBindingIdentity, y as codexNativeSubagentHistoryConnectionFingerprint } from "./session-binding-record-TH3xA0zj.mjs";
2
- import { t as readCodexThreadHistoryPage } from "./thread-history-page-BTx-4xsg.mjs";
3
- import { r as readMirrorIdentity } from "./upstream-prompt-provenance-LphB8slG.mjs";
4
- import { r as projectCodexThreadHistoryItem } from "./transcript-history-projection-DHNBDhCU.mjs";
5
- import { n as buildCodexAppServerRuntimeFingerprint, t as buildCodexAppServerConnectionFingerprint } from "./plugin-app-cache-key-BOxKP7db.mjs";
6
- import { i as resolveCodexBindingAppServerConnection } from "./binding-connection-Bm38niE8.mjs";
7
- import { c as getLeasedSharedCodexAppServerClient, h as releaseLeasedSharedCodexAppServerClient } from "./shared-client-BpTtuLQ5.mjs";
8
- import { a as readCodexNativeSubagentRunId, f as itemToolArgs, h as itemTranscriptResultText } from "./native-subagent-task-ids-DsuOonKv.mjs";
9
- import { resolveAgentDir } from "openclaw/plugin-sdk/agent-runtime";
10
- import { getSessionEntry, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
11
- //#region extensions/codex/src/app-server/native-subagent-history.ts
12
- const MAX_SUBAGENT_ANCESTRY_READS = 32;
13
- const taskHistoryToolItems = {
14
- itemToolArgs,
15
- itemTranscriptResultText
16
- };
17
- function parentThreadId(thread) {
18
- const source = thread.source;
19
- const spawn = source && typeof source === "object" && "subAgent" in source && typeof source.subAgent === "object" && "thread_spawn" in source.subAgent ? source.subAgent.thread_spawn : void 0;
20
- return thread.parentThreadId?.trim() ?? spawn?.parent_thread_id.trim();
21
- }
22
- /** Resolves history from the parent binding's native store without adopting the child. */
23
- async function readCodexNativeSubagentHistory(params, options) {
24
- params.assertCurrent();
25
- const { task, cfg } = params;
26
- const sessionKey = task.requesterSessionKey;
27
- const agentId = task.agentId;
28
- const threadId = readCodexNativeSubagentRunId(task.runId)?.threadId;
29
- if (task.taskKind !== "codex-native" || !sessionKey || !agentId || !threadId) throw new Error("Subagent transcript owner is unavailable.");
30
- const storePath = resolveStorePath(cfg.session?.store, { agentId });
31
- const readSession = () => getSessionEntry({
32
- agentId,
33
- sessionKey,
34
- storePath,
35
- hydrateSkillPromptRefs: false,
36
- readConsistency: "latest"
37
- });
38
- const session = readSession();
39
- if (!session?.sessionId) throw new Error("Subagent parent session is unavailable.");
40
- const sessionId = session.sessionId;
41
- const lifecycleRevision = session.lifecycleRevision;
42
- const historyOwner = readCodexNativeSubagentHistoryOwner(task.detail);
43
- if (historyOwner && (historyOwner.lifecycleRevision ? historyOwner.lifecycleRevision !== lifecycleRevision : historyOwner.sessionId !== sessionId)) throw new Error("Subagent history owner changed; reconnect its parent session.");
44
- const identity = sessionBindingIdentity({
45
- agentId,
46
- sessionId,
47
- sessionKey,
48
- config: cfg
49
- });
50
- const binding = options.bindingStore.read(identity);
51
- if (!binding || binding.pendingSupervisionBranch) throw new Error("Subagent parent thread is unavailable.");
52
- if (historyOwner && historyOwner.connectionFingerprint !== codexNativeSubagentHistoryConnectionFingerprint(binding)) throw new Error("Subagent history owner changed; reconnect its parent session.");
53
- const historyParentThreadId = historyOwner?.parentThreadId ?? binding.threadId;
54
- const assertCurrent = () => {
55
- params.assertCurrent();
56
- const currentSession = readSession();
57
- const current = options.bindingStore.read(identity);
58
- if (currentSession?.sessionId !== sessionId || currentSession?.lifecycleRevision !== lifecycleRevision || current?.threadId !== binding.threadId || current?.appServerRuntimeFingerprint !== binding.appServerRuntimeFingerprint || current?.connectionScope !== binding.connectionScope || current?.authProfileId !== binding.authProfileId) throw new Error("Subagent parent changed; refresh its transcript.");
59
- };
60
- const agentDir = resolveAgentDir(cfg, agentId);
61
- const connection = await resolveCodexBindingAppServerConnection({
62
- binding,
63
- pluginConfig: options.pluginConfig,
64
- agentDir,
65
- config: cfg,
66
- assertCurrent,
67
- authProfileId: binding.authProfileId
68
- });
69
- const client = await getLeasedSharedCodexAppServerClient({
70
- startOptions: connection.appServer.start,
71
- timeoutMs: connection.appServer.requestTimeoutMs,
72
- authProfileId: connection.clientAuthProfileId,
73
- agentDir,
74
- config: cfg,
75
- assertCurrent
76
- });
77
- try {
78
- assertCurrent();
79
- const fingerprint = binding.connectionScope === "supervision" ? buildCodexAppServerConnectionFingerprint(connection.appServer, agentDir) : buildCodexAppServerRuntimeFingerprint({
80
- appServer: connection.appServer,
81
- appServerVersion: client.getServerVersion(),
82
- runtimeIdentity: client.getRuntimeIdentity()
83
- });
84
- if (!binding.appServerRuntimeFingerprint || fingerprint !== binding.appServerRuntimeFingerprint) throw new Error("Subagent connection changed; reconnect its parent session.");
85
- const read = async (method, request) => {
86
- assertCurrent();
87
- const result = await client.request(method, request, { assertCurrent });
88
- assertCurrent();
89
- return result;
90
- };
91
- const { thread } = await read("thread/read", {
92
- threadId,
93
- includeTurns: false
94
- });
95
- if (thread.id !== threadId || threadId === historyParentThreadId) throw new Error("Subagent transcript does not belong to this parent session.");
96
- const visited = /* @__PURE__ */ new Set([threadId]);
97
- let ancestor = thread;
98
- for (;;) {
99
- const parentId = parentThreadId(ancestor);
100
- if (parentId === historyParentThreadId) break;
101
- if (!parentId || visited.has(parentId) || visited.size >= MAX_SUBAGENT_ANCESTRY_READS) throw new Error("Subagent transcript does not belong to this parent session.");
102
- visited.add(parentId);
103
- const response = await read("thread/read", {
104
- threadId: parentId,
105
- includeTurns: false
106
- });
107
- if (response.thread.id !== parentId) throw new Error("Subagent transcript does not belong to this parent session.");
108
- ancestor = response.thread;
109
- }
110
- const page = await readCodexThreadHistoryPage({
111
- listItemPage: (request) => read("thread/items/list", request),
112
- listTurnPage: (request) => read("thread/turns/list", request)
113
- }, thread, {
114
- threadId,
115
- cursor: params.cursor,
116
- limit: Math.max(1, Math.floor(Math.min(params.limit, 200) / 2))
117
- }, {
118
- project: (entries) => entries.map((entry) => projectCodexThreadHistoryItem(thread, entry, taskHistoryToolItems).map((message) => {
119
- const messageIdentity = readMirrorIdentity(message);
120
- if (!messageIdentity) throw new Error("Subagent history message is missing its native identity.");
121
- return Object.assign(message, { messageId: JSON.stringify([threadId, messageIdentity]) });
122
- })),
123
- fits: (result) => Buffer.byteLength(JSON.stringify(result), "utf8") <= 524288
124
- });
125
- assertCurrent();
126
- return {
127
- messages: page.items.toReversed().flat(),
128
- ...page.nextCursor ? { nextCursor: page.nextCursor } : {}
129
- };
130
- } finally {
131
- releaseLeasedSharedCodexAppServerClient(client);
132
- }
133
- }
134
- //#endregion
135
- export { readCodexNativeSubagentHistory };