@openclaw/codex 2026.9.1-beta.1 → 2026.9.1
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/api.js +5 -6
- package/dist/{attempt-client-cleanup-bfsmcQ6m.js → attempt-client-cleanup-DYHcRQAa.js} +31 -45
- package/dist/attempt-context-DmQUNWwT.js +634 -0
- package/dist/{auth-binding-B4FfbcCg.js → auth-binding-Ds_QVm-X.js} +18 -3
- package/dist/{binding-connection-BMvPX73o.js → binding-connection-E6uDsPlx.js} +2 -2
- package/dist/{bounded-turn-B7iBUcuP.js → bounded-turn-wzJrwKKe.js} +15 -20
- package/dist/{capabilities-BRMh0aIq.js → capabilities-dIjNVCYH.js} +1 -1
- package/dist/cli-metadata.js +1 -1
- package/dist/{command-formatters-DEsIufkt.js → command-formatters-CLHhEB1Q.js} +5 -4
- package/dist/{command-handlers-D_-1_qRp.js → command-handlers-CTGb2csu.js} +124 -101
- package/dist/{compact-BglNFZrQ.js → compact-_t0HQrUS.js} +38 -29
- package/dist/{config-giW8X0QA.js → config-BhmfC1s6.js} +294 -282
- package/dist/{context-compaction-activity-BOeJf7yo.js → context-compaction-activity-CMla5FPJ.js} +4 -1
- package/dist/{conversation-binding-data-CW2GuupV.js → conversation-binding-data-BiodpIzq.js} +2 -1
- package/dist/doctor-contract-api.js +143 -12
- package/dist/{dynamic-tools-Dnlfa--w.js → dynamic-tools-BU9tmlYm.js} +599 -655
- package/dist/{effective-mcp-catalog-CTeGrnfO.js → effective-mcp-catalog-DzYBW4h1.js} +2 -2
- package/dist/{event-projector-assistant-message-C5-Ds8mA.js → event-projector-assistant-message-DHRFXKbS.js} +4 -4
- package/dist/{event-projector-usage-Bk1I90Bg.js → event-projector-usage-C5mcrGjp.js} +15 -148
- package/dist/{harness-Csz0F-DK.js → harness-DXVZ5II5.js} +42 -52
- package/dist/harness.js +1 -1
- package/dist/index.js +458 -404
- package/dist/{isolated-completion-Cv6FqygM.js → isolated-completion-kg9kv4iH.js} +4 -4
- package/dist/launch-args-RXQwn8zV.js +90 -0
- package/dist/{managed-binary-DFYK4DWq.js → managed-binary-4-Vjz5GH.js} +14 -9
- package/dist/media-understanding-provider.js +1 -1
- package/dist/model-catalog-CUM68Hkl.js +101 -0
- package/dist/{models-TS3HBU-q.js → models-sYnEc0gd.js} +25 -28
- package/dist/{native-subagent-monitor-4Mfq2HDs.js → native-subagent-monitor-CnH147jH.js} +55 -115
- package/dist/{node-exec-server.runtime-BpWqJO1V.js → node-exec-server.runtime-CstNHCmC.js} +9 -6
- package/dist/{plugin-approval-roundtrip-bUm777tR.js → plugin-approval-roundtrip-CNe-Xrjx.js} +30 -3
- package/dist/{plugin-marketplace-discovery-B9DvaAG-.js → plugin-marketplace-discovery-CfFlKqDl.js} +15 -14
- package/dist/{plugin-metadata-cache-CTCT3w5L.js → plugin-metadata-cache-BFrPhb2c.js} +6 -6
- package/dist/provider-capabilities-DW5p4k9w.js +101 -0
- package/dist/{rate-limits-C5_D8Gmb.js → rate-limits-CawQJfUS.js} +3 -2
- package/dist/{sandbox-guard-kuWTn9C5.js → request-DYAI5FQE.js} +195 -2
- package/dist/{run-attempt-DYc0QCBF.js → run-attempt-D1hJO4fX.js} +828 -2100
- package/dist/{runtime-artifact-BvyT1uyd.js → runtime-artifact-C3jVimFn.js} +21 -14
- package/dist/{session-binding-Bcynfd-_.js → session-binding-BHuTCRZQ.js} +198 -127
- package/dist/{session-catalog-DaLKVtpH.js → session-catalog-yyvTWFOw.js} +564 -408
- package/dist/{session-cli-DMc4oS2w.js → session-cli-CmFEXMAM.js} +1 -1
- package/dist/session-history-C5J1AKzG.js +87 -0
- package/dist/session-initialization-BeWzjGiR.js +74 -0
- package/dist/{session-permission-policy-BrNH1bjy.js → session-permission-policy-DeWVTCMj.js} +2 -2
- package/dist/session-retirement-BujDjXVF.js +97 -0
- package/dist/{session-upstream-marker-BIkusb95.js → session-upstream-marker-C351-5Qw.js} +19 -4
- package/dist/settled-turn-context-D3SNWtUn.js +268 -0
- package/dist/settled-turn-finalizer-BVJx4yoc.js +104 -0
- package/dist/{shared-client-DKz23hHY.js → shared-client-DxcfF9KX.js} +3480 -679
- package/dist/{side-question-DjA_jsNe.js → side-question-BTZAII4l.js} +108 -70
- package/dist/{thread-lifecycle-L7oEkTlq.js → thread-lifecycle-DAcEJ_Om.js} +2188 -1915
- package/dist/{thread-ownership-DZeuKH1j.js → thread-ownership-zGokd8i1.js} +25 -14
- package/dist/thread-policy-g4KbJPzp.js +54 -0
- package/dist/{plugin-app-cache-key-C1CAdfcP.js → thread-resume-C7pyVKeW.js} +59 -7
- package/dist/{transcript-mirror-DsCMWBca.js → transcript-mirror-DTUxFWa_.js} +79 -17
- package/dist/transport-stdio-CyPldczm.js +726 -0
- package/dist/{upstream-prompt-provenance-CFmsKwr9.js → upstream-prompt-provenance-LphB8slG.js} +8 -4
- package/dist/upstream-session-fork-CYlBIGVt.js +966 -0
- package/dist/{usage-ROIaW3wo.js → usage-Bj-rrzkR.js} +3 -3
- package/dist/{web-search-provider.runtime-ClaNPV7N.js → web-search-provider.runtime-D2FWSK4w.js} +3 -3
- package/openclaw.plugin.json +1 -30
- package/package.json +6 -6
- package/dist/command-rpc-CCeCkf_v.js +0 -90
- package/dist/incognito-session-ET_ufDH-.js +0 -2
- package/dist/model-catalog-i9rNBthX.js +0 -48
- package/dist/protocol-validators-VeJxxJ0U.js +0 -2421
- package/dist/request-DXXGHko0.js +0 -157
- package/dist/session-catalog-home-id-BNwAJ9D7.js +0 -18
- package/dist/session-retirement-CcNC3YSY.js +0 -36
- package/dist/settled-turn-finalizer-Dc3ApjU4.js +0 -328
- package/dist/thread-resume-BE9qNEW0.js +0 -30
- package/dist/transport-stdio-DhoGy33Z.js +0 -99
- package/dist/upstream-session-fork-DlaHxSLC.js +0 -326
package/dist/{context-compaction-activity-BOeJf7yo.js → context-compaction-activity-CMla5FPJ.js}
RENAMED
|
@@ -20,7 +20,10 @@ async function persistCodexContextCompactionActivity(params) {
|
|
|
20
20
|
itemId: params.itemId,
|
|
21
21
|
...params.runId ? { runId: params.runId } : {}
|
|
22
22
|
},
|
|
23
|
-
|
|
23
|
+
__openclaw: {
|
|
24
|
+
itemId: params.itemId,
|
|
25
|
+
...params.runId ? { runId: params.runId } : {}
|
|
26
|
+
},
|
|
24
27
|
timestamp: params.timestamp,
|
|
25
28
|
idempotencyKey: activityId
|
|
26
29
|
};
|
package/dist/{conversation-binding-data-CW2GuupV.js → conversation-binding-data-BiodpIzq.js}
RENAMED
|
@@ -94,7 +94,8 @@ function legacyCodexConversationBindingId(sessionFile) {
|
|
|
94
94
|
return `legacy-${createHash("sha256").update(sessionFile).digest("base64url")}`;
|
|
95
95
|
}
|
|
96
96
|
function resolveCodexDefaultWorkspaceDir(pluginConfig) {
|
|
97
|
-
|
|
97
|
+
const appServer = asOptionalRecord(asOptionalRecord(pluginConfig)?.appServer);
|
|
98
|
+
return normalizeOptionalString(appServer?.defaultWorkspaceDir) ?? process.cwd();
|
|
98
99
|
}
|
|
99
100
|
function readConversationStart(value) {
|
|
100
101
|
const read = (key) => {
|
|
@@ -1,14 +1,113 @@
|
|
|
1
1
|
import { n as CODEX_APP_SERVER_BINDING_NAMESPACE, t as CODEX_APP_SERVER_BINDING_MAX_ENTRIES } from "./session-binding-meta-B7aEMU7g.js";
|
|
2
|
-
import { asNullableRecord, isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
2
|
+
import { asNullableRecord, asOptionalRecord, isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
3
3
|
import fs from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
+
import { canonicalPathFromExistingAncestor, isPathInside } from "openclaw/plugin-sdk/file-access-runtime";
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
5
7
|
import { isDeepStrictEqual } from "node:util";
|
|
6
|
-
import { listAgentIds, resolveAgentDir, resolveSessionAgentIds } from "openclaw/plugin-sdk/agent-scope-runtime";
|
|
7
8
|
import { pathExists } from "openclaw/plugin-sdk/security-runtime";
|
|
9
|
+
import { listAgentIds, resolveAgentDir, resolveSessionAgentIdsStrict } from "openclaw/plugin-sdk/agent-scope-runtime";
|
|
10
|
+
import { setImmediate } from "node:timers/promises";
|
|
8
11
|
import { normalizeAgentId } from "openclaw/plugin-sdk/routing";
|
|
9
|
-
import { canonicalPathFromExistingAncestor, isPathInside } from "openclaw/plugin-sdk/file-access-runtime";
|
|
10
12
|
import { withFileLock } from "openclaw/plugin-sdk/file-lock";
|
|
11
13
|
import { archiveLegacyStateSource, legacyStateFileExists } from "openclaw/plugin-sdk/runtime-doctor-migrations";
|
|
14
|
+
//#region extensions/codex/src/migration/session-binding-orphans.ts
|
|
15
|
+
const PAGE_SIZE = 512;
|
|
16
|
+
const KEY_PREFIXES = ["session-key:", "session:"];
|
|
17
|
+
function readBindingCandidate(row, prefix) {
|
|
18
|
+
const identity = /^([a-z0-9][a-z0-9_-]{0,63}):(.+)$/u.exec(row.key.slice(prefix.length));
|
|
19
|
+
if (!identity) return;
|
|
20
|
+
const agentId = identity[1];
|
|
21
|
+
const keyIdentity = identity[2];
|
|
22
|
+
const stored = asOptionalRecord(row.value);
|
|
23
|
+
const sessionId = typeof stored?.sessionId === "string" ? stored.sessionId.trim() : "";
|
|
24
|
+
const stable = prefix === "session-key:";
|
|
25
|
+
if (!stored || stored.version !== 1 || !sessionId || (stable ? !/^[A-Za-z0-9_-]{43}$/u.test(keyIdentity) : sessionId !== keyIdentity)) return;
|
|
26
|
+
if (stored.state === "cleared") {
|
|
27
|
+
if (stored.binding !== void 0 || stored.retired !== void 0 && stored.retired !== true) return;
|
|
28
|
+
} else if (stored.state === "active") {
|
|
29
|
+
const binding = asOptionalRecord(stored.binding);
|
|
30
|
+
if (!binding || typeof binding.threadId !== "string" || !binding.threadId.trim() || typeof binding.cwd !== "string" || binding.connectionScope !== void 0 || binding.supervisionSourceThreadId !== void 0 || binding.pendingSupervisionBranch !== void 0 || stored.retired !== void 0) return;
|
|
31
|
+
} else return;
|
|
32
|
+
if (stored.lease !== void 0) {
|
|
33
|
+
const lease = asOptionalRecord(stored.lease);
|
|
34
|
+
if (!lease || typeof lease.token !== "string" || !lease.token.trim() || typeof lease.expiresAt !== "number" || !Number.isFinite(lease.expiresAt) || lease.expiresAt > Date.now()) return;
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
row,
|
|
38
|
+
agentId,
|
|
39
|
+
sessionId,
|
|
40
|
+
stable
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async function* iterateOrphanBindingPages({ context }) {
|
|
44
|
+
const readPage = context.readPluginStateEntriesInKeyRange;
|
|
45
|
+
const readEvidence = context.readSessionIdentityEvidenceBatch;
|
|
46
|
+
if (!readPage || !readEvidence) return;
|
|
47
|
+
for (const prefix of KEY_PREFIXES) {
|
|
48
|
+
let after;
|
|
49
|
+
while (true) {
|
|
50
|
+
const rows = readPage(CODEX_APP_SERVER_BINDING_NAMESPACE, {
|
|
51
|
+
prefix,
|
|
52
|
+
...after ? { after } : {},
|
|
53
|
+
limit: PAGE_SIZE
|
|
54
|
+
});
|
|
55
|
+
if (rows.length === 0) break;
|
|
56
|
+
after = rows.at(-1)?.key;
|
|
57
|
+
const candidates = rows.flatMap((row) => {
|
|
58
|
+
const candidate = readBindingCandidate(row, prefix);
|
|
59
|
+
return candidate ? [candidate] : [];
|
|
60
|
+
});
|
|
61
|
+
if (candidates.length > 0) {
|
|
62
|
+
const identities = new Map(candidates.map(({ agentId, sessionId }) => [`${agentId}\0${sessionId}`, {
|
|
63
|
+
agentId,
|
|
64
|
+
sessionId
|
|
65
|
+
}]));
|
|
66
|
+
const evidence = new Map((await readEvidence([...identities.values()])).map((owner) => [`${owner.agentId}\0${owner.sessionId}`, owner]));
|
|
67
|
+
const stale = candidates.filter(({ row, agentId, sessionId, stable }) => {
|
|
68
|
+
const owner = evidence.get(`${agentId}\0${sessionId}`);
|
|
69
|
+
if (!owner || owner.state === "unknown") return false;
|
|
70
|
+
if (owner.state !== "current") return true;
|
|
71
|
+
if (!stable) return false;
|
|
72
|
+
const digest = createHash("sha256").update(owner.sessionKey).digest("base64url");
|
|
73
|
+
return row.key !== `session-key:${agentId}:${digest}`;
|
|
74
|
+
}).map(({ row }) => row);
|
|
75
|
+
if (stale.length > 0) yield stale;
|
|
76
|
+
}
|
|
77
|
+
if (rows.length < PAGE_SIZE) break;
|
|
78
|
+
await setImmediate();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const codexOrphanedSessionBindingMigration = {
|
|
83
|
+
id: "codex-app-server-orphaned-session-bindings",
|
|
84
|
+
label: "Codex app-server orphaned session bindings",
|
|
85
|
+
doctorOnly: true,
|
|
86
|
+
phase: "after-session-repair",
|
|
87
|
+
async detectLegacyState(params) {
|
|
88
|
+
for await (const _ of iterateOrphanBindingPages(params)) return { preview: ["- Codex app-server bindings: remove orphaned session ownership"] };
|
|
89
|
+
return null;
|
|
90
|
+
},
|
|
91
|
+
async migrateLegacyState(params) {
|
|
92
|
+
const remove = params.context.deletePluginStateEntriesIfUnchanged;
|
|
93
|
+
if (!remove) return {
|
|
94
|
+
changes: [],
|
|
95
|
+
warnings: ["Codex session binding repair requires locked SQLite maintenance ownership"]
|
|
96
|
+
};
|
|
97
|
+
let deleted = 0;
|
|
98
|
+
let changed = 0;
|
|
99
|
+
for await (const rows of iterateOrphanBindingPages(params)) {
|
|
100
|
+
const result = remove(CODEX_APP_SERVER_BINDING_NAMESPACE, rows);
|
|
101
|
+
deleted += result.deleted;
|
|
102
|
+
changed += result.changed;
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
changes: deleted > 0 ? [`Removed ${deleted} orphaned Codex app-server session binding(s)`] : [],
|
|
106
|
+
warnings: changed > 0 ? [`Preserved ${changed} Codex app-server session binding(s) changed during repair`] : []
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
//#endregion
|
|
12
111
|
//#region extensions/codex/src/migration/session-binding-sidecars.ts
|
|
13
112
|
const LEGACY_BINDING_SUFFIX = ".codex-app-server.json";
|
|
14
113
|
const CODEX_AGENT_HARNESS_ID = "codex";
|
|
@@ -43,7 +142,7 @@ async function collectSessionSurfaces(params) {
|
|
|
43
142
|
const agentsDir = path.join(params.stateDir, "agents");
|
|
44
143
|
for (const entry of await readDirectoryEntries(agentsDir)) {
|
|
45
144
|
if (!entry.isDirectory() || entry.isSymbolicLink()) continue;
|
|
46
|
-
const agentId =
|
|
145
|
+
const agentId = resolveSessionAgentIdsStrict({
|
|
47
146
|
agentId: entry.name,
|
|
48
147
|
config: params.config
|
|
49
148
|
}).sessionAgentId;
|
|
@@ -245,7 +344,7 @@ async function resolveLegacySessionFileLocator(sessionsDir, entry, sessionId) {
|
|
|
245
344
|
return candidate;
|
|
246
345
|
}
|
|
247
346
|
function tryResolveLegacyBindingOwnerAgentId(params) {
|
|
248
|
-
if (params.sessionKey.trim().toLowerCase().startsWith("agent:")) return
|
|
347
|
+
if (params.sessionKey.trim().toLowerCase().startsWith("agent:")) return resolveSessionAgentIdsStrict({
|
|
249
348
|
sessionKey: params.sessionKey,
|
|
250
349
|
config: params.config
|
|
251
350
|
}).sessionAgentId;
|
|
@@ -254,7 +353,7 @@ function tryResolveLegacyBindingOwnerAgentId(params) {
|
|
|
254
353
|
const systemAgentId = !storeAgentId && configuredAgentId ? normalizeAgentId(configuredAgentId) : void 0;
|
|
255
354
|
const fallbackAgentIds = systemAgentId && listAgentIds(params.config).includes(systemAgentId) ? [void 0, systemAgentId] : [void 0];
|
|
256
355
|
for (const fallbackAgentId of fallbackAgentIds) try {
|
|
257
|
-
return
|
|
356
|
+
return resolveSessionAgentIdsStrict({
|
|
258
357
|
sessionKey: params.sessionKey,
|
|
259
358
|
config: params.config,
|
|
260
359
|
...storeAgentId ? { agentId: storeAgentId } : fallbackAgentId ? { fallbackAgentId } : {}
|
|
@@ -293,7 +392,7 @@ async function migrateSource(source, candidates, params, store) {
|
|
|
293
392
|
return await withFileLock(source.sidecarPath, LEGACY_BINDING_LOCK_OPTIONS, async () => {
|
|
294
393
|
const [contents, stat] = await Promise.all([fs.readFile(source.sidecarPath, "utf8"), fs.stat(source.sidecarPath)]);
|
|
295
394
|
const raw = JSON.parse(contents);
|
|
296
|
-
const [{ bindingStoreKey, createStoredCodexAppServerBinding, normalizeStoredCodexAppServerBindingFingerprints, readStoredCodexAppServerBinding }, { legacyCodexConversationBindingId }] = await Promise.all([import("./session-binding-
|
|
395
|
+
const [{ bindingStoreKey, createStoredCodexAppServerBinding, normalizeStoredCodexAppServerBindingFingerprints, readStoredCodexAppServerBinding }, { legacyCodexConversationBindingId }] = await Promise.all([import("./session-binding-BHuTCRZQ.js").then((n) => n.f), import("./conversation-binding-data-BiodpIzq.js").then((n) => n.t)]);
|
|
297
396
|
const agentId = owner?.agentId ?? (source.agentIds.size === 1 ? [...source.agentIds][0] : void 0);
|
|
298
397
|
const baseStored = createStoredCodexAppServerBinding(raw, {
|
|
299
398
|
now: stat.mtime.toISOString(),
|
|
@@ -478,7 +577,7 @@ function isSafeLegacySessionId(value) {
|
|
|
478
577
|
const trimmed = value.trim();
|
|
479
578
|
return trimmed.length > 0 && trimmed.length <= 255 && /^[A-Za-z0-9][A-Za-z0-9._:@-]*$/.test(trimmed);
|
|
480
579
|
}
|
|
481
|
-
const stateMigrations = [{
|
|
580
|
+
const stateMigrations$1 = [{
|
|
482
581
|
id: "codex-app-server-sidecars-to-plugin-state",
|
|
483
582
|
label: "Codex app-server thread bindings",
|
|
484
583
|
async detectLegacyState(params) {
|
|
@@ -541,6 +640,15 @@ function hasRetiredApprovalPolicy(value) {
|
|
|
541
640
|
const approvalPolicy = asNullableRecord(value)?.approvalPolicy;
|
|
542
641
|
return approvalPolicy === "on-failure" || approvalPolicy === "untrusted";
|
|
543
642
|
}
|
|
643
|
+
const RETIRED_TURN_IDLE_TIMEOUT_KEYS = [
|
|
644
|
+
"turnCompletionIdleTimeoutMs",
|
|
645
|
+
"turnAssistantCompletionIdleTimeoutMs",
|
|
646
|
+
"postToolRawAssistantCompletionIdleTimeoutMs"
|
|
647
|
+
];
|
|
648
|
+
function hasRetiredTurnIdleTimeout(value) {
|
|
649
|
+
const appServer = asNullableRecord(value);
|
|
650
|
+
return appServer !== null && RETIRED_TURN_IDLE_TIMEOUT_KEYS.some((key) => Object.hasOwn(appServer, key));
|
|
651
|
+
}
|
|
544
652
|
/** Legacy Codex config keys that doctor should report or repair. */
|
|
545
653
|
const legacyConfigRules = [
|
|
546
654
|
{
|
|
@@ -574,24 +682,40 @@ const legacyConfigRules = [
|
|
|
574
682
|
],
|
|
575
683
|
message: "plugins.entries.codex.config.appServer.approvalPolicy values \"on-failure\" and \"untrusted\" are retired; use \"on-request\". Run \"openclaw doctor --fix\".",
|
|
576
684
|
match: hasRetiredApprovalPolicy
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
path: [
|
|
688
|
+
"plugins",
|
|
689
|
+
"entries",
|
|
690
|
+
"codex",
|
|
691
|
+
"config",
|
|
692
|
+
"appServer"
|
|
693
|
+
],
|
|
694
|
+
message: "Codex app-server turn idle timeouts are retired; native Codex owns provider liveness and turn completion. The existing agents.defaults.timeoutSeconds run limit remains unchanged. Run \"openclaw doctor --fix\" to remove the old settings.",
|
|
695
|
+
match: hasRetiredTurnIdleTimeout
|
|
577
696
|
}
|
|
578
697
|
];
|
|
579
698
|
/**
|
|
580
699
|
* Removes retired Codex plugin config keys while preserving unrelated config.
|
|
581
700
|
*/
|
|
582
701
|
function normalizeCompatibilityConfig({ cfg }) {
|
|
583
|
-
const
|
|
702
|
+
const rawEntry = asNullableRecord(cfg.plugins?.entries?.codex);
|
|
703
|
+
const rawPluginConfig = asNullableRecord(rawEntry?.config);
|
|
584
704
|
const rawCodexPlugins = asNullableRecord(rawPluginConfig?.codexPlugins);
|
|
585
705
|
const rawAppServer = asNullableRecord(rawPluginConfig?.appServer);
|
|
586
706
|
const shouldRemoveDynamicToolsProfile = rawPluginConfig !== null && hasRetiredDynamicToolsProfile(rawPluginConfig);
|
|
587
707
|
const shouldRewriteDestructivePolicy = hasLegacyPluginDestructivePolicy(rawCodexPlugins);
|
|
588
708
|
const shouldRewriteApprovalPolicy = hasRetiredApprovalPolicy(rawAppServer);
|
|
589
|
-
|
|
709
|
+
const shouldRemoveTurnIdleTimeouts = hasRetiredTurnIdleTimeout(rawAppServer);
|
|
710
|
+
if (!rawPluginConfig || !shouldRemoveDynamicToolsProfile && !shouldRewriteDestructivePolicy && !shouldRewriteApprovalPolicy && !shouldRemoveTurnIdleTimeouts) return {
|
|
590
711
|
config: cfg,
|
|
591
712
|
changes: []
|
|
592
713
|
};
|
|
593
714
|
const nextConfig = structuredClone(cfg);
|
|
594
|
-
const
|
|
715
|
+
const nextPlugins = asNullableRecord(nextConfig.plugins);
|
|
716
|
+
const nextEntries = asNullableRecord(nextPlugins?.entries);
|
|
717
|
+
const nextEntry = asNullableRecord(nextEntries?.codex);
|
|
718
|
+
const nextPluginConfig = asNullableRecord(nextEntry?.config);
|
|
595
719
|
if (!nextPluginConfig) return {
|
|
596
720
|
config: cfg,
|
|
597
721
|
changes: []
|
|
@@ -611,8 +735,14 @@ function normalizeCompatibilityConfig({ cfg }) {
|
|
|
611
735
|
}
|
|
612
736
|
changes.push("Renamed plugins.entries.codex.config.codexPlugins allow_destructive_actions=\"on-request\" values to \"auto\".");
|
|
613
737
|
}
|
|
738
|
+
const nextAppServer = asNullableRecord(nextPluginConfig.appServer);
|
|
739
|
+
if (nextAppServer && shouldRemoveTurnIdleTimeouts) {
|
|
740
|
+
for (const key of RETIRED_TURN_IDLE_TIMEOUT_KEYS) if (Object.hasOwn(nextAppServer, key)) {
|
|
741
|
+
delete nextAppServer[key];
|
|
742
|
+
changes.push(`Removed retired plugins.entries.codex.config.appServer.${key}; native Codex owns provider liveness and turn completion. agents.defaults.timeoutSeconds was not changed.`);
|
|
743
|
+
}
|
|
744
|
+
}
|
|
614
745
|
if (shouldRewriteApprovalPolicy) {
|
|
615
|
-
const nextAppServer = asNullableRecord(nextPluginConfig.appServer);
|
|
616
746
|
if (nextAppServer?.approvalPolicy === "on-failure" || nextAppServer?.approvalPolicy === "untrusted") nextAppServer.approvalPolicy = "on-request";
|
|
617
747
|
changes.push("Renamed retired plugins.entries.codex.config.appServer.approvalPolicy to \"on-request\".");
|
|
618
748
|
}
|
|
@@ -621,5 +751,6 @@ function normalizeCompatibilityConfig({ cfg }) {
|
|
|
621
751
|
changes
|
|
622
752
|
};
|
|
623
753
|
}
|
|
754
|
+
const stateMigrations = [...stateMigrations$1, codexOrphanedSessionBindingMigration];
|
|
624
755
|
//#endregion
|
|
625
756
|
export { legacyConfigRules, normalizeCompatibilityConfig, stateMigrations };
|