@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.
Files changed (73) hide show
  1. package/dist/api.js +5 -6
  2. package/dist/{attempt-client-cleanup-bfsmcQ6m.js → attempt-client-cleanup-DYHcRQAa.js} +31 -45
  3. package/dist/attempt-context-DmQUNWwT.js +634 -0
  4. package/dist/{auth-binding-B4FfbcCg.js → auth-binding-Ds_QVm-X.js} +18 -3
  5. package/dist/{binding-connection-BMvPX73o.js → binding-connection-E6uDsPlx.js} +2 -2
  6. package/dist/{bounded-turn-B7iBUcuP.js → bounded-turn-wzJrwKKe.js} +15 -20
  7. package/dist/{capabilities-BRMh0aIq.js → capabilities-dIjNVCYH.js} +1 -1
  8. package/dist/cli-metadata.js +1 -1
  9. package/dist/{command-formatters-DEsIufkt.js → command-formatters-CLHhEB1Q.js} +5 -4
  10. package/dist/{command-handlers-D_-1_qRp.js → command-handlers-CTGb2csu.js} +124 -101
  11. package/dist/{compact-BglNFZrQ.js → compact-_t0HQrUS.js} +38 -29
  12. package/dist/{config-giW8X0QA.js → config-BhmfC1s6.js} +294 -282
  13. package/dist/{context-compaction-activity-BOeJf7yo.js → context-compaction-activity-CMla5FPJ.js} +4 -1
  14. package/dist/{conversation-binding-data-CW2GuupV.js → conversation-binding-data-BiodpIzq.js} +2 -1
  15. package/dist/doctor-contract-api.js +143 -12
  16. package/dist/{dynamic-tools-Dnlfa--w.js → dynamic-tools-BU9tmlYm.js} +599 -655
  17. package/dist/{effective-mcp-catalog-CTeGrnfO.js → effective-mcp-catalog-DzYBW4h1.js} +2 -2
  18. package/dist/{event-projector-assistant-message-C5-Ds8mA.js → event-projector-assistant-message-DHRFXKbS.js} +4 -4
  19. package/dist/{event-projector-usage-Bk1I90Bg.js → event-projector-usage-C5mcrGjp.js} +15 -148
  20. package/dist/{harness-Csz0F-DK.js → harness-DXVZ5II5.js} +42 -52
  21. package/dist/harness.js +1 -1
  22. package/dist/index.js +458 -404
  23. package/dist/{isolated-completion-Cv6FqygM.js → isolated-completion-kg9kv4iH.js} +4 -4
  24. package/dist/launch-args-RXQwn8zV.js +90 -0
  25. package/dist/{managed-binary-DFYK4DWq.js → managed-binary-4-Vjz5GH.js} +14 -9
  26. package/dist/media-understanding-provider.js +1 -1
  27. package/dist/model-catalog-CUM68Hkl.js +101 -0
  28. package/dist/{models-TS3HBU-q.js → models-sYnEc0gd.js} +25 -28
  29. package/dist/{native-subagent-monitor-4Mfq2HDs.js → native-subagent-monitor-CnH147jH.js} +55 -115
  30. package/dist/{node-exec-server.runtime-BpWqJO1V.js → node-exec-server.runtime-CstNHCmC.js} +9 -6
  31. package/dist/{plugin-approval-roundtrip-bUm777tR.js → plugin-approval-roundtrip-CNe-Xrjx.js} +30 -3
  32. package/dist/{plugin-marketplace-discovery-B9DvaAG-.js → plugin-marketplace-discovery-CfFlKqDl.js} +15 -14
  33. package/dist/{plugin-metadata-cache-CTCT3w5L.js → plugin-metadata-cache-BFrPhb2c.js} +6 -6
  34. package/dist/provider-capabilities-DW5p4k9w.js +101 -0
  35. package/dist/{rate-limits-C5_D8Gmb.js → rate-limits-CawQJfUS.js} +3 -2
  36. package/dist/{sandbox-guard-kuWTn9C5.js → request-DYAI5FQE.js} +195 -2
  37. package/dist/{run-attempt-DYc0QCBF.js → run-attempt-D1hJO4fX.js} +828 -2100
  38. package/dist/{runtime-artifact-BvyT1uyd.js → runtime-artifact-C3jVimFn.js} +21 -14
  39. package/dist/{session-binding-Bcynfd-_.js → session-binding-BHuTCRZQ.js} +198 -127
  40. package/dist/{session-catalog-DaLKVtpH.js → session-catalog-yyvTWFOw.js} +564 -408
  41. package/dist/{session-cli-DMc4oS2w.js → session-cli-CmFEXMAM.js} +1 -1
  42. package/dist/session-history-C5J1AKzG.js +87 -0
  43. package/dist/session-initialization-BeWzjGiR.js +74 -0
  44. package/dist/{session-permission-policy-BrNH1bjy.js → session-permission-policy-DeWVTCMj.js} +2 -2
  45. package/dist/session-retirement-BujDjXVF.js +97 -0
  46. package/dist/{session-upstream-marker-BIkusb95.js → session-upstream-marker-C351-5Qw.js} +19 -4
  47. package/dist/settled-turn-context-D3SNWtUn.js +268 -0
  48. package/dist/settled-turn-finalizer-BVJx4yoc.js +104 -0
  49. package/dist/{shared-client-DKz23hHY.js → shared-client-DxcfF9KX.js} +3480 -679
  50. package/dist/{side-question-DjA_jsNe.js → side-question-BTZAII4l.js} +108 -70
  51. package/dist/{thread-lifecycle-L7oEkTlq.js → thread-lifecycle-DAcEJ_Om.js} +2188 -1915
  52. package/dist/{thread-ownership-DZeuKH1j.js → thread-ownership-zGokd8i1.js} +25 -14
  53. package/dist/thread-policy-g4KbJPzp.js +54 -0
  54. package/dist/{plugin-app-cache-key-C1CAdfcP.js → thread-resume-C7pyVKeW.js} +59 -7
  55. package/dist/{transcript-mirror-DsCMWBca.js → transcript-mirror-DTUxFWa_.js} +79 -17
  56. package/dist/transport-stdio-CyPldczm.js +726 -0
  57. package/dist/{upstream-prompt-provenance-CFmsKwr9.js → upstream-prompt-provenance-LphB8slG.js} +8 -4
  58. package/dist/upstream-session-fork-CYlBIGVt.js +966 -0
  59. package/dist/{usage-ROIaW3wo.js → usage-Bj-rrzkR.js} +3 -3
  60. package/dist/{web-search-provider.runtime-ClaNPV7N.js → web-search-provider.runtime-D2FWSK4w.js} +3 -3
  61. package/openclaw.plugin.json +1 -30
  62. package/package.json +6 -6
  63. package/dist/command-rpc-CCeCkf_v.js +0 -90
  64. package/dist/incognito-session-ET_ufDH-.js +0 -2
  65. package/dist/model-catalog-i9rNBthX.js +0 -48
  66. package/dist/protocol-validators-VeJxxJ0U.js +0 -2421
  67. package/dist/request-DXXGHko0.js +0 -157
  68. package/dist/session-catalog-home-id-BNwAJ9D7.js +0 -18
  69. package/dist/session-retirement-CcNC3YSY.js +0 -36
  70. package/dist/settled-turn-finalizer-Dc3ApjU4.js +0 -328
  71. package/dist/thread-resume-BE9qNEW0.js +0 -30
  72. package/dist/transport-stdio-DhoGy33Z.js +0 -99
  73. package/dist/upstream-session-fork-DlaHxSLC.js +0 -326
@@ -20,7 +20,10 @@ async function persistCodexContextCompactionActivity(params) {
20
20
  itemId: params.itemId,
21
21
  ...params.runId ? { runId: params.runId } : {}
22
22
  },
23
- ...params.runId ? { __openclaw: { runId: params.runId } } : {},
23
+ __openclaw: {
24
+ itemId: params.itemId,
25
+ ...params.runId ? { runId: params.runId } : {}
26
+ },
24
27
  timestamp: params.timestamp,
25
28
  idempotencyKey: activityId
26
29
  };
@@ -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
- return normalizeOptionalString(asOptionalRecord(asOptionalRecord(pluginConfig)?.appServer)?.defaultWorkspaceDir) ?? process.cwd();
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 = resolveSessionAgentIds({
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 resolveSessionAgentIds({
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 resolveSessionAgentIds({
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-Bcynfd-_.js").then((n) => n.f), import("./conversation-binding-data-CW2GuupV.js").then((n) => n.t)]);
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 rawPluginConfig = asNullableRecord(asNullableRecord(cfg.plugins?.entries?.codex)?.config);
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
- if (!rawPluginConfig || !shouldRemoveDynamicToolsProfile && !shouldRewriteDestructivePolicy && !shouldRewriteApprovalPolicy) return {
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 nextPluginConfig = asNullableRecord(asNullableRecord(asNullableRecord(asNullableRecord(nextConfig.plugins)?.entries)?.codex)?.config);
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 };