@openclaw/codex 2026.9.6 → 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.
- package/README.md +2 -0
- package/assets/icon.png +0 -0
- package/dist/.setup/{account-usage-runtime-Eem_WGqY.mjs → account-usage-runtime-DFhbh1zz.mjs} +5 -5
- package/dist/.setup/{apply-DDOi8uNx.mjs → apply-D3GcSoSa.mjs} +22 -36
- package/dist/.setup/{attempt-client-cleanup-CEv1cKwF.mjs → attempt-client-cleanup-DOP-cW5j.mjs} +128 -37
- package/dist/.setup/attempt-workspace-context-C5HigshI.mjs +164 -0
- package/dist/.setup/{auth-binding-DhLWa_7K.mjs → auth-binding-BLWz7stm.mjs} +14 -1
- package/dist/.setup/{auth-cache-key-B2mpaI9D.mjs → auth-cache-key-Dbvq-QgB.mjs} +36 -34
- package/dist/.setup/{auth-profile-WqZtZfXN.mjs → auth-profile-B0okYl2D.mjs} +1 -2
- package/dist/.setup/auth-start-options-BPIPeEX8.mjs +44 -0
- package/dist/.setup/{binding-connection-ThoatDcb.mjs → binding-connection-DTtN1KrX.mjs} +2 -2
- package/dist/.setup/{binding-connection.runtime-yoHrABt-.mjs → binding-connection.runtime-6TpgD1M6.mjs} +4 -4
- package/dist/.setup/{bounded-turn-B2HScEgT.mjs → bounded-turn-CbjoN2OW.mjs} +15 -18
- package/dist/.setup/bounded-turn-isolation-B8K_ylqk.mjs +14 -0
- package/dist/.setup/{build-state-C7EnDVgr.mjs → build-state-Da1_z0kd.mjs} +1 -1
- package/dist/.setup/{capabilities-CDXOOFdZ.mjs → capabilities-B3WEZl4e.mjs} +2 -10
- package/dist/.setup/{client-Cs08OXVQ.mjs → client-N0JpgSzF.mjs} +138 -399
- package/dist/.setup/{client-catalog-response-BMgt_4q4.mjs → client-catalog-response-5HHLdcde.mjs} +1 -1
- package/dist/.setup/{command-dispatch-B4JuOsOk.mjs → command-dispatch-BeAoaovI.mjs} +5 -8
- package/dist/.setup/{command-formatters-Bmqvr9tO.mjs → command-formatters-R3ckE3Co.mjs} +29 -61
- package/dist/.setup/{command-handlers-DW7Lx9oH.mjs → command-handlers-ylTMS00z.mjs} +222 -343
- package/dist/.setup/{command-rpc-DixIj3HW.mjs → command-rpc-CGJGUQ6Y.mjs} +15 -18
- package/dist/.setup/compact-C2WamavS.mjs +776 -0
- package/dist/.setup/{config-BoTP_mrL.mjs → config-DKhXquav.mjs} +26 -28
- package/dist/.setup/{config-options-BvaRs51b.mjs → config-options-CzyWLTJt.mjs} +24 -37
- package/dist/.setup/{config-parsing-CcB9iPoq.mjs → config-parsing-b088LyhT.mjs} +57 -60
- package/dist/.setup/{config-runtime-C8Rw1m1m.mjs → config-runtime-C0NbLms1.mjs} +2 -2
- package/dist/.setup/{config-security-BEReZ6go.mjs → config-security-CE-FcGw9.mjs} +32 -111
- package/dist/.setup/{config-utils-DujwEnhg.mjs → config-utils-D0CXecki.mjs} +3 -13
- package/dist/.setup/context-engine-projection-PezSESth.mjs +387 -0
- package/dist/.setup/{conversation-binding-DP-gMrBP.mjs → conversation-binding-3Min8qvP.mjs} +67 -90
- package/dist/.setup/{conversation-binding-data-CrcyZk6O.mjs → conversation-binding-data-C746z5Pn.mjs} +8 -12
- package/dist/.setup/{conversation-control-uK9Jomlc.mjs → conversation-control-CEP8X5JC.mjs} +8 -8
- package/dist/.setup/{cyber-failover-DYwbmf1o.mjs → cyber-failover-XV0nNRZu.mjs} +1 -1
- package/dist/.setup/{cyber-failover-notice-e9G3J9-e.mjs → cyber-failover-notice-RNpGpTyP.mjs} +1 -1
- package/dist/.setup/{dynamic-tools-BDXl-8Cw.mjs → dynamic-tools-DzlsLUuS.mjs} +2305 -2606
- package/dist/.setup/{effective-mcp-catalog-CvnvnGIe.mjs → effective-mcp-catalog-CxUtC-xG.mjs} +8 -17
- package/dist/.setup/{ephemeral-turn-poidXgek.mjs → ephemeral-turn-CDsPJOa2.mjs} +3 -3
- package/dist/.setup/event-projector-assistant-message-CigreO4K.mjs +69 -0
- package/dist/.setup/{event-projector-usage-CnBS8Wa3.mjs → event-projector-usage-03R0I2dM.mjs} +3 -25
- package/dist/.setup/event-projector-values-DJSz8BTk.mjs +106 -0
- package/dist/.setup/incognito-session-DWYapfwf.mjs +2 -0
- package/dist/.setup/{inference-context-D96l9-ew.mjs → inference-context-D-9gWlTR.mjs} +16 -18
- package/dist/.setup/inference-dispatch-CMZtjQyz.mjs +359 -0
- package/dist/.setup/inference-metadata-CgIf7sOx.mjs +81 -0
- package/dist/.setup/{inference-proxy-b-aJMSxm.mjs → inference-proxy-DhcXOgUE.mjs} +174 -214
- package/dist/.setup/{isolated-completion-BIZFhTNG.mjs → isolated-completion-Dm3PzxJk.mjs} +9 -12
- package/dist/.setup/{managed-binary-BnshlFag.mjs → managed-binary-kiWRhNRE.mjs} +8 -12
- package/dist/.setup/{model-catalog-CfXJf9Ay.mjs → model-catalog-PAuZgJC6.mjs} +11 -10
- package/dist/.setup/model-runtime-BdqzOMkU.mjs +11 -0
- package/dist/.setup/{models-KnqBv0hE.mjs → models-DHXZtVVk.mjs} +9 -18
- package/dist/.setup/{native-auth-rWbGbMn3.mjs → native-auth-CuG53tu4.mjs} +4 -4
- package/dist/.setup/{native-execution-policy-umd0tgh4.mjs → native-execution-policy-BxZJy5mP.mjs} +5 -30
- package/dist/.setup/{native-subagent-monitor-D3filLY2.mjs → native-subagent-monitor-Dpsmf2wz.mjs} +4395 -3609
- package/dist/.setup/native-subagent-pending-assignments-DwkCzLvD.mjs +203 -0
- package/dist/.setup/native-task-assignments-DMQ0g3hu.mjs +194 -0
- package/dist/.setup/{node-cli-sessions-r3avj02l.mjs → node-cli-sessions-HC4W6FLI.mjs} +19 -49
- package/dist/.setup/{node-exec-server.runtime-BDwWXVpK.mjs → node-exec-server.runtime-BgBfWQqo.mjs} +3 -6
- package/dist/.setup/{plan-CN3VwfNU.mjs → plan-Y-QIvrKB.mjs} +49 -92
- package/dist/.setup/{plugin-activation-DT3MNtqj.mjs → plugin-activation-cNHRfaxU.mjs} +8 -36
- package/dist/.setup/{plugin-app-cache-key-B2CsSdnV.mjs → plugin-app-cache-key-BL9B5H0L.mjs} +6 -23
- package/dist/.setup/{plugin-inventory-BoRei8Z4.mjs → plugin-inventory-Cky2XJUw.mjs} +21 -21
- package/dist/.setup/{plugin-marketplace-discovery-CDOi8IFs.mjs → plugin-marketplace-discovery-D_dV9FXa.mjs} +18 -24
- package/dist/.setup/{plugin-metadata-cache-Ctmo83k_.mjs → plugin-metadata-cache-DsjsL1dr.mjs} +115 -175
- package/dist/.setup/{provider-BOsxQHOM.mjs → provider-DH8NSzGt.mjs} +11 -14
- package/dist/.setup/{provider-capabilities-BfE88FZ5.mjs → provider-capabilities-CAxoF-X1.mjs} +13 -18
- package/dist/.setup/{rate-limits-CMU3DUD0.mjs → rate-limits-B7-X2TgG.mjs} +9 -31
- package/dist/.setup/{request-D2L0zMrq.mjs → request-BHZ1nz8d.mjs} +7 -6
- package/dist/.setup/responses-oauth-twnuTaAa.mjs +93 -0
- package/dist/.setup/rpc-error-BlD2vuzn.mjs +31 -0
- package/dist/.setup/{run-attempt-BHu11r7h.mjs → run-attempt-D8RZUOzY.mjs} +1035 -1023
- package/dist/.setup/{run-attempt-lifecycle-B7JbY4-F.mjs → run-attempt-lifecycle-C-6O3Exn.mjs} +10 -24
- package/dist/.setup/{runtime-artifact-CLZ8udh-.mjs → runtime-artifact-DDQ-HGXf.mjs} +16 -4
- package/dist/.setup/runtime-artifact-connection-D68qQn1m.mjs +78 -0
- package/dist/.setup/sandbox-guard-DjCz2eOw.mjs +126 -0
- package/dist/.setup/scope-DOC1Xjc8.mjs +6 -0
- package/dist/.setup/session-binding-DGCYAfvD.mjs +443 -0
- package/dist/.setup/{session-binding-record-BGoz8wOK.mjs → session-binding-record-Oe9L-CNY.mjs} +52 -130
- package/dist/.setup/{session-binding-sidecars-BlB5EvIS.mjs → session-binding-sidecars-jo6H8dFr.mjs} +196 -17
- package/dist/.setup/{session-catalog-Pno1xGcl.mjs → session-catalog-4sCdv5qx.mjs} +170 -324
- package/dist/.setup/{session-catalog-adoption-BI6UTDZT.mjs → session-catalog-adoption-BU_pHWG7.mjs} +7 -6
- package/dist/.setup/{session-catalog-archive-lHBqzhaO.mjs → session-catalog-archive-spHfihri.mjs} +6 -6
- package/dist/.setup/session-catalog-events-DePDzzjc.mjs +139 -0
- package/dist/.setup/session-catalog-home-id-vlih0B_g.mjs +22 -0
- package/dist/.setup/{session-catalog-index-B9_VQIUz.mjs → session-catalog-index-CZvDzC6z.mjs} +126 -122
- package/dist/.setup/{session-catalog-index-order-hcdz07yN.mjs → session-catalog-index-order-BcQpHks3.mjs} +1 -1
- package/dist/.setup/{session-catalog-index-state-Dgh8ORJm.mjs → session-catalog-index-state-TeO7EyO-.mjs} +3 -2
- package/dist/.setup/session-catalog-limits-DDxOsQeC.mjs +14 -0
- package/dist/.setup/session-catalog-list-request-CvtxrYSe.mjs +170 -0
- package/dist/.setup/session-catalog-native-projection-DjhwGL6x.mjs +178 -0
- package/dist/.setup/{session-catalog-node-adoption-ITddWx_X.mjs → session-catalog-node-adoption-DgXvSGu0.mjs} +10 -27
- package/dist/.setup/{session-catalog-node-continue-6g6qi4A9.mjs → session-catalog-node-continue-DjKXHBbi.mjs} +8 -10
- package/dist/.setup/session-catalog-node-lookup-CtAXI5W5.mjs +56 -0
- package/dist/.setup/{session-catalog-native-projection-DowriLid.mjs → session-catalog-parsing-CPGaPYr-.mjs} +11 -194
- package/dist/.setup/{session-catalog-projection-zK_PUsiE.mjs → session-catalog-projection-Cr5qP5Dj.mjs} +6 -4
- package/dist/.setup/session-catalog-provenance-DoAvktcj.mjs +95 -0
- package/dist/.setup/{session-cli-irrD-uo7.mjs → session-cli-Cn_nCqfq.mjs} +9 -22
- package/dist/.setup/{session-history-BrqhSCf9.mjs → session-history-D83lJWHG.mjs} +4 -6
- package/dist/.setup/{session-history-import-D-3wAgOP.mjs → session-history-import-WhX-X33a.mjs} +7 -10
- package/dist/.setup/session-history-read-Ov3StuL4.mjs +133 -0
- package/dist/.setup/{session-history.worker-CaCh0xF_.mjs → session-history.worker-MnPKncqP.mjs} +9 -5
- package/dist/.setup/session-initialization-6aveB9qb.mjs +22 -0
- package/dist/.setup/{session-permission-policy-BI1QK_98.mjs → session-permission-policy-Ci_fVX6y.mjs} +4 -8
- package/dist/.setup/{session-retirement-BH-S6qkJ.mjs → session-retirement-qMTxkNx2.mjs} +17 -17
- package/dist/.setup/{settled-turn-context-fmwouT5I.mjs → settled-turn-context-D4yj4rxf.mjs} +1 -1
- package/dist/.setup/{settled-turn-finalizer-DiAi6Kx6.mjs → settled-turn-finalizer-BsvEabkw.mjs} +14 -10
- package/dist/.setup/{shared-client-DA4VR4Eb.mjs → shared-client-DqyTMYug.mjs} +783 -412
- package/dist/.setup/shared-client-lifecycle-DJIgqgMw.mjs +153 -0
- package/dist/.setup/{side-question-BJ1wSDcB.mjs → side-question-C4kCmQy1.mjs} +79 -143
- package/dist/.setup/{source-CUzJq5WN.mjs → source-CS_7GFJZ.mjs} +80 -137
- package/dist/.setup/{thread-lifecycle-B3mfz1TG.mjs → thread-lifecycle-DPflntEJ.mjs} +294 -737
- package/dist/.setup/{incognito-session-uhrBF6wJ.mjs → thread-ownership-queue-Dp24d7-F.mjs} +1 -2
- package/dist/.setup/{thread-ownership-DcTtAcXj.mjs → thread-ownership-roNP0l1c.mjs} +45 -10
- package/dist/.setup/{thread-policy-DGuQsuFC.mjs → thread-policy-DTd-DtkX.mjs} +46 -7
- package/dist/.setup/{thread-requests-BLvGkP2R.mjs → thread-requests-B_bRnMGN.mjs} +199 -302
- package/dist/.setup/{thread-resume-DIBXwOpE.mjs → thread-resume-CdDaoc7T.mjs} +6 -6
- package/dist/.setup/{timeout-C910MdAB.mjs → timeout-CXOfNoaX.mjs} +1 -35
- package/dist/.setup/{transcript-history-projection-ZZpkFkJ_.mjs → transcript-history-projection-DRSifI-1.mjs} +17 -89
- package/dist/.setup/{transcript-mirror-attestation-CzM-94NC.mjs → transcript-mirror-attestation-YSegaktH.mjs} +3 -4
- package/dist/.setup/{transcript-mirror-BtHDBp1G.mjs → transcript-mirror-kxmCYsuF.mjs} +7 -9
- package/dist/.setup/{transport-stdio-h2VHOskC.mjs → transport-stdio-Bdegpn2V.mjs} +5 -22
- package/dist/.setup/transport-websocket-BTBE-LD9.mjs +211 -0
- package/dist/.setup/{upstream-prompt-provenance-LphB8slG.mjs → upstream-prompt-provenance-fXkKbPVC.mjs} +3 -9
- package/dist/.setup/{upstream-session-fork-BUr4OUbC.mjs → upstream-session-fork-CBeVjBpT.mjs} +23 -23
- package/dist/.setup/{usage-BML0r-ua.mjs → usage-BMzNxeR_.mjs} +4 -4
- package/dist/.setup/{usage-limit-error-DUMbefVY.mjs → usage-limit-error-QXerDo3i.mjs} +4 -19
- package/dist/.setup/{web-search-provider.runtime-CDKlN-Rv.mjs → web-search-provider.runtime-P77OUeoo.mjs} +8 -19
- package/dist/api.js +9 -11
- package/dist/catalog-page.worker.js +1 -1
- package/dist/cli-metadata.js +1 -1
- package/dist/doctor-contract-api.js +50 -8
- package/dist/harness.js +344 -1
- package/dist/index.js +193 -245
- package/dist/media-understanding-provider.js +9 -22
- package/dist/migration-provider-api.js +1 -1
- package/dist/provider-discovery.js +1 -1
- package/dist/session-history-worker-runtime.js +3 -3
- package/dist/session-history.worker.js +1 -1
- package/openclaw.plugin.json +14 -2
- package/package.json +7 -6
- package/dist/.setup/attempt-workspace-context-DUVEn_CS.mjs +0 -331
- package/dist/.setup/compact-Du5UvtxA.mjs +0 -680
- package/dist/.setup/event-projector-assistant-message-BsruvNrH.mjs +0 -103
- package/dist/.setup/event-projector-items-C6L_5ZiT.mjs +0 -234
- package/dist/.setup/harness-a_MsE4-_.mjs +0 -355
- package/dist/.setup/history-rejection-B4nOXNXF.mjs +0 -13
- package/dist/.setup/image-payload-sanitizer-tupAr-2o.mjs +0 -79
- package/dist/.setup/local-runtime-attribution-B_2mnqhb.mjs +0 -19
- package/dist/.setup/native-subagent-history-0nYYgo0k.mjs +0 -148
- package/dist/.setup/native-subagent-task-ids-wb8CKZGN.mjs +0 -441
- package/dist/.setup/plugin-approval-roundtrip-C0MZzCuP.mjs +0 -122
- package/dist/.setup/rolldown-runtime-8H4AJuhK.mjs +0 -14
- package/dist/.setup/sandbox-guard-C2sRMOEY.mjs +0 -166
- package/dist/.setup/session-binding-Cm0apEbd.mjs +0 -692
- package/dist/.setup/session-catalog-events-Bj6j94E_.mjs +0 -347
- package/dist/.setup/session-history-read-B3ZfSUbF.mjs +0 -50
- package/dist/.setup/session-initialization-rcgbZiid.mjs +0 -75
- 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-Da1_z0kd.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 {
|
|
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
|
|
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
|
|
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-
|
|
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,
|
|
177
|
+
export { CODEX_NODE_SESSION_KEY_PREFIX, adoptionSessionKeyRest, catalogSessionActions, createOrReuseNodeAdoptedSession, finalizeNodeAdoptedSession, findNodeAdoptedSessionEntry, listNodeAdoptedSessionEntries, nodeAdoptedSourceKey, nodeSessionMarker, readNodeSessionMarker };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
import { n as createCodexCliNodeConversationBindingData } from "./conversation-binding-data-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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
|
|
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
|
-
|
|
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: () =>
|
|
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 };
|