@openclaw/codex 2026.9.6 → 2026.9.8

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 (158) hide show
  1. package/README.md +2 -0
  2. package/assets/icon.png +0 -0
  3. package/dist/.setup/{account-usage-runtime-Eem_WGqY.mjs → account-usage-runtime-G348lY1q.mjs} +5 -5
  4. package/dist/.setup/{apply-DDOi8uNx.mjs → apply-Cqb-YoCS.mjs} +22 -36
  5. package/dist/.setup/{attempt-client-cleanup-CEv1cKwF.mjs → attempt-client-cleanup-B-S7ngS_.mjs} +128 -37
  6. package/dist/.setup/attempt-workspace-context-BJ5Z_olH.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-B2mpaI9D.mjs → auth-cache-key-Dnps4W4_.mjs} +36 -34
  9. package/dist/.setup/{auth-profile-WqZtZfXN.mjs → auth-profile-B0okYl2D.mjs} +1 -2
  10. package/dist/.setup/auth-start-options-BPIPeEX8.mjs +44 -0
  11. package/dist/.setup/{binding-connection-ThoatDcb.mjs → binding-connection-DTtN1KrX.mjs} +2 -2
  12. package/dist/.setup/{binding-connection.runtime-yoHrABt-.mjs → binding-connection.runtime-6TpgD1M6.mjs} +4 -4
  13. package/dist/.setup/{bounded-turn-B2HScEgT.mjs → bounded-turn-BNunZPtz.mjs} +15 -18
  14. package/dist/.setup/bounded-turn-isolation-B8K_ylqk.mjs +14 -0
  15. package/dist/.setup/{build-state-C7EnDVgr.mjs → build-state-DIQ5O_-S.mjs} +1 -1
  16. package/dist/.setup/{capabilities-CDXOOFdZ.mjs → capabilities-B3WEZl4e.mjs} +2 -10
  17. package/dist/.setup/{client-catalog-response-BMgt_4q4.mjs → client-catalog-response-DRvx_wCC.mjs} +1 -1
  18. package/dist/.setup/{client-Cs08OXVQ.mjs → client-qyUBJlGZ.mjs} +138 -399
  19. package/dist/.setup/{command-dispatch-B4JuOsOk.mjs → command-dispatch-Btrs1D6f.mjs} +5 -8
  20. package/dist/.setup/{command-formatters-Bmqvr9tO.mjs → command-formatters-R3ckE3Co.mjs} +29 -61
  21. package/dist/.setup/{command-handlers-DW7Lx9oH.mjs → command-handlers-DvlCHJch.mjs} +222 -343
  22. package/dist/.setup/{command-rpc-DixIj3HW.mjs → command-rpc-skzRq4wD.mjs} +15 -18
  23. package/dist/.setup/compact-8ttks5U5.mjs +776 -0
  24. package/dist/.setup/{config-BoTP_mrL.mjs → config-DKhXquav.mjs} +26 -28
  25. package/dist/.setup/{config-options-BvaRs51b.mjs → config-options-CzyWLTJt.mjs} +24 -37
  26. package/dist/.setup/{config-parsing-CcB9iPoq.mjs → config-parsing-b088LyhT.mjs} +57 -60
  27. package/dist/.setup/{config-runtime-C8Rw1m1m.mjs → config-runtime-C0NbLms1.mjs} +2 -2
  28. package/dist/.setup/{config-security-BEReZ6go.mjs → config-security-CE-FcGw9.mjs} +32 -111
  29. package/dist/.setup/{config-utils-DujwEnhg.mjs → config-utils-D0CXecki.mjs} +3 -13
  30. package/dist/.setup/context-engine-projection-PezSESth.mjs +387 -0
  31. package/dist/.setup/{conversation-binding-DP-gMrBP.mjs → conversation-binding-74LaGGH-.mjs} +67 -90
  32. package/dist/.setup/{conversation-binding-data-CrcyZk6O.mjs → conversation-binding-data-C746z5Pn.mjs} +8 -12
  33. package/dist/.setup/{conversation-control-uK9Jomlc.mjs → conversation-control-OrN6zuaY.mjs} +8 -8
  34. package/dist/.setup/{cyber-failover-DYwbmf1o.mjs → cyber-failover-XV0nNRZu.mjs} +1 -1
  35. package/dist/.setup/{cyber-failover-notice-e9G3J9-e.mjs → cyber-failover-notice-RNpGpTyP.mjs} +1 -1
  36. package/dist/.setup/{dynamic-tools-BDXl-8Cw.mjs → dynamic-tools-Db2sY5cZ.mjs} +2305 -2606
  37. package/dist/.setup/{effective-mcp-catalog-CvnvnGIe.mjs → effective-mcp-catalog-Bi6-SQ7i.mjs} +8 -17
  38. package/dist/.setup/{ephemeral-turn-poidXgek.mjs → ephemeral-turn-DiCS1ijR.mjs} +3 -3
  39. package/dist/.setup/event-projector-assistant-message-MV_1dj-3.mjs +69 -0
  40. package/dist/.setup/{event-projector-usage-CnBS8Wa3.mjs → event-projector-usage-03R0I2dM.mjs} +3 -25
  41. package/dist/.setup/event-projector-values-DJSz8BTk.mjs +106 -0
  42. package/dist/.setup/incognito-session-DWYapfwf.mjs +2 -0
  43. package/dist/.setup/{inference-context-D96l9-ew.mjs → inference-context-D-9gWlTR.mjs} +16 -18
  44. package/dist/.setup/inference-dispatch-CMZtjQyz.mjs +359 -0
  45. package/dist/.setup/inference-metadata-CgIf7sOx.mjs +81 -0
  46. package/dist/.setup/{inference-proxy-b-aJMSxm.mjs → inference-proxy-DhcXOgUE.mjs} +174 -214
  47. package/dist/.setup/{isolated-completion-BIZFhTNG.mjs → isolated-completion-D80IXfQF.mjs} +9 -12
  48. package/dist/.setup/{managed-binary-BnshlFag.mjs → managed-binary-kiWRhNRE.mjs} +8 -12
  49. package/dist/.setup/{model-catalog-CfXJf9Ay.mjs → model-catalog-DiC0Tkha.mjs} +11 -10
  50. package/dist/.setup/model-runtime-BdqzOMkU.mjs +11 -0
  51. package/dist/.setup/{models-KnqBv0hE.mjs → models-DfLmPV0k.mjs} +9 -18
  52. package/dist/.setup/{native-auth-rWbGbMn3.mjs → native-auth-CuG53tu4.mjs} +4 -4
  53. package/dist/.setup/{native-execution-policy-umd0tgh4.mjs → native-execution-policy-BxZJy5mP.mjs} +5 -30
  54. package/dist/.setup/{native-subagent-monitor-D3filLY2.mjs → native-subagent-monitor-BwkQXf9e.mjs} +4395 -3609
  55. package/dist/.setup/native-subagent-pending-assignments-DwkCzLvD.mjs +203 -0
  56. package/dist/.setup/native-task-assignments-DMQ0g3hu.mjs +194 -0
  57. package/dist/.setup/{node-cli-sessions-r3avj02l.mjs → node-cli-sessions-HC4W6FLI.mjs} +19 -49
  58. package/dist/.setup/{node-exec-server.runtime-BDwWXVpK.mjs → node-exec-server.runtime-BgBfWQqo.mjs} +3 -6
  59. package/dist/.setup/{plan-CN3VwfNU.mjs → plan-DPdMk1Oy.mjs} +49 -92
  60. package/dist/.setup/{plugin-activation-DT3MNtqj.mjs → plugin-activation-cNHRfaxU.mjs} +8 -36
  61. package/dist/.setup/{plugin-app-cache-key-B2CsSdnV.mjs → plugin-app-cache-key-BL9B5H0L.mjs} +6 -23
  62. package/dist/.setup/{plugin-inventory-BoRei8Z4.mjs → plugin-inventory-Cky2XJUw.mjs} +21 -21
  63. package/dist/.setup/{plugin-marketplace-discovery-CDOi8IFs.mjs → plugin-marketplace-discovery-D_dV9FXa.mjs} +18 -24
  64. package/dist/.setup/{plugin-metadata-cache-Ctmo83k_.mjs → plugin-metadata-cache-BRwtRct9.mjs} +116 -176
  65. package/dist/.setup/{provider-BOsxQHOM.mjs → provider-D6F_7p1I.mjs} +11 -14
  66. package/dist/.setup/{provider-capabilities-BfE88FZ5.mjs → provider-capabilities-DG5qbsUZ.mjs} +13 -18
  67. package/dist/.setup/{rate-limits-CMU3DUD0.mjs → rate-limits-B7-X2TgG.mjs} +9 -31
  68. package/dist/.setup/{request-D2L0zMrq.mjs → request-BZOfsSXW.mjs} +7 -6
  69. package/dist/.setup/responses-oauth-twnuTaAa.mjs +93 -0
  70. package/dist/.setup/rpc-error-BlD2vuzn.mjs +31 -0
  71. package/dist/.setup/{run-attempt-BHu11r7h.mjs → run-attempt-dYJhjZrp.mjs} +1035 -1023
  72. package/dist/.setup/{run-attempt-lifecycle-B7JbY4-F.mjs → run-attempt-lifecycle-C-6O3Exn.mjs} +10 -24
  73. package/dist/.setup/{runtime-artifact-CLZ8udh-.mjs → runtime-artifact-DDQ-HGXf.mjs} +16 -4
  74. package/dist/.setup/runtime-artifact-connection-D68qQn1m.mjs +78 -0
  75. package/dist/.setup/sandbox-guard-DjCz2eOw.mjs +126 -0
  76. package/dist/.setup/scope-DOC1Xjc8.mjs +6 -0
  77. package/dist/.setup/session-binding-DGCYAfvD.mjs +443 -0
  78. package/dist/.setup/{session-binding-record-BGoz8wOK.mjs → session-binding-record-Oe9L-CNY.mjs} +52 -130
  79. package/dist/.setup/{session-binding-sidecars-BlB5EvIS.mjs → session-binding-sidecars-jo6H8dFr.mjs} +196 -17
  80. package/dist/.setup/{session-catalog-Pno1xGcl.mjs → session-catalog-BFafIiF6.mjs} +185 -350
  81. package/dist/.setup/{session-catalog-adoption-BI6UTDZT.mjs → session-catalog-adoption-BU_pHWG7.mjs} +7 -6
  82. package/dist/.setup/{session-catalog-archive-lHBqzhaO.mjs → session-catalog-archive-spHfihri.mjs} +6 -6
  83. package/dist/.setup/session-catalog-events-BMCFMZw-.mjs +139 -0
  84. package/dist/.setup/session-catalog-home-id-vlih0B_g.mjs +22 -0
  85. package/dist/.setup/{session-catalog-index-B9_VQIUz.mjs → session-catalog-index-DwJjnF5k.mjs} +126 -122
  86. package/dist/.setup/{session-catalog-index-order-hcdz07yN.mjs → session-catalog-index-order-BcQpHks3.mjs} +1 -1
  87. package/dist/.setup/{session-catalog-index-state-Dgh8ORJm.mjs → session-catalog-index-state-TeO7EyO-.mjs} +3 -2
  88. package/dist/.setup/session-catalog-limits-DDxOsQeC.mjs +14 -0
  89. package/dist/.setup/session-catalog-list-request-CvtxrYSe.mjs +170 -0
  90. package/dist/.setup/session-catalog-native-projection-CuaFZuQE.mjs +178 -0
  91. package/dist/.setup/{session-catalog-node-adoption-ITddWx_X.mjs → session-catalog-node-adoption-DgXvSGu0.mjs} +10 -27
  92. package/dist/.setup/{session-catalog-node-continue-6g6qi4A9.mjs → session-catalog-node-continue-DjKXHBbi.mjs} +8 -10
  93. package/dist/.setup/session-catalog-node-lookup-CtAXI5W5.mjs +56 -0
  94. package/dist/.setup/{session-catalog-native-projection-DowriLid.mjs → session-catalog-parsing-CPGaPYr-.mjs} +11 -194
  95. package/dist/.setup/{session-catalog-projection-zK_PUsiE.mjs → session-catalog-projection-CGfzfP93.mjs} +6 -4
  96. package/dist/.setup/session-catalog-provenance-DoAvktcj.mjs +95 -0
  97. package/dist/.setup/{session-cli-irrD-uo7.mjs → session-cli-DlmBHYIe.mjs} +9 -22
  98. package/dist/.setup/{session-history-BrqhSCf9.mjs → session-history-D83lJWHG.mjs} +4 -6
  99. package/dist/.setup/{session-history-import-D-3wAgOP.mjs → session-history-import-WhX-X33a.mjs} +7 -10
  100. package/dist/.setup/session-history-read-Ov3StuL4.mjs +133 -0
  101. package/dist/.setup/{session-history.worker-CaCh0xF_.mjs → session-history.worker-MnPKncqP.mjs} +9 -5
  102. package/dist/.setup/session-initialization-6aveB9qb.mjs +22 -0
  103. package/dist/.setup/{session-permission-policy-BI1QK_98.mjs → session-permission-policy-Ci_fVX6y.mjs} +4 -8
  104. package/dist/.setup/{session-retirement-BH-S6qkJ.mjs → session-retirement-LlYWBKTJ.mjs} +17 -17
  105. package/dist/.setup/{settled-turn-context-fmwouT5I.mjs → settled-turn-context-D4yj4rxf.mjs} +1 -1
  106. package/dist/.setup/{settled-turn-finalizer-DiAi6Kx6.mjs → settled-turn-finalizer-DW9W3gza.mjs} +14 -10
  107. package/dist/.setup/{shared-client-DA4VR4Eb.mjs → shared-client-CJCTeFpQ.mjs} +783 -412
  108. package/dist/.setup/shared-client-lifecycle-7xgtlo15.mjs +153 -0
  109. package/dist/.setup/{side-question-BJ1wSDcB.mjs → side-question-BLeGj7TQ.mjs} +79 -143
  110. package/dist/.setup/{source-CUzJq5WN.mjs → source-CJis_1EF.mjs} +80 -137
  111. package/dist/.setup/{thread-lifecycle-B3mfz1TG.mjs → thread-lifecycle-_bAbjedG.mjs} +294 -737
  112. package/dist/.setup/{thread-ownership-DcTtAcXj.mjs → thread-ownership-B6pPt21M.mjs} +45 -10
  113. package/dist/.setup/{incognito-session-uhrBF6wJ.mjs → thread-ownership-queue-Dp24d7-F.mjs} +1 -2
  114. package/dist/.setup/{thread-policy-DGuQsuFC.mjs → thread-policy-gNPzzpVp.mjs} +46 -7
  115. package/dist/.setup/{thread-requests-BLvGkP2R.mjs → thread-requests-OWGOiDaV.mjs} +199 -302
  116. package/dist/.setup/{thread-resume-DIBXwOpE.mjs → thread-resume-GOry0AYh.mjs} +6 -6
  117. package/dist/.setup/{timeout-C910MdAB.mjs → timeout-CXOfNoaX.mjs} +1 -35
  118. package/dist/.setup/{transcript-history-projection-ZZpkFkJ_.mjs → transcript-history-projection-DRSifI-1.mjs} +17 -89
  119. package/dist/.setup/{transcript-mirror-attestation-CzM-94NC.mjs → transcript-mirror-attestation-YSegaktH.mjs} +3 -4
  120. package/dist/.setup/{transcript-mirror-BtHDBp1G.mjs → transcript-mirror-kxmCYsuF.mjs} +7 -9
  121. package/dist/.setup/{transport-stdio-h2VHOskC.mjs → transport-stdio-Bdegpn2V.mjs} +5 -22
  122. package/dist/.setup/transport-websocket-BTBE-LD9.mjs +211 -0
  123. package/dist/.setup/{upstream-prompt-provenance-LphB8slG.mjs → upstream-prompt-provenance-fXkKbPVC.mjs} +3 -9
  124. package/dist/.setup/{upstream-session-fork-BUr4OUbC.mjs → upstream-session-fork-gkdRj2yH.mjs} +23 -23
  125. package/dist/.setup/{usage-BML0r-ua.mjs → usage-CApUvLOV.mjs} +4 -4
  126. package/dist/.setup/{usage-limit-error-DUMbefVY.mjs → usage-limit-error-wSMQkbpV.mjs} +4 -19
  127. package/dist/.setup/{web-search-provider.runtime-CDKlN-Rv.mjs → web-search-provider.runtime-UKgeiBUG.mjs} +8 -19
  128. package/dist/api.js +9 -11
  129. package/dist/catalog-page.worker.js +1 -1
  130. package/dist/cli-metadata.js +1 -1
  131. package/dist/doctor-contract-api.js +50 -8
  132. package/dist/harness.js +344 -1
  133. package/dist/index.js +193 -245
  134. package/dist/media-understanding-provider.js +9 -22
  135. package/dist/migration-provider-api.js +1 -1
  136. package/dist/provider-discovery.js +1 -1
  137. package/dist/session-history-worker-runtime.js +3 -3
  138. package/dist/session-history.worker.js +1 -1
  139. package/openclaw.plugin.json +14 -2
  140. package/package.json +7 -6
  141. package/dist/.setup/attempt-workspace-context-DUVEn_CS.mjs +0 -331
  142. package/dist/.setup/compact-Du5UvtxA.mjs +0 -680
  143. package/dist/.setup/event-projector-assistant-message-BsruvNrH.mjs +0 -103
  144. package/dist/.setup/event-projector-items-C6L_5ZiT.mjs +0 -234
  145. package/dist/.setup/harness-a_MsE4-_.mjs +0 -355
  146. package/dist/.setup/history-rejection-B4nOXNXF.mjs +0 -13
  147. package/dist/.setup/image-payload-sanitizer-tupAr-2o.mjs +0 -79
  148. package/dist/.setup/local-runtime-attribution-B_2mnqhb.mjs +0 -19
  149. package/dist/.setup/native-subagent-history-0nYYgo0k.mjs +0 -148
  150. package/dist/.setup/native-subagent-task-ids-wb8CKZGN.mjs +0 -441
  151. package/dist/.setup/plugin-approval-roundtrip-C0MZzCuP.mjs +0 -122
  152. package/dist/.setup/rolldown-runtime-8H4AJuhK.mjs +0 -14
  153. package/dist/.setup/sandbox-guard-C2sRMOEY.mjs +0 -166
  154. package/dist/.setup/session-binding-Cm0apEbd.mjs +0 -692
  155. package/dist/.setup/session-catalog-events-Bj6j94E_.mjs +0 -347
  156. package/dist/.setup/session-history-read-B3ZfSUbF.mjs +0 -50
  157. package/dist/.setup/session-initialization-rcgbZiid.mjs +0 -75
  158. package/dist/.setup/thread-history-page-DoVpnHim.mjs +0 -83
@@ -0,0 +1,170 @@
1
+ import { o as CatalogParamsError } from "./session-catalog-parsing-CPGaPYr-.mjs";
2
+ import { r as compareCodexCatalogRows } from "./session-catalog-index-order-BcQpHks3.mjs";
3
+ import { i as withTimeout } from "./timeout-CXOfNoaX.mjs";
4
+ import { AsyncLocalStorage } from "node:async_hooks";
5
+ import { createDeferred } from "openclaw/plugin-sdk/extension-shared";
6
+ //#region extensions/codex/src/session-catalog-availability.ts
7
+ var CodexCatalogLoadingError = class extends Error {
8
+ constructor() {
9
+ super("Codex session catalog is still loading. Retry shortly.");
10
+ this.code = "APP_SERVER_UNAVAILABLE";
11
+ }
12
+ };
13
+ /** One generation promise wakes cold callers; native pages remain owned by the index. */
14
+ var CodexCatalogAvailability = class {
15
+ constructor() {
16
+ this.complete = false;
17
+ this.changed = createDeferred();
18
+ }
19
+ begin() {
20
+ this.failure = void 0;
21
+ }
22
+ publish(frontier, complete = false) {
23
+ if (this.complete) return;
24
+ if (frontier && (!this.frontier || compareCodexCatalogRows(frontier, this.frontier) > 0)) {
25
+ const { threadId, updatedAt, recencyAt, sourceOrder } = frontier;
26
+ this.frontier = {
27
+ threadId,
28
+ updatedAt,
29
+ recencyAt,
30
+ sourceOrder
31
+ };
32
+ }
33
+ this.complete = complete;
34
+ this.notify();
35
+ }
36
+ fail(error) {
37
+ this.failure = { error };
38
+ this.notify();
39
+ }
40
+ notify() {
41
+ const previous = this.changed;
42
+ this.changed = createDeferred();
43
+ previous.resolve();
44
+ }
45
+ async until(promise, deadline) {
46
+ const remaining = deadline - performance.now();
47
+ if (remaining <= 0) throw new CodexCatalogLoadingError();
48
+ return await withTimeout(promise, remaining, "Codex session catalog is still loading", () => new CodexCatalogLoadingError());
49
+ }
50
+ async next(deadline) {
51
+ if (this.failure) throw this.failure.error;
52
+ await this.until(this.changed.promise, deadline);
53
+ }
54
+ };
55
+ //#endregion
56
+ //#region extensions/codex/src/session-catalog-list-request.ts
57
+ const listRequest = new AsyncLocalStorage();
58
+ function currentCodexCatalogListRequest() {
59
+ return listRequest.getStore();
60
+ }
61
+ /** One foreground request owns its native read budget and source-health outcome. */
62
+ var CodexCatalogListRequest = class {
63
+ constructor() {
64
+ this.pages = 0;
65
+ this.closed = false;
66
+ this.attempts = /* @__PURE__ */ new Map();
67
+ }
68
+ get hasPages() {
69
+ return this.pages < 20;
70
+ }
71
+ deadline(timeoutMs) {
72
+ this.assertActive();
73
+ return this.deadlineAt ??= performance.now() + timeoutMs;
74
+ }
75
+ constrainDeadline(absolute) {
76
+ this.assertActive();
77
+ this.deadlineAt = Math.min(this.deadlineAt ?? absolute, absolute);
78
+ return this.deadlineAt;
79
+ }
80
+ remaining(timeoutMs) {
81
+ const remaining = Math.min(timeoutMs, this.deadline(timeoutMs) - performance.now());
82
+ if (remaining <= 0) throw new CodexCatalogLoadingError();
83
+ return remaining;
84
+ }
85
+ assertActive() {
86
+ if (this.closed) throw new DOMException("Codex session catalog request is closed", "AbortError");
87
+ if (this.deadlineAt !== void 0 && this.deadlineAt <= performance.now()) throw new CodexCatalogLoadingError();
88
+ }
89
+ async run(run) {
90
+ this.assertActive();
91
+ const pending = listRequest.run(this, run);
92
+ const remaining = this.deadlineAt === void 0 ? void 0 : this.deadlineAt - performance.now();
93
+ if (remaining !== void 0 && remaining <= 0) {
94
+ pending.catch(() => {});
95
+ throw new CodexCatalogLoadingError();
96
+ }
97
+ const result = remaining === void 0 ? await pending : await withTimeout(pending, remaining, "Codex session catalog is still loading", () => new CodexCatalogLoadingError());
98
+ this.assertActive();
99
+ return result;
100
+ }
101
+ async read(timeoutMs, read) {
102
+ const remaining = this.remaining(timeoutMs);
103
+ if (!this.hasPages) throw new CatalogParamsError("Codex catalog native page budget is exhausted");
104
+ this.pages++;
105
+ try {
106
+ const result = await withTimeout(read(remaining), remaining, "Codex session catalog is still loading", () => new CodexCatalogLoadingError());
107
+ this.assertActive();
108
+ return result;
109
+ } catch (error) {
110
+ if (!this.closed) this.failure ??= { error };
111
+ throw error;
112
+ }
113
+ }
114
+ attempt(owner, key, start) {
115
+ this.assertActive();
116
+ let attempts = this.attempts.get(owner);
117
+ const existing = attempts?.get(key);
118
+ if (existing) return existing;
119
+ const attempt = start();
120
+ if (!attempts) {
121
+ attempts = /* @__PURE__ */ new Map();
122
+ this.attempts.set(owner, attempts);
123
+ }
124
+ attempts.set(key, attempt);
125
+ return attempt;
126
+ }
127
+ resolved() {
128
+ if (this.failure) {
129
+ this.rejected(this.failure.error);
130
+ return;
131
+ }
132
+ this.settle((attempt) => attempt.resolved());
133
+ }
134
+ rejected(error) {
135
+ if (error instanceof Error && error.name === "AbortError") {
136
+ this.close();
137
+ return;
138
+ }
139
+ const reason = this.failure?.error ?? error;
140
+ this.settle((attempt) => attempt.rejected(reason));
141
+ }
142
+ close() {
143
+ this.settle((attempt) => attempt.abandoned());
144
+ }
145
+ settle(settle) {
146
+ if (this.closed) return;
147
+ this.closed = true;
148
+ for (const attempts of this.attempts.values()) for (const attempt of attempts.values()) if (attempt.allowed) settle(attempt);
149
+ this.attempts.clear();
150
+ this.failure = void 0;
151
+ }
152
+ };
153
+ async function withCodexCatalogListRequest(run) {
154
+ const current = currentCodexCatalogListRequest();
155
+ if (current) {
156
+ current.assertActive();
157
+ return await run(current);
158
+ }
159
+ const scope = new CodexCatalogListRequest();
160
+ try {
161
+ const result = await scope.run(() => run(scope));
162
+ scope.resolved();
163
+ return result;
164
+ } catch (error) {
165
+ scope.rejected(error);
166
+ throw error;
167
+ }
168
+ }
169
+ //#endregion
170
+ export { CodexCatalogLoadingError as a, CodexCatalogAvailability as i, currentCodexCatalogListRequest as n, withCodexCatalogListRequest as r, CodexCatalogListRequest as t };
@@ -0,0 +1,178 @@
1
+ import { D as selectCodexCatalogPreviewInput, c as MAX_CWD_LENGTH, d as boundedCatalogString, k as truncateCodexCatalogPreview } from "./session-catalog-parsing-CPGaPYr-.mjs";
2
+ import { i as isJsonObject } from "./protocol-CANUwXJ3.mjs";
3
+ import { n as defineCodexBuildState } from "./build-state-DIQ5O_-S.mjs";
4
+ import { n as detachCodexCatalogString } from "./session-catalog-limits-DDxOsQeC.mjs";
5
+ import { t as __exportAll } from "./session-binding-sidecars-jo6H8dFr.mjs";
6
+ //#region extensions/codex/src/session-catalog-source.ts
7
+ function hasLiveCodexCatalogSource(sources) {
8
+ for (const source of sources) if (!source.closed) return true;
9
+ return false;
10
+ }
11
+ const getSources = defineCodexBuildState("openclaw.codexCatalogSources", () => ({
12
+ clients: /* @__PURE__ */ new WeakMap(),
13
+ values: /* @__PURE__ */ new WeakMap()
14
+ }));
15
+ const getEphemeralObservers = defineCodexBuildState("openclaw.codexCatalogEphemeralObservers", () => /* @__PURE__ */ new WeakMap());
16
+ /** A passive lifetime fact; the token never retains its client or a lease. */
17
+ function codexCatalogSourceForClient(client) {
18
+ const { clients } = getSources();
19
+ let source = clients.get(client);
20
+ if (!source) {
21
+ source = { closed: false };
22
+ clients.set(client, source);
23
+ }
24
+ return source;
25
+ }
26
+ function closeCodexCatalogClientSource(client) {
27
+ const { clients } = getSources();
28
+ const source = clients.get(client);
29
+ if (source) {
30
+ source.closed = true;
31
+ getEphemeralObservers().delete(source);
32
+ } else clients.set(client, { closed: true });
33
+ }
34
+ /** The catalog observer is bound once per physical source and released on closure. */
35
+ function observeCodexCatalogEphemeralThreads(source, observer) {
36
+ getEphemeralObservers().set(source, observer);
37
+ }
38
+ function getCodexCatalogSource(value) {
39
+ return value !== null && typeof value === "object" ? getSources().values.get(value) : void 0;
40
+ }
41
+ function setCodexCatalogSource(value, source) {
42
+ if (source) getSources().values.set(value, source);
43
+ return value;
44
+ }
45
+ /** Source attribution survives projection without becoming serialized row data. */
46
+ function copyCodexCatalogSource(from, to) {
47
+ return setCodexCatalogSource(to, getCodexCatalogSource(from));
48
+ }
49
+ /** Stamp the final decoded objects, including any bounded catalog DTO replacement. */
50
+ function recordCodexCatalogResponseSource(method, result, source) {
51
+ if (result === null || typeof result !== "object") return;
52
+ if (method === "thread/list" && "data" in result && Array.isArray(result.data)) {
53
+ setCodexCatalogSource(result, source);
54
+ for (const thread of result.data) if (thread !== null && typeof thread === "object") setCodexCatalogSource(thread, source);
55
+ } else if ((method === "thread/read" || method === "thread/start" || method === "thread/fork" || method === "thread/resume") && "thread" in result && result.thread !== null && typeof result.thread === "object") {
56
+ setCodexCatalogSource(result, source);
57
+ setCodexCatalogSource(result.thread, source);
58
+ if ("ephemeral" in result.thread && result.thread.ephemeral === true && "id" in result.thread && typeof result.thread.id === "string") getEphemeralObservers().get(source)?.(result.thread.id);
59
+ }
60
+ }
61
+ //#endregion
62
+ //#region extensions/codex/src/session-catalog-native-projection.ts
63
+ var session_catalog_native_projection_exports = /* @__PURE__ */ __exportAll({
64
+ CODEX_CATALOG_NATIVE_PAGE_LIMIT: () => 64,
65
+ projectCodexCatalogNativeResponse: () => projectCodexCatalogNativeResponse,
66
+ projectCodexCatalogNativeThread: () => projectCodexCatalogNativeThread,
67
+ reuseCodexCatalogPreview: () => reuseCodexCatalogPreview
68
+ });
69
+ const CODEX_CATALOG_NATIVE_PAGE_LIMIT = 64;
70
+ const STRING_FIELDS = [
71
+ [
72
+ "name",
73
+ 500,
74
+ "truncate"
75
+ ],
76
+ [
77
+ "cwd",
78
+ MAX_CWD_LENGTH,
79
+ "omit"
80
+ ],
81
+ [
82
+ "modelProvider",
83
+ 500,
84
+ "truncate"
85
+ ],
86
+ [
87
+ "cliVersion",
88
+ 500,
89
+ "truncate"
90
+ ]
91
+ ];
92
+ /** Drop unused native fields before catalog-owned asynchronous work can retain them. */
93
+ function projectCodexCatalogNativeThread(thread, sanitize, cachedPreview) {
94
+ if (!isJsonObject(thread)) throw new Error("Codex catalog response contains an invalid thread");
95
+ const id = boundedCatalogString(thread.id, 256);
96
+ if (!id) throw new Error("Codex catalog response contains an invalid thread id");
97
+ const row = {
98
+ id,
99
+ projectId: boundedCatalogString(thread.projectId, 256, "omit") ?? null
100
+ };
101
+ const sessionId = boundedCatalogString(thread.sessionId, 256, "omit");
102
+ if (sessionId) row.sessionId = sessionId;
103
+ if (thread.ephemeral === true) return copyCodexCatalogSource(thread, {
104
+ ...row,
105
+ ephemeral: true
106
+ });
107
+ for (const [field, limit, overflow] of STRING_FIELDS) {
108
+ const value = thread[field];
109
+ const bounded = boundedCatalogString(value, limit, overflow);
110
+ if (value === null || bounded !== void 0) row[field] = bounded ?? null;
111
+ }
112
+ if (typeof thread.path === "string") {
113
+ if (thread.path.length > 4096) throw new Error("Codex catalog rollout path exceeds its length limit");
114
+ row.path = detachCodexCatalogString(thread.path);
115
+ } else if (thread.path === null) row.path = null;
116
+ if (typeof thread.originator === "string") row.originator = detachCodexCatalogString(thread.originator.slice(0, 500));
117
+ for (const field of [
118
+ "createdAt",
119
+ "updatedAt",
120
+ "recencyAt"
121
+ ]) {
122
+ const value = thread[field];
123
+ if (value === null || typeof value === "number" && Number.isFinite(value)) row[field] = value;
124
+ }
125
+ const rawPreview = thread.preview;
126
+ const preview = reuseCodexCatalogPreview(row, typeof rawPreview === "string" ? Boolean(rawPreview) : void 0, cachedPreview);
127
+ if (preview !== void 0) row.preview = preview;
128
+ else if (typeof rawPreview === "string") row.preview = rawPreview ? truncateCodexCatalogPreview(selectCodexCatalogPreviewInput(rawPreview), sanitize) : "";
129
+ else if (rawPreview === null) row.preview = null;
130
+ const source = typeof thread.source === "string" ? detachCodexCatalogString(thread.source.slice(0, 500)) : void 0;
131
+ if (source === "cli" || source === "vscode" || source === "exec" || source === "appServer" || source === "unknown") row.source = source;
132
+ else if (isJsonObject(thread.source) && typeof thread.source.custom === "string" && thread.source.custom.length <= 500) row.source = { custom: detachCodexCatalogString(thread.source.custom) };
133
+ if (isJsonObject(thread.gitInfo)) {
134
+ const branch = boundedCatalogString(thread.gitInfo.branch, 500, "truncate");
135
+ if (branch !== void 0) row.gitInfo = { branch };
136
+ }
137
+ if (isJsonObject(thread.status)) {
138
+ const type = boundedCatalogString(thread.status.type, 64);
139
+ if (type === "active" || type === "idle" || type === "notLoaded" || type === "systemError") {
140
+ const activeFlags = type === "active" && Array.isArray(thread.status.activeFlags) ? thread.status.activeFlags.slice(0, 16).flatMap((flag) => {
141
+ const bounded = boundedCatalogString(flag, 128, "omit");
142
+ return bounded ? [bounded] : [];
143
+ }) : void 0;
144
+ row.status = type === "active" ? {
145
+ type,
146
+ ...activeFlags ? { activeFlags } : {}
147
+ } : { type };
148
+ }
149
+ }
150
+ return copyCodexCatalogSource(thread, row);
151
+ }
152
+ /** Keep only the admitted prefix before an RPC promise retains its response. */
153
+ function projectCodexCatalogNativeResponse(response, sanitize, cachedPreview, remainingRows = 64) {
154
+ if (!Array.isArray(response.data) || response.data.length > 64) throw new Error("Codex catalog response exceeds its native page limit");
155
+ const limit = Number.isFinite(remainingRows) ? Math.max(0, Math.min(64, Math.floor(remainingRows))) : 0;
156
+ const page = { data: response.data.slice(0, limit).map((thread) => projectCodexCatalogNativeThread(thread, sanitize, cachedPreview)) };
157
+ for (const field of ["nextCursor", "backwardsCursor"]) {
158
+ const value = response[field];
159
+ if (value === null) page[field] = null;
160
+ else if (value !== void 0) {
161
+ if (typeof value !== "string" || value.length > 4096) throw new Error("Codex catalog response contains an invalid cursor");
162
+ page[field] = detachCodexCatalogString(value);
163
+ }
164
+ }
165
+ return page;
166
+ }
167
+ /** Reuse resident text without transferring a cache or an unbounded native preview. */
168
+ function reuseCodexCatalogPreview(thread, rawPreviewNonempty, cachedPreview) {
169
+ const preview = cachedPreview?.({
170
+ id: thread.id,
171
+ path: typeof thread.path === "string" ? thread.path : null,
172
+ updatedAt: typeof thread.updatedAt === "number" ? thread.updatedAt : null,
173
+ recencyAt: typeof thread.recencyAt === "number" ? thread.recencyAt : null
174
+ });
175
+ return preview !== void 0 && preview.length <= 500 && (rawPreviewNonempty === void 0 || rawPreviewNonempty === Boolean(preview)) ? preview : void 0;
176
+ }
177
+ //#endregion
178
+ export { session_catalog_native_projection_exports as a, copyCodexCatalogSource as c, observeCodexCatalogEphemeralThreads as d, recordCodexCatalogResponseSource as f, reuseCodexCatalogPreview as i, getCodexCatalogSource as l, projectCodexCatalogNativeResponse as n, closeCodexCatalogClientSource as o, setCodexCatalogSource as p, projectCodexCatalogNativeThread as r, codexCatalogSourceForClient as s, CODEX_CATALOG_NATIVE_PAGE_LIMIT as t, hasLiveCodexCatalogSource as u };
@@ -1,22 +1,12 @@
1
- import { v as CatalogParamsError } from "./session-catalog-native-projection-DowriLid.mjs";
1
+ import { o as CatalogParamsError } from "./session-catalog-parsing-CPGaPYr-.mjs";
2
2
  import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
3
+ import { KeyedAsyncQueue } from "openclaw/plugin-sdk/keyed-async-queue";
3
4
  import { parseAgentSessionKey } from "openclaw/plugin-sdk/routing";
4
- import { listSessionCatalogEntries, sessionCatalogAdoptedSessionKey, sessionCatalogAdoptedSourceKey } from "openclaw/plugin-sdk/session-catalog";
5
5
  import { resolveStorePath } from "openclaw/plugin-sdk/session-store-paths";
6
+ import { listSessionCatalogEntries, sessionCatalogAdoptedSessionKey, sessionCatalogAdoptedSourceKey } from "openclaw/plugin-sdk/session-catalog";
6
7
  //#region extensions/codex/src/session-catalog-node-adoption.ts
7
8
  const CODEX_NODE_SESSION_KEY_PREFIX = "harness:codex:node-session:";
8
- const continueOperations = /* @__PURE__ */ new Map();
9
- const sessionActionTails = /* @__PURE__ */ new Map();
10
- async function runSessionActionExclusive(threadId, run) {
11
- const operation = (sessionActionTails.get(threadId) ?? Promise.resolve()).then(run);
12
- const tail = operation.then(() => void 0, () => void 0);
13
- sessionActionTails.set(threadId, tail);
14
- try {
15
- return await operation;
16
- } finally {
17
- if (sessionActionTails.get(threadId) === tail) sessionActionTails.delete(threadId);
18
- }
19
- }
9
+ const catalogSessionActions = new KeyedAsyncQueue();
20
10
  function adoptionSessionKeyRest(sessionKey) {
21
11
  const trimmed = sessionKey.trim();
22
12
  return parseAgentSessionKey(trimmed)?.rest ?? trimmed;
@@ -121,7 +111,7 @@ async function finalizeNodeAdoptedSession(params) {
121
111
  if (!finalized) throw changedError();
122
112
  }
123
113
  async function createOrReuseNodeAdoptedSession(params) {
124
- const existing = findNodeAdoptedSessionEntry({
114
+ const lookup = {
125
115
  agentId: params.agentId,
126
116
  config: params.config,
127
117
  runtime: params.api.runtime,
@@ -129,7 +119,8 @@ async function createOrReuseNodeAdoptedSession(params) {
129
119
  threadId: params.record.threadId,
130
120
  sourceHomeId: params.sourceHomeId,
131
121
  includeInitializing: true
132
- });
122
+ };
123
+ const existing = findNodeAdoptedSessionEntry(lookup);
133
124
  if (existing) return existing;
134
125
  const initializingMarker = {
135
126
  ...nodeSessionMarker({
@@ -155,7 +146,7 @@ async function createOrReuseNodeAdoptedSession(params) {
155
146
  },
156
147
  afterCreate: async (entry) => {
157
148
  const storePath = resolveStorePath(params.config.session?.store, { agentId: entry.agentId });
158
- const { importCodexThreadHistoryToTranscript } = await import("./transcript-mirror-BtHDBp1G.mjs").then((n) => n.a);
149
+ const { importCodexThreadHistoryToTranscript } = await import("./transcript-mirror-kxmCYsuF.mjs").then((n) => n.a);
159
150
  await importCodexThreadHistoryToTranscript({
160
151
  thread: params.history.thread,
161
152
  throughTurnId: params.history.throughTurnId,
@@ -177,18 +168,10 @@ async function createOrReuseNodeAdoptedSession(params) {
177
168
  initializing: true
178
169
  };
179
170
  } catch (error) {
180
- const raced = findNodeAdoptedSessionEntry({
181
- agentId: params.agentId,
182
- config: params.config,
183
- runtime: params.api.runtime,
184
- hostId: params.hostId,
185
- threadId: params.record.threadId,
186
- sourceHomeId: params.sourceHomeId,
187
- includeInitializing: true
188
- });
171
+ const raced = findNodeAdoptedSessionEntry(lookup);
189
172
  if (raced) return raced;
190
173
  throw error;
191
174
  }
192
175
  }
193
176
  //#endregion
194
- export { CODEX_NODE_SESSION_KEY_PREFIX, adoptionSessionKeyRest, continueOperations, createOrReuseNodeAdoptedSession, finalizeNodeAdoptedSession, findNodeAdoptedSessionEntry, listNodeAdoptedSessionEntries, nodeAdoptedSourceKey, nodeSessionMarker, readNodeSessionMarker, runSessionActionExclusive };
177
+ export { CODEX_NODE_SESSION_KEY_PREFIX, adoptionSessionKeyRest, catalogSessionActions, createOrReuseNodeAdoptedSession, finalizeNodeAdoptedSession, findNodeAdoptedSessionEntry, listNodeAdoptedSessionEntries, nodeAdoptedSourceKey, nodeSessionMarker, readNodeSessionMarker };
@@ -1,10 +1,10 @@
1
- import { A as parseCatalogPage, C as boundedCatalogString, D as filterCatalogPageByTitle, H as unwrapNodeInvokePayload, M as parseTranscriptPage, O as isInteractiveThreadSource, S as NODE_INVOKE_TIMEOUT_MS, h as CODEX_APP_SERVER_THREAD_TURNS_LIST_COMMAND, m as CODEX_APP_SERVER_THREADS_LIST_COMMAND, v as CatalogParamsError, w as catalogError } from "./session-catalog-native-projection-DowriLid.mjs";
2
- import { n as createCodexCliNodeConversationBindingData } from "./conversation-binding-data-CrcyZk6O.mjs";
3
- import { i as withTimeout } from "./timeout-C910MdAB.mjs";
4
- import { r as CODEX_CLI_SESSION_SOURCE_UPGRADE_MESSAGE, t as CODEX_CLI_SESSION_RESUME_COMMAND } from "./node-cli-sessions-r3avj02l.mjs";
5
- import { o as lookupNodeCodexCatalogRecord } from "./session-catalog-Pno1xGcl.mjs";
1
+ import { A as unwrapNodeInvokePayload, b as parseTranscriptPage, d as boundedCatalogString, f as catalogError, g as isInteractiveThreadSource, h as filterCatalogPageByTitle, n as CODEX_APP_SERVER_THREADS_LIST_COMMAND, o as CatalogParamsError, r as CODEX_APP_SERVER_THREAD_TURNS_LIST_COMMAND, u as NODE_INVOKE_TIMEOUT_MS, v as parseCatalogPage } from "./session-catalog-parsing-CPGaPYr-.mjs";
2
+ import { n as createCodexCliNodeConversationBindingData } from "./conversation-binding-data-C746z5Pn.mjs";
3
+ import { r as CODEX_CLI_SESSION_SOURCE_UPGRADE_MESSAGE, t as CODEX_CLI_SESSION_RESUME_COMMAND } from "./node-cli-sessions-HC4W6FLI.mjs";
4
+ import { i as withTimeout } from "./timeout-CXOfNoaX.mjs";
5
+ import { t as lookupNodeCodexCatalogRecord } from "./session-catalog-node-lookup-CtAXI5W5.mjs";
6
6
  import { t as codexLastTerminalTurnId } from "./session-upstream-marker-D15C9NHp.mjs";
7
- import { createOrReuseNodeAdoptedSession, finalizeNodeAdoptedSession, findNodeAdoptedSessionEntry, nodeAdoptedSourceKey, nodeSessionMarker, runSessionActionExclusive } from "./session-catalog-node-adoption-ITddWx_X.mjs";
7
+ import { catalogSessionActions, createOrReuseNodeAdoptedSession, finalizeNodeAdoptedSession, findNodeAdoptedSessionEntry, nodeAdoptedSourceKey, nodeSessionMarker } from "./session-catalog-node-adoption-DgXvSGu0.mjs";
8
8
  import { resolveSessionAgentIdsStrict } from "openclaw/plugin-sdk/agent-scope-runtime";
9
9
  import { createSessionCatalogAdoptionCoordinator, publishSessionCatalogHost, sessionCatalogAdoptedSourceKey } from "openclaw/plugin-sdk/session-catalog";
10
10
  //#region extensions/codex/src/session-catalog-node-continue.ts
@@ -21,9 +21,7 @@ function nodeLabel(node) {
21
21
  function compareNodeLabels(left, right) {
22
22
  const leftLabel = nodeLabel(left);
23
23
  const rightLabel = nodeLabel(right);
24
- if (leftLabel < rightLabel) return -1;
25
- if (leftLabel > rightLabel) return 1;
26
- return 0;
24
+ return leftLabel < rightLabel ? -1 : leftLabel > rightLabel ? 1 : 0;
27
25
  }
28
26
  function canContinueCodexOnNode(node) {
29
27
  return node.connected === true && node.caps?.includes("codex-cli-session-source") === true && CODEX_NODE_CONTINUE_COMMANDS.every((command) => node.commands?.includes(command) === true && node.invocableCommands?.includes(command) === true);
@@ -236,7 +234,7 @@ async function continueNodeCodexSession(params) {
236
234
  return await continueNodeAdoption({
237
235
  sourceKey: operationKey,
238
236
  findExisting: () => void 0,
239
- create: () => runSessionActionExclusive(sourceKey, async () => continueNodeCodexSessionInner({
237
+ create: () => catalogSessionActions.enqueue(sourceKey, async () => continueNodeCodexSessionInner({
240
238
  ...params,
241
239
  agentId
242
240
  })),
@@ -0,0 +1,56 @@
1
+ import { A as unwrapNodeInvokePayload, n as CODEX_APP_SERVER_THREADS_LIST_COMMAND, o as CatalogParamsError, u as NODE_INVOKE_TIMEOUT_MS, v as parseCatalogPage } from "./session-catalog-parsing-CPGaPYr-.mjs";
2
+ import "./session-catalog-limits-DDxOsQeC.mjs";
3
+ import { i as withTimeout } from "./timeout-CXOfNoaX.mjs";
4
+ //#region extensions/codex/src/session-catalog-node-lookup.ts
5
+ async function lookupNodeCodexCatalogRecord(params) {
6
+ const deadline = performance.now() + NODE_INVOKE_TIMEOUT_MS;
7
+ const unverified = () => new CatalogParamsError("Codex session eligibility could not be verified");
8
+ const remaining = () => {
9
+ const timeoutMs = Math.ceil(deadline - performance.now());
10
+ if (timeoutMs <= 0) throw unverified();
11
+ return timeoutMs;
12
+ };
13
+ let cursor;
14
+ let sourceHomeId = params.sourceHomeId;
15
+ let firstPage = true;
16
+ const seenCursors = /* @__PURE__ */ new Set();
17
+ for (;;) {
18
+ const timeoutMs = remaining();
19
+ const raw = await withTimeout(params.runtime.nodes.invoke({
20
+ nodeId: params.nodeId,
21
+ command: CODEX_APP_SERVER_THREADS_LIST_COMMAND,
22
+ params: {
23
+ agentId: params.agentId,
24
+ ...sourceHomeId ? { sourceHomeId } : {},
25
+ limit: 100,
26
+ ...cursor ? { cursor } : {}
27
+ },
28
+ timeoutMs,
29
+ scopes: ["operator.write"]
30
+ }), timeoutMs, "Codex session eligibility could not be verified", unverified);
31
+ remaining();
32
+ const page = parseCatalogPage(unwrapNodeInvokePayload(raw));
33
+ if ((!firstPage || sourceHomeId !== void 0) && page.sourceHomeId !== sourceHomeId) throw new CatalogParamsError("Codex session source home changed; refresh the catalog and retry");
34
+ sourceHomeId = page.sourceHomeId;
35
+ firstPage = false;
36
+ const record = page.sessions.find((candidate) => candidate.threadId === params.threadId);
37
+ if (record) return {
38
+ kind: "found",
39
+ record,
40
+ sourceHomeId,
41
+ canContinueCodex: page.canContinueCodex
42
+ };
43
+ const nextCursor = page.nextCursor?.trim();
44
+ if (!nextCursor) break;
45
+ if (seenCursors.has(nextCursor)) return { kind: "cursor-cycle" };
46
+ seenCursors.add(nextCursor);
47
+ if (seenCursors.size > 2e4) {
48
+ const oldest = seenCursors.values().next().value;
49
+ if (oldest !== void 0) seenCursors.delete(oldest);
50
+ }
51
+ cursor = nextCursor;
52
+ }
53
+ return { kind: "missing" };
54
+ }
55
+ //#endregion
56
+ export { lookupNodeCodexCatalogRecord as t };