@openclaw/codex 2026.9.5 → 2026.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.setup/{account-usage-runtime-C2MOIvfq.mjs → account-usage-runtime-Eem_WGqY.mjs} +5 -5
- package/dist/.setup/{apply-CJ0ZfmBG.mjs → apply-DDOi8uNx.mjs} +22 -28
- package/dist/.setup/{attempt-client-cleanup-BpYKdTA0.mjs → attempt-client-cleanup-CEv1cKwF.mjs} +58 -43
- package/dist/.setup/attempt-workspace-context-DUVEn_CS.mjs +331 -0
- package/dist/.setup/{auth-cache-key-QirmgiCo.mjs → auth-cache-key-B2mpaI9D.mjs} +9 -81
- package/dist/.setup/auth-profile-health-oHizqgye.mjs +53 -0
- package/dist/.setup/auth-profile-recovery-BREezV0L.mjs +14 -0
- package/dist/.setup/{binding-connection-Bm38niE8.mjs → binding-connection-ThoatDcb.mjs} +1 -1
- package/dist/.setup/{binding-connection.runtime-CnRMC0ta.mjs → binding-connection.runtime-yoHrABt-.mjs} +4 -4
- package/dist/.setup/{bounded-turn-BtlZcivC.mjs → bounded-turn-B2HScEgT.mjs} +138 -32
- package/dist/.setup/{build-state-Xx9ybZqa.mjs → build-state-C7EnDVgr.mjs} +1 -1
- package/dist/.setup/{capabilities-_vXcZGSx.mjs → capabilities-CDXOOFdZ.mjs} +1 -1
- package/dist/.setup/{client-vXs2929Q.mjs → client-Cs08OXVQ.mjs} +583 -559
- package/dist/.setup/client-catalog-response-BMgt_4q4.mjs +285 -0
- package/dist/.setup/{command-dispatch-naHIZwwF.mjs → command-dispatch-B4JuOsOk.mjs} +8 -4
- package/dist/.setup/{command-formatters-CGEkdawF.mjs → command-formatters-Bmqvr9tO.mjs} +8 -4
- package/dist/.setup/{command-handlers-BtAJEW1X.mjs → command-handlers-DW7Lx9oH.mjs} +106 -172
- package/dist/.setup/{command-rpc-DHFpn4le.mjs → command-rpc-DixIj3HW.mjs} +36 -21
- package/dist/.setup/{compact-C3i3qlzj.mjs → compact-Du5UvtxA.mjs} +14 -21
- package/dist/.setup/{config-CedDWjM-.mjs → config-BoTP_mrL.mjs} +3 -3
- package/dist/.setup/{config-options-BsanJ8QG.mjs → config-options-BvaRs51b.mjs} +46 -30
- package/dist/.setup/{config-runtime-CeAhl_h4.mjs → config-runtime-C8Rw1m1m.mjs} +1 -1
- package/dist/.setup/{config-security-BRQ2mgW9.mjs → config-security-BEReZ6go.mjs} +35 -120
- package/dist/.setup/{conversation-binding-DhzrpTM6.mjs → conversation-binding-DP-gMrBP.mjs} +21 -32
- package/dist/.setup/{conversation-control-DN53ns41.mjs → conversation-control-uK9Jomlc.mjs} +28 -67
- package/dist/.setup/{dynamic-tools-D16lOp67.mjs → dynamic-tools-BDXl-8Cw.mjs} +848 -578
- package/dist/.setup/{effective-mcp-catalog-K6kLCN8X.mjs → effective-mcp-catalog-CvnvnGIe.mjs} +3 -3
- package/dist/.setup/{ephemeral-turn-R1gA8Sn6.mjs → ephemeral-turn-poidXgek.mjs} +9 -6
- package/dist/.setup/{event-projector-assistant-message-DNUR1s0A.mjs → event-projector-assistant-message-BsruvNrH.mjs} +2 -4
- package/dist/.setup/{event-projector-items-DyTQ_XqL.mjs → event-projector-items-C6L_5ZiT.mjs} +42 -8
- package/dist/.setup/{event-projector-usage-C7Ntzs-f.mjs → event-projector-usage-CnBS8Wa3.mjs} +1 -1
- package/dist/.setup/{harness-rxaaoN-o.mjs → harness-a_MsE4-_.mjs} +23 -17
- package/dist/.setup/{inference-context-fulhZuz8.mjs → inference-context-D96l9-ew.mjs} +1 -1
- package/dist/.setup/inference-proxy-b-aJMSxm.mjs +601 -0
- package/dist/.setup/{isolated-completion-B6srt48J.mjs → isolated-completion-BIZFhTNG.mjs} +17 -10
- package/dist/.setup/launch-args-DbFCehO7.mjs +196 -0
- package/dist/.setup/{managed-binary-DP6Rib3P.mjs → managed-binary-BnshlFag.mjs} +13 -2
- package/dist/.setup/{model-catalog-DkvUuBey.mjs → model-catalog-CfXJf9Ay.mjs} +9 -10
- package/dist/.setup/{models-BDFgm_G-.mjs → models-KnqBv0hE.mjs} +3 -3
- package/dist/.setup/{native-auth-BLZGqFjw.mjs → native-auth-rWbGbMn3.mjs} +4 -4
- package/dist/.setup/{native-subagent-history-YXaL6dMd.mjs → native-subagent-history-0nYYgo0k.mjs} +26 -13
- package/dist/.setup/{native-subagent-monitor-B1hxzIOy.mjs → native-subagent-monitor-D3filLY2.mjs} +145 -317
- package/dist/.setup/{native-subagent-task-ids-DsuOonKv.mjs → native-subagent-task-ids-wb8CKZGN.mjs} +69 -39
- package/dist/.setup/{node-cli-sessions-Cl8b2ZF3.mjs → node-cli-sessions-r3avj02l.mjs} +86 -68
- package/dist/.setup/node-exec-server.runtime-BDwWXVpK.mjs +247 -0
- package/dist/.setup/{plan-xD7WKYTM.mjs → plan-CN3VwfNU.mjs} +74 -76
- package/dist/.setup/{plugin-activation-r8nq5Jzp.mjs → plugin-activation-DT3MNtqj.mjs} +7 -16
- package/dist/.setup/{plugin-app-cache-key-BOxKP7db.mjs → plugin-app-cache-key-B2CsSdnV.mjs} +4 -20
- package/dist/.setup/{plugin-approval-roundtrip-CjfzafAZ.mjs → plugin-approval-roundtrip-C0MZzCuP.mjs} +1 -1
- package/dist/.setup/{plugin-inventory-DUle8DLz.mjs → plugin-inventory-BoRei8Z4.mjs} +16 -7
- package/dist/.setup/{plugin-marketplace-discovery-P-Vndfqq.mjs → plugin-marketplace-discovery-CDOi8IFs.mjs} +4 -1
- package/dist/.setup/{plugin-metadata-cache-DsS5buNa.mjs → plugin-metadata-cache-Ctmo83k_.mjs} +224 -154
- package/dist/.setup/protocol-CANUwXJ3.mjs +17 -0
- package/dist/.setup/{provider-fFh_-VR3.mjs → provider-BOsxQHOM.mjs} +9 -5
- package/dist/.setup/{provider-capabilities-B8J4Dy-O.mjs → provider-capabilities-BfE88FZ5.mjs} +31 -3
- package/dist/.setup/{rate-limits-DOEGYRNs.mjs → rate-limits-CMU3DUD0.mjs} +116 -137
- package/dist/.setup/{request-BioXJLYa.mjs → request-D2L0zMrq.mjs} +23 -15
- package/dist/.setup/{run-attempt-rlA07pUv.mjs → run-attempt-BHu11r7h.mjs} +1197 -617
- package/dist/.setup/{runtime-artifact-Dy38Z5iU.mjs → runtime-artifact-CLZ8udh-.mjs} +29 -45
- package/dist/.setup/{sandbox-guard-BBP-RbTf.mjs → sandbox-guard-C2sRMOEY.mjs} +1 -1
- package/dist/.setup/{session-binding-_0W_fHRr.mjs → session-binding-Cm0apEbd.mjs} +3 -32
- package/dist/.setup/{session-binding-record-TH3xA0zj.mjs → session-binding-record-BGoz8wOK.mjs} +22 -3
- package/dist/.setup/{session-binding-sidecars-CKYEcfNn.mjs → session-binding-sidecars-BlB5EvIS.mjs} +48 -45
- package/dist/.setup/{session-catalog-fUdWDx-U.mjs → session-catalog-Pno1xGcl.mjs} +482 -182
- package/dist/.setup/{session-catalog-adoption-CR_whkEW.mjs → session-catalog-adoption-BI6UTDZT.mjs} +57 -25
- package/dist/.setup/{session-catalog-archive-CwZaPacf.mjs → session-catalog-archive-lHBqzhaO.mjs} +6 -6
- package/dist/.setup/{session-catalog-events-jMcYfQyd.mjs → session-catalog-events-Bj6j94E_.mjs} +122 -25
- package/dist/.setup/{session-catalog-index-B141u15s.mjs → session-catalog-index-B9_VQIUz.mjs} +178 -78
- package/dist/.setup/{session-catalog-index-order-Cc5BzlQr.mjs → session-catalog-index-order-hcdz07yN.mjs} +2 -2
- package/dist/.setup/{session-catalog-index-state-BAuDztHN.mjs → session-catalog-index-state-Dgh8ORJm.mjs} +5 -2
- package/dist/.setup/{session-catalog-native-projection-ChV3cCtm.mjs → session-catalog-native-projection-DowriLid.mjs} +30 -13
- package/dist/.setup/{session-catalog-node-adoption-BVRsYOSh.mjs → session-catalog-node-adoption-ITddWx_X.mjs} +24 -12
- package/dist/.setup/{session-catalog-node-continue-Dowv8osw.mjs → session-catalog-node-continue-6g6qi4A9.mjs} +22 -13
- package/dist/.setup/{session-catalog-projection-C1Bj9Jl-.mjs → session-catalog-projection-zK_PUsiE.mjs} +13 -5
- package/dist/.setup/{session-cli-DIj-IE-E.mjs → session-cli-irrD-uo7.mjs} +4 -4
- package/dist/.setup/{session-history-C--SrLI8.mjs → session-history-BrqhSCf9.mjs} +17 -22
- package/dist/.setup/{session-history-import-JHXT5Xfi.mjs → session-history-import-D-3wAgOP.mjs} +4 -4
- package/dist/.setup/{session-history.worker-CpNj7H_P.mjs → session-history.worker-CaCh0xF_.mjs} +5 -18
- package/dist/.setup/{session-initialization-DH1z6fXn.mjs → session-initialization-rcgbZiid.mjs} +2 -2
- package/dist/.setup/{session-permission-policy-DhurXY0l.mjs → session-permission-policy-BI1QK_98.mjs} +2 -2
- package/dist/.setup/{session-retirement-CU87AOg9.mjs → session-retirement-BH-S6qkJ.mjs} +25 -6
- package/dist/.setup/{settled-turn-finalizer-CiY2bLFK.mjs → settled-turn-finalizer-DiAi6Kx6.mjs} +8 -8
- package/dist/.setup/{shared-client-BpTtuLQ5.mjs → shared-client-DA4VR4Eb.mjs} +59 -89
- package/dist/.setup/{side-question-DSCZyoBD.mjs → side-question-BJ1wSDcB.mjs} +147 -211
- package/dist/.setup/{source-Bjp4UQij.mjs → source-CUzJq5WN.mjs} +9 -9
- package/dist/.setup/spawn-error-CL3n6MAa.mjs +57 -0
- package/dist/.setup/{thread-archive-guard-jmecf6OJ.mjs → thread-archive-guard-C9frICzX.mjs} +10 -3
- package/dist/.setup/{thread-history-page-BTx-4xsg.mjs → thread-history-page-DoVpnHim.mjs} +1 -1
- package/dist/.setup/{thread-lifecycle-Cik28qWn.mjs → thread-lifecycle-B3mfz1TG.mjs} +172 -2271
- package/dist/.setup/{thread-ownership-skomxnIt.mjs → thread-ownership-DcTtAcXj.mjs} +4 -2
- package/dist/.setup/{thread-policy-Cjs4B8xf.mjs → thread-policy-DGuQsuFC.mjs} +19 -3
- package/dist/.setup/thread-requests-BLvGkP2R.mjs +2205 -0
- package/dist/.setup/{thread-resume-BkNpj9Pz.mjs → thread-resume-DIBXwOpE.mjs} +6 -6
- package/dist/.setup/{timeout-DZF05XrR.mjs → timeout-C910MdAB.mjs} +19 -2
- package/dist/.setup/{transcript-history-projection-DHNBDhCU.mjs → transcript-history-projection-ZZpkFkJ_.mjs} +94 -64
- package/dist/.setup/{transcript-mirror-D4qp_leP.mjs → transcript-mirror-BtHDBp1G.mjs} +218 -198
- package/dist/.setup/{transport-stdio-Cmx94Oiy.mjs → transport-stdio-h2VHOskC.mjs} +135 -55
- package/dist/.setup/{upstream-session-fork-D3UKxgVD.mjs → upstream-session-fork-BUr4OUbC.mjs} +44 -36
- package/dist/.setup/{usage-BOgBEKso.mjs → usage-BML0r-ua.mjs} +5 -4
- package/dist/.setup/{usage-limit-error-C0ow7DOc.mjs → usage-limit-error-DUMbefVY.mjs} +4 -4
- package/dist/.setup/{web-search-provider.runtime-CTGuJt6i.mjs → web-search-provider.runtime-CDKlN-Rv.mjs} +4 -3
- package/dist/api.js +23 -12
- package/dist/catalog-page-worker-entrypoint.js +12 -0
- package/dist/catalog-page.worker.js +9 -0
- package/dist/cli-metadata.js +1 -1
- package/dist/doctor-contract-api.js +2 -2
- package/dist/harness.js +1 -1
- package/dist/index.js +221 -170
- package/dist/media-understanding-provider.js +2 -2
- package/dist/migration-provider-api.js +1 -1
- package/dist/provider-discovery.js +1 -1
- package/dist/session-history-worker-runtime.js +15 -32
- package/dist/session-history.worker.js +1 -1
- package/package.json +9 -6
- package/dist/.setup/attempt-context-VXVwTCfS.mjs +0 -636
- package/dist/.setup/inference-proxy-CC15HuSi.mjs +0 -311
- package/dist/.setup/launch-args-DnMak49W.mjs +0 -111
- package/dist/.setup/node-exec-server.runtime-BaViBKNz.mjs +0 -226
- package/dist/.setup/version-CoqzXPgK.mjs +0 -12
- package/dist/.setup/{native-execution-policy-YBMHSzC4.mjs → native-execution-policy-umd0tgh4.mjs} +1 -1
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { n as isCodexAppServerProxyLaunch } from "./launch-args-DbFCehO7.mjs";
|
|
2
|
+
import { a as resolvePackagedCodexNativeCommand } from "./managed-binary-BnshlFag.mjs";
|
|
3
|
+
import { n as resolveCodexAppServerSpawnEnv, r as resolveCodexAppServerSpawnInvocation } from "./transport-stdio-h2VHOskC.mjs";
|
|
3
4
|
import { createHash } from "node:crypto";
|
|
4
|
-
import { resolveWindowsExecutablePath
|
|
5
|
+
import { resolveWindowsExecutablePath } from "openclaw/plugin-sdk/windows-spawn";
|
|
5
6
|
import { constants } from "node:fs";
|
|
6
7
|
import path from "node:path";
|
|
7
8
|
import fs$1 from "node:fs/promises";
|
|
8
|
-
import { isPathInside } from "openclaw/plugin-sdk/file-access-runtime";
|
|
9
|
+
import { isPathInside, sha256File } from "openclaw/plugin-sdk/file-access-runtime";
|
|
9
10
|
//#region extensions/codex/src/app-server/runtime-artifact.ts
|
|
10
11
|
/** Exact local runtime artifact identity for verified Codex setup turns. */
|
|
11
12
|
const ARTIFACT_ID_PREFIX = "codex-app-server:v1:";
|
|
@@ -17,8 +18,6 @@ const MAX_ARTIFACT_DEPTH = 64;
|
|
|
17
18
|
const MAX_ARTIFACT_ENTRIES = 32768;
|
|
18
19
|
const MAX_ARTIFACT_FILES = 8192;
|
|
19
20
|
const MAX_ARTIFACT_TOTAL_BYTES = 1024n * 1024n * 1024n;
|
|
20
|
-
const READ_CHUNK_BYTES = 65536;
|
|
21
|
-
const CODE_MODE_HOST_PATH_ENV = "CODEX_CODE_MODE_HOST_PATH";
|
|
22
21
|
const SAFE_NODE_OPTIONS_BOOLEAN_FLAGS = /* @__PURE__ */ new Set([
|
|
23
22
|
"--enable-network-family-autoselection",
|
|
24
23
|
"--network-family-autoselection",
|
|
@@ -74,24 +73,17 @@ async function readRegularFileFingerprint(params) {
|
|
|
74
73
|
if (!before.isFile()) throw new Error(`Codex runtime artifact contains a non-regular file: ${params.filePath}`);
|
|
75
74
|
if (params.budget.fileCount + 1 > MAX_ARTIFACT_FILES) throw new Error("Codex runtime artifact exceeds the bounded file count");
|
|
76
75
|
if (params.budget.totalBytes + before.size > MAX_ARTIFACT_TOTAL_BYTES) throw new Error("Codex runtime artifact exceeds the bounded content size");
|
|
77
|
-
const hash =
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
throwIfAborted(params.signal);
|
|
82
|
-
const length = Number(before.size - offset < BigInt(buffer.length) ? before.size - offset : BigInt(buffer.length));
|
|
83
|
-
const { bytesRead } = await handle.read(buffer, 0, length, Number(offset));
|
|
84
|
-
if (bytesRead === 0) throw new Error(`Codex runtime artifact changed while reading: ${params.filePath}`);
|
|
85
|
-
hash.update(buffer.subarray(0, bytesRead));
|
|
86
|
-
offset += BigInt(bytesRead);
|
|
87
|
-
}
|
|
76
|
+
const hash = await sha256File(handle, {
|
|
77
|
+
maxBytes: Number(before.size),
|
|
78
|
+
signal: params.signal
|
|
79
|
+
});
|
|
88
80
|
const after = await handle.stat({ bigint: true });
|
|
89
81
|
const current = await fs$1.stat(params.filePath, { bigint: true });
|
|
90
|
-
if (!sameOpenedFile(before, after) || !sameOpenedFile(after, current)) throw new Error(`Codex runtime artifact changed while reading: ${params.filePath}`);
|
|
82
|
+
if (BigInt(hash.bytes) !== before.size || !sameOpenedFile(before, after) || !sameOpenedFile(after, current)) throw new Error(`Codex runtime artifact changed while reading: ${params.filePath}`);
|
|
91
83
|
params.budget.fileCount += 1;
|
|
92
84
|
params.budget.totalBytes += after.size;
|
|
93
85
|
return {
|
|
94
|
-
contentHash: hash.digest
|
|
86
|
+
contentHash: hash.digest,
|
|
95
87
|
mode: String(after.mode),
|
|
96
88
|
size: String(after.size)
|
|
97
89
|
};
|
|
@@ -351,38 +343,29 @@ async function resolveOptionalRegularFile(filePath) {
|
|
|
351
343
|
function isMissingPathError(error) {
|
|
352
344
|
return error instanceof Error && "code" in error && error.code === "ENOENT";
|
|
353
345
|
}
|
|
354
|
-
function readEffectiveSpawnEnvironmentValue(env, name) {
|
|
355
|
-
if (process.platform !== "win32") return env[name];
|
|
356
|
-
const effectiveKey = Object.keys(env).toSorted(compareArtifactNames).find((key) => key.toUpperCase() === name.toUpperCase());
|
|
357
|
-
return effectiveKey ? env[effectiveKey] : void 0;
|
|
358
|
-
}
|
|
359
346
|
async function captureFilesystemDescriptor(params) {
|
|
360
347
|
throwIfAborted(params.signal);
|
|
361
348
|
if (params.startOptions.transport !== "stdio") throw new Error("Verified Codex inference requires a local stdio runtime artifact; WebSocket attestation is unsupported");
|
|
349
|
+
if (isCodexAppServerProxyLaunch(params.startOptions.args)) throw new Error("Verified Codex inference requires a local runtime artifact; app-server proxy attestation is unsupported");
|
|
362
350
|
const env = resolveCodexAppServerSpawnEnv(params.startOptions);
|
|
363
351
|
assertSafeNodeOptions(env);
|
|
352
|
+
const invocation = resolveCodexAppServerSpawnInvocation(params.startOptions, env);
|
|
364
353
|
const spawnCwd = path.resolve(params.startOptions.cwd ?? process.cwd());
|
|
365
354
|
const commandPath = await resolveCommandPath(params.startOptions.command, env, spawnCwd);
|
|
366
355
|
const commandRealPath = await fs$1.realpath(commandPath);
|
|
367
356
|
let nativeCommand = params.spawnIdentity.nativeCommand;
|
|
368
|
-
let nativeCandidate = commandRealPath;
|
|
369
357
|
let invocationPaths;
|
|
370
|
-
if (process.platform === "win32") {
|
|
371
|
-
const
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
});
|
|
378
|
-
const entrypoint = program.leadingArgv[0];
|
|
379
|
-
if (program.resolution === "node-entrypoint" && entrypoint && !nativeCommand) nativeCommand = resolvePackagedCodexNativeCommand(await fs$1.realpath(entrypoint));
|
|
380
|
-
if (program.resolution === "node-entrypoint" && !nativeCommand) throw new Error("Codex runtime cannot attest a custom Node launcher without its native target");
|
|
381
|
-
nativeCandidate = program.command;
|
|
358
|
+
if (process.platform === "win32" || invocation.resolution === "node-entrypoint") {
|
|
359
|
+
const entrypoint = invocation.resolution === "node-entrypoint" ? invocation.argv[0] : void 0;
|
|
360
|
+
if (entrypoint && !nativeCommand) {
|
|
361
|
+
const entrypointPath = await resolveCommandPath(entrypoint, env, spawnCwd);
|
|
362
|
+
nativeCommand = resolvePackagedCodexNativeCommand(await fs$1.realpath(entrypointPath));
|
|
363
|
+
}
|
|
364
|
+
if (invocation.resolution === "node-entrypoint" && !nativeCommand) throw new Error("Codex runtime cannot attest a custom Node launcher without its native target");
|
|
382
365
|
const invocationCandidates = [
|
|
383
366
|
commandRealPath,
|
|
384
|
-
|
|
385
|
-
...
|
|
367
|
+
invocation.command,
|
|
368
|
+
...entrypoint ? [entrypoint] : []
|
|
386
369
|
];
|
|
387
370
|
invocationPaths = [];
|
|
388
371
|
for (const candidate of invocationCandidates) {
|
|
@@ -400,13 +383,10 @@ async function captureFilesystemDescriptor(params) {
|
|
|
400
383
|
}
|
|
401
384
|
invocationPaths = [...new Set(invocationPaths)].toSorted(compareArtifactNames);
|
|
402
385
|
if (invocationPaths.length > MAX_ARTIFACT_INVOCATION_PATHS) throw new Error("Codex runtime launcher exceeds the bounded invocation file count");
|
|
403
|
-
const nativePath = await fs$1.realpath(await resolveCommandPath(nativeCommand ??
|
|
386
|
+
const nativePath = await fs$1.realpath(await resolveCommandPath(nativeCommand ?? invocation.command, env, spawnCwd));
|
|
404
387
|
const packageRoot = await resolvePackageRoot(nativePath);
|
|
405
|
-
const
|
|
406
|
-
const adjacentCodeModeHost = path.join(path.dirname(nativePath), process.platform === "win32" ? "codex-code-mode-host.exe" : "codex-code-mode-host");
|
|
407
|
-
const codeModeHostCandidatePath = configuredCodeModeHost ? path.isAbsolute(configuredCodeModeHost) ? configuredCodeModeHost : path.resolve(spawnCwd, configuredCodeModeHost) : adjacentCodeModeHost;
|
|
388
|
+
const codeModeHostCandidatePath = path.join(path.dirname(nativePath), process.platform === "win32" ? "codex-code-mode-host.exe" : "codex-code-mode-host");
|
|
408
389
|
const codeModeHostPath = await resolveOptionalRegularFile(codeModeHostCandidatePath);
|
|
409
|
-
if (configuredCodeModeHost && !codeModeHostPath) throw new Error("Configured Codex code-mode host runtime artifact is unavailable");
|
|
410
390
|
const descriptor = {
|
|
411
391
|
version: 1,
|
|
412
392
|
commandPath,
|
|
@@ -438,7 +418,11 @@ function validateFilesystemDescriptorShape(descriptor) {
|
|
|
438
418
|
"config",
|
|
439
419
|
"env"
|
|
440
420
|
].includes(descriptor.commandSource)) throw new Error("Invalid Codex runtime command source");
|
|
441
|
-
if (descriptor.managedCommandOrder !== void 0 &&
|
|
421
|
+
if (descriptor.managedCommandOrder !== void 0 && ![
|
|
422
|
+
"package-first",
|
|
423
|
+
"package-only",
|
|
424
|
+
"desktop-first"
|
|
425
|
+
].includes(descriptor.managedCommandOrder)) throw new Error("Invalid Codex managed command order");
|
|
442
426
|
if (descriptor.managedCommandOrder !== void 0 && descriptor.commandSource !== "resolved-managed") throw new Error("Invalid Codex managed runtime descriptor");
|
|
443
427
|
const canonicalInvocationPaths = [...new Set(descriptor.invocationPaths)].toSorted(compareArtifactNames);
|
|
444
428
|
if (canonicalInvocationPaths.length !== descriptor.invocationPaths.length || canonicalInvocationPaths.some((entry, index) => entry !== descriptor.invocationPaths[index])) throw new Error("Invalid Codex runtime invocation descriptor");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
|
|
2
2
|
import { l as isCodexRemoteExecPlacementSandbox } from "./config-parsing-CcB9iPoq.mjs";
|
|
3
|
-
import { n as resolveCodexNativeExecutionPolicy, t as formatCodexNativeNodeExecBlock } from "./native-execution-policy-
|
|
3
|
+
import { n as resolveCodexNativeExecutionPolicy, t as formatCodexNativeNodeExecBlock } from "./native-execution-policy-umd0tgh4.mjs";
|
|
4
4
|
import { tryResolveDefaultAgentId } from "openclaw/plugin-sdk/agent-scope-runtime";
|
|
5
5
|
import { parseAgentSessionKey } from "openclaw/plugin-sdk/routing";
|
|
6
6
|
import { resolveSandboxRuntimeStatus } from "openclaw/plugin-sdk/sandbox";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
|
|
2
|
-
import { _ as
|
|
2
|
+
import { _ as adoptCodexNativeSubagentSubmissions, a as ownsStoredSessionGeneration, c as readCodexBindingTimestamp, d as readCurrentCodexNativeSubagentSubmissions, f as readPluginAppPolicyContext, g as validateBindingForWrite, h as stripUndefinedBinding, i as matchesCodexNativeSubagentSubmissionBinding, l as readCurrentCodexAppServerBinding, m as sessionBindingIdentity, n as assertCodexBindingMayBeReplaced, o as preserveCodexNativeSubagentSubmissions, p as readStoredCodexAppServerBinding, r as bindingStoreKey, s as readCodexAppServerThreadBinding, t as CodexSupervisionBindingReplacementError, u as readCurrentCodexAppServerBindings, v as mutateCodexNativeSubagentSubmissions } from "./session-binding-record-BGoz8wOK.mjs";
|
|
3
3
|
import { n as CODEX_APP_SERVER_BINDING_NAMESPACE, t as CODEX_APP_SERVER_BINDING_MAX_ENTRIES } from "./session-binding-meta-B7aEMU7g.mjs";
|
|
4
4
|
import { n as normalizeCodexAppServerBindingModelProvider } from "./auth-profile-WqZtZfXN.mjs";
|
|
5
5
|
import { asOptionalRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
@@ -27,7 +27,6 @@ var session_binding_exports = /* @__PURE__ */ __exportAll({
|
|
|
27
27
|
reclaimCurrentCodexSessionGeneration: () => reclaimCurrentCodexSessionGeneration,
|
|
28
28
|
resolveCodexRunSessionBindingAuthority: () => resolveCodexRunSessionBindingAuthority,
|
|
29
29
|
resolveCodexSessionBinding: () => resolveCodexSessionBinding,
|
|
30
|
-
scopeCodexRunBindingStore: () => scopeCodexRunBindingStore,
|
|
31
30
|
sessionBindingIdentity: () => sessionBindingIdentity,
|
|
32
31
|
validateBindingForWrite: () => validateBindingForWrite
|
|
33
32
|
});
|
|
@@ -154,35 +153,6 @@ function createStoredCodexAppServerBinding(value, options = {}) {
|
|
|
154
153
|
function bindingLeaseLostError(key, cause) {
|
|
155
154
|
return new Error(`Lost Codex binding lease: ${key}`, cause === void 0 ? void 0 : { cause });
|
|
156
155
|
}
|
|
157
|
-
/** Carries one prepared run identity through callers that rederive it from public params. */
|
|
158
|
-
function scopeCodexRunBindingStore(params) {
|
|
159
|
-
const mapSessionIdentity = (identity) => identity.agentId === params.logicalIdentity.agentId && identity.sessionId === params.logicalIdentity.sessionId && identity.sessionKey?.trim() === params.logicalIdentity.sessionKey?.trim() ? params.physicalIdentity : identity;
|
|
160
|
-
const mapIdentity = (identity) => identity.kind === "session" ? mapSessionIdentity(identity) : identity;
|
|
161
|
-
const mapHistoryOwner = (identity, owner) => {
|
|
162
|
-
const mapped = mapIdentity(identity);
|
|
163
|
-
return identity.kind === "session" && mapped.kind === "session" && owner.sessionId === identity.sessionId ? {
|
|
164
|
-
...owner,
|
|
165
|
-
sessionId: mapped.sessionId
|
|
166
|
-
} : owner;
|
|
167
|
-
};
|
|
168
|
-
return {
|
|
169
|
-
...params.bindingStore,
|
|
170
|
-
read: (identity) => params.bindingStore.read(mapIdentity(identity)),
|
|
171
|
-
readNativeSubagentSubmissions: (identity, owner) => params.bindingStore.readNativeSubagentSubmissions(mapIdentity(identity), mapHistoryOwner(identity, owner)),
|
|
172
|
-
hasOtherThreadOwner: (threadId, identity) => params.bindingStore.hasOtherThreadOwner(threadId, identity ? mapIdentity(identity) : void 0),
|
|
173
|
-
mutate: (identity, mutation, assertCurrent) => params.bindingStore.mutate(mapIdentity(identity), mutation.kind === "record-native-subagent-submission" || mutation.kind === "consume-native-subagent-submission" ? {
|
|
174
|
-
...mutation,
|
|
175
|
-
owner: mapHistoryOwner(identity, mutation.owner)
|
|
176
|
-
} : mutation, assertCurrent),
|
|
177
|
-
prepareSessionGenerationReclaim: (identity) => params.bindingStore.prepareSessionGenerationReclaim(mapSessionIdentity(identity)),
|
|
178
|
-
adoptSessionGeneration: (identity, expectedPreviousSessionId, assertCurrent) => params.bindingStore.adoptSessionGeneration(mapSessionIdentity(identity), expectedPreviousSessionId, assertCurrent),
|
|
179
|
-
resetSessionGeneration: (identity) => params.bindingStore.resetSessionGeneration(mapSessionIdentity(identity)),
|
|
180
|
-
retireSessionGeneration: (identity) => params.bindingStore.retireSessionGeneration(mapSessionIdentity(identity)),
|
|
181
|
-
withSessionDeletion: (identity, assertCurrent, run) => params.bindingStore.withSessionDeletion(mapSessionIdentity(identity), assertCurrent, run),
|
|
182
|
-
withThreadArchiveFence: (run) => params.bindingStore.withThreadArchiveFence(run),
|
|
183
|
-
withLease: (identity, run) => params.bindingStore.withLease(mapIdentity(identity), run)
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
156
|
async function reclaimPreparedCodexSessionGeneration(params, authority, assertCurrent = authority[3]) {
|
|
187
157
|
const plan = await params.bindingStore.prepareSessionGenerationReclaim(params.identity);
|
|
188
158
|
assertCurrent();
|
|
@@ -446,6 +416,7 @@ function createCodexAppServerBindingStore(state) {
|
|
|
446
416
|
};
|
|
447
417
|
return {
|
|
448
418
|
read: (identity) => readCurrentCodexAppServerBinding(state, identity),
|
|
419
|
+
...state.lookupMany ? { readMany: (identities) => readCurrentCodexAppServerBindings(state, identities) } : {},
|
|
449
420
|
readNativeSubagentSubmissions: (identity, owner) => readCurrentCodexNativeSubagentSubmissions(state, identity, owner),
|
|
450
421
|
async hasOtherThreadOwner(threadId, currentIdentity) {
|
|
451
422
|
const currentKey = currentIdentity ? bindingStoreKey(currentIdentity) : void 0;
|
|
@@ -718,4 +689,4 @@ function sleep(ms) {
|
|
|
718
689
|
});
|
|
719
690
|
}
|
|
720
691
|
//#endregion
|
|
721
|
-
export { resolveCodexRunSessionBindingAuthority as a,
|
|
692
|
+
export { resolveCodexRunSessionBindingAuthority as a, reclaimCurrentCodexSessionGeneration as i, createCodexSessionGenerationSupersededError as n, resolveCodexSessionBinding as o, hashCodexAppServerBindingFingerprint as r, session_binding_exports as s, CODEX_APP_SERVER_BINDING_GUARDED_REQUEST_TIMEOUT_MS as t };
|
package/dist/.setup/{session-binding-record-TH3xA0zj.mjs → session-binding-record-BGoz8wOK.mjs}
RENAMED
|
@@ -192,7 +192,7 @@ const threadBindingSchema = z.object({
|
|
|
192
192
|
connectionScope: z.literal("supervision").optional(),
|
|
193
193
|
supervisionSourceThreadId: z.string().trim().min(1).optional(),
|
|
194
194
|
authProfileId: optionalStringSchema,
|
|
195
|
-
agentWorkspaceDeveloperInstructions:
|
|
195
|
+
agentWorkspaceDeveloperInstructions: optionalStringSchema,
|
|
196
196
|
model: optionalStringSchema,
|
|
197
197
|
preserveNativeModel: z.literal(true).optional().catch(void 0),
|
|
198
198
|
pendingSupervisionBranch: pendingSupervisionBranchSchema.optional(),
|
|
@@ -345,11 +345,30 @@ function readCodexBindingTimestamp(value) {
|
|
|
345
345
|
/** The same physical-generation check serves execution and read-only projections. */
|
|
346
346
|
function readCurrentCodexAppServerBinding(state, identity) {
|
|
347
347
|
const key = bindingStoreKey(identity);
|
|
348
|
-
|
|
348
|
+
return decodeCurrentCodexAppServerBinding(key, state.lookup(key), identity);
|
|
349
|
+
}
|
|
350
|
+
function decodeCurrentCodexAppServerBinding(key, raw, identity) {
|
|
349
351
|
const stored = readStoredCodexAppServerBinding(raw);
|
|
350
352
|
if (raw !== void 0 && !stored) throw new Error(`Invalid Codex app-server binding row: ${key}`);
|
|
351
353
|
return stored?.state === "active" && ownsStoredSessionGeneration(identity, stored) ? stored.binding : void 0;
|
|
352
354
|
}
|
|
355
|
+
/** Consume synchronously so each list phase acquires fresh binding authority. */
|
|
356
|
+
function* readCurrentCodexAppServerBindings(state, identities) {
|
|
357
|
+
let keys;
|
|
358
|
+
if (state.lookupMany && identities.length > 1 && identities.length <= 1e4) try {
|
|
359
|
+
keys = identities.map(bindingStoreKey);
|
|
360
|
+
} catch {}
|
|
361
|
+
if (!keys || !state.lookupMany) {
|
|
362
|
+
for (const identity of identities) yield readCurrentCodexAppServerBinding(state, identity);
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
const values = state.lookupMany(keys);
|
|
366
|
+
for (let index = 0; index < identities.length; index++) {
|
|
367
|
+
const value = values[index];
|
|
368
|
+
if (!value.ok) throw value.error;
|
|
369
|
+
yield decodeCurrentCodexAppServerBinding(keys[index], value.value, identities[index]);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
353
372
|
function matchesCodexNativeSubagentSubmissionBinding(binding, owner) {
|
|
354
373
|
return binding.threadId === owner.parentThreadId && !binding.pendingSupervisionBranch && codexNativeSubagentHistoryConnectionFingerprint(binding) === owner.connectionFingerprint;
|
|
355
374
|
}
|
|
@@ -431,4 +450,4 @@ function readDestructiveApprovalMode(value, bindingSchemaVersion) {
|
|
|
431
450
|
return "invalid";
|
|
432
451
|
}
|
|
433
452
|
//#endregion
|
|
434
|
-
export { readCodexNativeSubagentHistoryOwner as S,
|
|
453
|
+
export { readCodexNativeSubagentHistoryOwner as C, matchesCodexNativeSubagentHistoryOwner as S, adoptCodexNativeSubagentSubmissions as _, ownsStoredSessionGeneration as a, codexNativeSubagentHistoryConnectionFingerprint as b, readCodexBindingTimestamp as c, readCurrentCodexNativeSubagentSubmissions as d, readPluginAppPolicyContext as f, validateBindingForWrite as g, stripUndefinedBinding as h, matchesCodexNativeSubagentSubmissionBinding as i, readCurrentCodexAppServerBinding as l, sessionBindingIdentity as m, assertCodexBindingMayBeReplaced as n, preserveCodexNativeSubagentSubmissions as o, readStoredCodexAppServerBinding as p, bindingStoreKey as r, readCodexAppServerThreadBinding as s, CodexSupervisionBindingReplacementError as t, readCurrentCodexAppServerBindings as u, mutateCodexNativeSubagentSubmissions as v, createCodexNativeSubagentHistoryOwner as x, assertHistoryOwnerMatchesRegistration as y };
|
package/dist/.setup/{session-binding-sidecars-CKYEcfNn.mjs → session-binding-sidecars-BlB5EvIS.mjs}
RENAMED
|
@@ -5,11 +5,56 @@ import { listAgentIds, resolveAgentDir, resolveSessionAgentIdsStrict } from "ope
|
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import fs from "node:fs/promises";
|
|
7
7
|
import { canonicalPathFromExistingAncestor, isPathInside } from "openclaw/plugin-sdk/file-access-runtime";
|
|
8
|
-
import {
|
|
8
|
+
import { extractErrorCode } from "openclaw/plugin-sdk/error-runtime";
|
|
9
9
|
import { normalizeAgentId } from "openclaw/plugin-sdk/routing";
|
|
10
|
+
import { pathExists } from "openclaw/plugin-sdk/security-runtime";
|
|
10
11
|
import { withFileLock } from "openclaw/plugin-sdk/file-lock";
|
|
11
12
|
import { archiveLegacyStateSource, legacyStateFileExists } from "openclaw/plugin-sdk/runtime-doctor-migrations";
|
|
12
13
|
import { resolveStorePath } from "openclaw/plugin-sdk/session-store-paths";
|
|
14
|
+
//#region extensions/codex/src/migration/session-binding-legacy-index.ts
|
|
15
|
+
async function readLegacySessionIndex(storePath) {
|
|
16
|
+
let contents;
|
|
17
|
+
try {
|
|
18
|
+
contents = await fs.readFile(storePath, "utf8");
|
|
19
|
+
} catch (error) {
|
|
20
|
+
const code = extractErrorCode(error);
|
|
21
|
+
return code === "ENOENT" ? { entries: [] } : { failure: `session index ${storePath} could not be read${code ? ` (${code})` : ""}` };
|
|
22
|
+
}
|
|
23
|
+
let raw;
|
|
24
|
+
try {
|
|
25
|
+
raw = JSON.parse(contents);
|
|
26
|
+
} catch {
|
|
27
|
+
return { failure: `session index ${storePath} could not be read (invalid JSON)` };
|
|
28
|
+
}
|
|
29
|
+
if (!isRecord(raw)) return { failure: `session index ${storePath} has invalid entries` };
|
|
30
|
+
const entries = [];
|
|
31
|
+
for (const [sessionKey, value] of Object.entries(raw)) {
|
|
32
|
+
if (!isRecord(value)) return { failure: `session index ${storePath} has invalid entries` };
|
|
33
|
+
if (value.sessionId === void 0) continue;
|
|
34
|
+
const sessionId = typeof value.sessionId === "string" ? value.sessionId.trim() : "";
|
|
35
|
+
const sessionFile = value.sessionFile;
|
|
36
|
+
const lifecycleRevision = value.lifecycleRevision;
|
|
37
|
+
const agentHarnessId = value.agentHarnessId;
|
|
38
|
+
if (!isSafeLegacySessionId(value.sessionId) || sessionFile !== void 0 && typeof sessionFile !== "string" || lifecycleRevision !== void 0 && typeof lifecycleRevision !== "string" || agentHarnessId !== void 0 && typeof agentHarnessId !== "string") return { failure: `session index ${storePath} has invalid entries` };
|
|
39
|
+
entries.push({
|
|
40
|
+
sessionKey,
|
|
41
|
+
entry: {
|
|
42
|
+
sessionId,
|
|
43
|
+
...typeof sessionFile === "string" ? { sessionFile } : {},
|
|
44
|
+
...typeof lifecycleRevision === "string" ? { lifecycleRevision } : {},
|
|
45
|
+
...typeof agentHarnessId === "string" ? { agentHarnessId } : {},
|
|
46
|
+
...typeof value.updatedAt === "number" && Number.isFinite(value.updatedAt) && value.updatedAt >= 0 ? { updatedAt: value.updatedAt } : {}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return { entries };
|
|
51
|
+
}
|
|
52
|
+
function isSafeLegacySessionId(value) {
|
|
53
|
+
if (typeof value !== "string") return false;
|
|
54
|
+
const trimmed = value.trim();
|
|
55
|
+
return trimmed.length > 0 && trimmed.length <= 255 && /^[A-Za-z0-9][A-Za-z0-9._:@-]*$/.test(trimmed);
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
13
58
|
//#region extensions/codex/src/migration/session-binding-sidecars.ts
|
|
14
59
|
const LEGACY_BINDING_SUFFIX = ".codex-app-server.json";
|
|
15
60
|
const CODEX_AGENT_HARNESS_ID = "codex";
|
|
@@ -35,7 +80,7 @@ async function collectSessionSurfaces(params) {
|
|
|
35
80
|
agentIds: /* @__PURE__ */ new Set()
|
|
36
81
|
};
|
|
37
82
|
surface.scan ||= scan;
|
|
38
|
-
surface.storePaths.add(path.resolve(storePath));
|
|
83
|
+
if (!storePath.endsWith(".sqlite")) surface.storePaths.add(path.resolve(storePath));
|
|
39
84
|
if (agentId) surface.agentIds.add(agentId);
|
|
40
85
|
surfaces.set(canonicalRoot, surface);
|
|
41
86
|
};
|
|
@@ -96,43 +141,6 @@ async function collectLegacyBindingSources(params, options = {}) {
|
|
|
96
141
|
surfaces
|
|
97
142
|
};
|
|
98
143
|
}
|
|
99
|
-
async function readLegacySessionIndex(storePath) {
|
|
100
|
-
let contents;
|
|
101
|
-
try {
|
|
102
|
-
contents = await fs.readFile(storePath, "utf8");
|
|
103
|
-
} catch (error) {
|
|
104
|
-
const code = error.code;
|
|
105
|
-
return code === "ENOENT" ? { entries: [] } : { failure: `session index ${storePath} could not be read${code ? ` (${code})` : ""}` };
|
|
106
|
-
}
|
|
107
|
-
let raw;
|
|
108
|
-
try {
|
|
109
|
-
raw = JSON.parse(contents);
|
|
110
|
-
} catch {
|
|
111
|
-
return { failure: `session index ${storePath} could not be read (invalid JSON)` };
|
|
112
|
-
}
|
|
113
|
-
if (!isRecord(raw)) return { failure: `session index ${storePath} has invalid entries` };
|
|
114
|
-
const entries = [];
|
|
115
|
-
for (const [sessionKey, value] of Object.entries(raw)) {
|
|
116
|
-
if (!isRecord(value)) return { failure: `session index ${storePath} has invalid entries` };
|
|
117
|
-
if (value.sessionId === void 0) continue;
|
|
118
|
-
const sessionId = typeof value.sessionId === "string" ? value.sessionId.trim() : "";
|
|
119
|
-
const sessionFile = value.sessionFile;
|
|
120
|
-
const lifecycleRevision = value.lifecycleRevision;
|
|
121
|
-
const agentHarnessId = value.agentHarnessId;
|
|
122
|
-
if (!isSafeLegacySessionId(value.sessionId) || sessionFile !== void 0 && typeof sessionFile !== "string" || lifecycleRevision !== void 0 && typeof lifecycleRevision !== "string" || agentHarnessId !== void 0 && typeof agentHarnessId !== "string") return { failure: `session index ${storePath} has invalid entries` };
|
|
123
|
-
entries.push({
|
|
124
|
-
sessionKey,
|
|
125
|
-
entry: {
|
|
126
|
-
sessionId,
|
|
127
|
-
...typeof sessionFile === "string" ? { sessionFile } : {},
|
|
128
|
-
...typeof lifecycleRevision === "string" ? { lifecycleRevision } : {},
|
|
129
|
-
...typeof agentHarnessId === "string" ? { agentHarnessId } : {},
|
|
130
|
-
...typeof value.updatedAt === "number" && Number.isFinite(value.updatedAt) && value.updatedAt >= 0 ? { updatedAt: value.updatedAt } : {}
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
return { entries };
|
|
135
|
-
}
|
|
136
144
|
async function* iterateIndexedSidecars(surface) {
|
|
137
145
|
for (const storePath of surface.storePaths) {
|
|
138
146
|
const index = await readLegacySessionIndex(storePath);
|
|
@@ -292,7 +300,7 @@ async function migrateSource(source, candidates, params, store) {
|
|
|
292
300
|
return await withFileLock(source.sidecarPath, LEGACY_BINDING_LOCK_OPTIONS, async () => {
|
|
293
301
|
const [contents, stat] = await Promise.all([fs.readFile(source.sidecarPath, "utf8"), fs.stat(source.sidecarPath)]);
|
|
294
302
|
const raw = JSON.parse(contents);
|
|
295
|
-
const [{ bindingStoreKey, createStoredCodexAppServerBinding, normalizeStoredCodexAppServerBindingFingerprints, readStoredCodexAppServerBinding }, { legacyCodexConversationBindingId }] = await Promise.all([import("./session-binding-
|
|
303
|
+
const [{ bindingStoreKey, createStoredCodexAppServerBinding, normalizeStoredCodexAppServerBindingFingerprints, readStoredCodexAppServerBinding }, { legacyCodexConversationBindingId }] = await Promise.all([import("./session-binding-Cm0apEbd.mjs").then((n) => n.s), import("./conversation-binding-data-CrcyZk6O.mjs").then((n) => n.t)]);
|
|
296
304
|
const agentId = owner?.agentId ?? (source.agentIds.size === 1 ? [...source.agentIds][0] : void 0);
|
|
297
305
|
const baseStored = createStoredCodexAppServerBinding(raw, {
|
|
298
306
|
now: stat.mtime.toISOString(),
|
|
@@ -491,11 +499,6 @@ async function readDirectoryEntries(directory) {
|
|
|
491
499
|
throw error;
|
|
492
500
|
}
|
|
493
501
|
}
|
|
494
|
-
function isSafeLegacySessionId(value) {
|
|
495
|
-
if (typeof value !== "string") return false;
|
|
496
|
-
const trimmed = value.trim();
|
|
497
|
-
return trimmed.length > 0 && trimmed.length <= 255 && /^[A-Za-z0-9][A-Za-z0-9._:@-]*$/.test(trimmed);
|
|
498
|
-
}
|
|
499
502
|
async function detectLegacySessionBindingSidecars(params) {
|
|
500
503
|
const { sources } = await collectLegacyBindingSources(params, { firstOnly: true });
|
|
501
504
|
return sources.length > 0 ? { preview: [`- Codex app-server bindings: legacy sidecar -> plugin state (${CODEX_APP_SERVER_BINDING_NAMESPACE})`] } : null;
|