@openclaw/codex 2026.9.2 → 2026.9.4

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 (120) hide show
  1. package/README.md +2 -0
  2. package/dist/api.js +29 -26
  3. package/dist/apply-CvT8tW5i.js +356 -0
  4. package/dist/{attempt-client-cleanup-Bp1ZOnk2.js → attempt-client-cleanup-DKHzbwt5.js} +38 -214
  5. package/dist/{attempt-context-CSazkWns.js → attempt-context-D44yeDII.js} +9 -7
  6. package/dist/{event-projector-usage-ZqEVbAEY.js → attempt-notifications-C9XufG6l.js} +3 -106
  7. package/dist/{auth-binding-Ds_QVm-X.js → auth-binding-CWlKVccJ.js} +2 -2
  8. package/dist/auth-cache-key-7orQae_j.js +498 -0
  9. package/dist/auth-profile-CwzO4_RG.js +43 -0
  10. package/dist/auth-profile-selection-DFu9e167.js +45 -0
  11. package/dist/binding-connection-D3udKbIE.js +60 -0
  12. package/dist/{bounded-turn-DxGJRYbY.js → bounded-turn-C_Hneydj.js} +28 -125
  13. package/dist/build-state-BCmg9-5p.js +19 -0
  14. package/dist/{capabilities-B1mgvpP8.js → capabilities-8vx68WLH.js} +1 -1
  15. package/dist/cli-metadata.js +1 -1
  16. package/dist/client-B57KWPQx.js +4005 -0
  17. package/dist/command-dispatch-BpduNGVf.js +21 -0
  18. package/dist/{command-formatters-DSbGMXA0.js → command-formatters-lxlkNZgU.js} +4 -3
  19. package/dist/{command-handlers-DOJvGv6-.js → command-handlers-tiL9iWj7.js} +788 -135
  20. package/dist/command-rpc-CR5EOEZX.js +233 -0
  21. package/dist/{compact-Y_xBqrHN.js → compact-B_H3AOd7.js} +19 -14
  22. package/dist/config-oIORaQ5T.js +106 -0
  23. package/dist/{config-CyapYSji.js → config-options-CXMq1T-C.js} +205 -593
  24. package/dist/config-runtime-D0zGNIHu.js +11 -0
  25. package/dist/{config-utils-C57JiJrU.js → config-utils-DujwEnhg.js} +2 -4
  26. package/dist/conversation-binding-DsB4-O7U.js +900 -0
  27. package/dist/{plugin-marketplace-discovery-B7gHXJ3d.js → conversation-control-CtUu1b3m.js} +11 -143
  28. package/dist/doctor-contract-api.js +5 -5
  29. package/dist/{dynamic-tools-BwpvTxaX.js → dynamic-tools-CmN5RAip.js} +133 -76
  30. package/dist/{effective-mcp-catalog-CY9Jn4bA.js → effective-mcp-catalog-Bd73bqA8.js} +3 -3
  31. package/dist/{elicitation-input-DMkeki8d.js → elicitation-input-DPoK8F7w.js} +8 -22
  32. package/dist/ephemeral-turn-D78_VmzO.js +101 -0
  33. package/dist/{event-projector-assistant-message-B9kp6iGC.js → event-projector-assistant-message-BmBM4qBV.js} +12 -25
  34. package/dist/event-projector-items-5VhsECCO.js +200 -0
  35. package/dist/event-projector-usage-BfXmpOec.js +102 -0
  36. package/dist/{harness-Czh2Sdoc.js → harness-C7rRa7bm.js} +48 -24
  37. package/dist/harness.js +1 -1
  38. package/dist/history-rejection-B4nOXNXF.js +13 -0
  39. package/dist/incognito-session-uhrBF6wJ.js +15 -0
  40. package/dist/index.js +406 -2915
  41. package/dist/inference-context-Dr_mzvk4.js +94 -0
  42. package/dist/inference-proxy-HGXKUIre.js +311 -0
  43. package/dist/{isolated-completion-CRh-51AK.js → isolated-completion-DWVb5U2J.js} +7 -4
  44. package/dist/launch-args-RXQwn8zV.js +90 -0
  45. package/dist/{managed-binary-DcpnJF9x.js → managed-binary-D22rNEcR.js} +13 -103
  46. package/dist/managed-thread-store-D1t5jh3G.js +66 -0
  47. package/dist/media-understanding-provider.js +4 -1
  48. package/dist/migration-provider-api.js +2 -0
  49. package/dist/{model-catalog-DT5vo6qo.js → model-catalog-Dq2n8f_p.js} +6 -5
  50. package/dist/{models-CcrgSMQR.js → models-PCKOim-h.js} +3 -3
  51. package/dist/native-execution-policy-umd0tgh4.js +128 -0
  52. package/dist/native-subagent-history-DjtPloaU.js +140 -0
  53. package/dist/native-subagent-history-owner-Pcp7JuVF.js +34 -0
  54. package/dist/{native-subagent-monitor-B3bvQGcg.js → native-subagent-monitor-fQ7eIXEf.js} +115 -460
  55. package/dist/native-subagent-task-ids-BzTdT0Uw.js +387 -0
  56. package/dist/node-cli-sessions-DKaOmVUh.js +527 -0
  57. package/dist/{node-exec-server.runtime-nfbUOtUB.js → node-exec-server.runtime-Cl2vapEi.js} +55 -24
  58. package/dist/plan-7uG-Fp36.js +947 -0
  59. package/dist/plugin-activation-BYQculil.js +138 -0
  60. package/dist/{thread-resume-BLgqkUc1.js → plugin-app-cache-key-d0eKxy7b.js} +4 -52
  61. package/dist/{plugin-approval-roundtrip-aQVdyL5g.js → plugin-approval-roundtrip-Bz3FT8W5.js} +1 -1
  62. package/dist/plugin-inventory-oL4Na1ZG.js +328 -0
  63. package/dist/plugin-marketplace-discovery-P-Vndfqq.js +137 -0
  64. package/dist/{plugin-metadata-cache-BwCLTY_U.js → plugin-metadata-cache-ClPJpRio.js} +17 -9
  65. package/dist/protocol-5bh1G-H7.js +275 -0
  66. package/dist/provider-MQ8PVkuE.js +50 -0
  67. package/dist/{provider-capabilities-BpG9Ltc5.js → provider-capabilities-BvCUL69A.js} +2 -2
  68. package/dist/{rate-limits-Fx_l4eNa.js → rate-limits-CBMmWBr9.js} +1 -1
  69. package/dist/request-B7hEkBGq.js +212 -0
  70. package/dist/rpc-error-ttN_QjEm.js +30 -0
  71. package/dist/{run-attempt-BzthFQSM.js → run-attempt-CvsAAGa0.js} +664 -377
  72. package/dist/{runtime-artifact-Bh_gf6-t.js → runtime-artifact-BJ0rXBZ_.js} +27 -27
  73. package/dist/sandbox-guard-BxgyoM8M.js +166 -0
  74. package/dist/{session-binding-4Ki04sW-.js → session-binding-CI8UuilT.js} +30 -48
  75. package/dist/{session-binding-record-CyaXZvTe.js → session-binding-record-Bcvslnhf.js} +12 -26
  76. package/dist/session-catalog-adoption-tcZi1IfX.js +251 -0
  77. package/dist/session-catalog-archive-CwKg8Xz2.js +56 -0
  78. package/dist/session-catalog-ct-AH01I.js +1477 -0
  79. package/dist/session-catalog-home-id-CwhLdC03.js +18 -0
  80. package/dist/session-catalog-node-adoption-B1tgDW-m.js +182 -0
  81. package/dist/session-catalog-node-continue-Ci-DXyJP.js +238 -0
  82. package/dist/session-catalog-provenance-D-dIfRAH.js +96 -0
  83. package/dist/{session-cli-BjLhpmS1.js → session-cli-DNN_jhGc.js} +3 -2
  84. package/dist/{session-history-DWmMqiqW.js → session-history-Cz-tOOYj.js} +6 -3
  85. package/dist/{session-upstream-marker-DReTpGz6.js → session-history-import-DwyijFI6.js} +5 -50
  86. package/dist/{session-history-read-LHldwvyh.js → session-history-read-cxPUxyVV.js} +21 -7
  87. package/dist/session-history-worker-runtime.js +18 -6
  88. package/dist/session-history.worker-BeK1YOyT.js +378 -0
  89. package/dist/session-history.worker.js +1 -1
  90. package/dist/{session-initialization-BCFVnLL4.js → session-initialization-Ct0_Hzmg.js} +2 -2
  91. package/dist/{session-permission-policy-BaueHmSj.js → session-permission-policy-BBmXA8Eg.js} +4 -7
  92. package/dist/{session-retirement-DNdmYdFc.js → session-retirement-B2YfbAAT.js} +6 -5
  93. package/dist/session-upstream-marker-D15C9NHp.js +46 -0
  94. package/dist/{settled-turn-context-BOM3Y1pl.js → settled-turn-context-Du6gdUDd.js} +9 -9
  95. package/dist/{settled-turn-finalizer-BI-b1sry.js → settled-turn-finalizer-Dn91stmc.js} +8 -7
  96. package/dist/shared-client-CscigXXL.js +3109 -0
  97. package/dist/{side-question-B6DWAw1A.js → side-question-BGMJQf4U.js} +65 -170
  98. package/dist/source-CElXU0Oy.js +518 -0
  99. package/dist/thread-archive-guard-DfpBr-Sz.js +53 -0
  100. package/dist/thread-history-page-D0JIp48V.js +361 -0
  101. package/dist/{thread-lifecycle-DPK30jad.js → thread-lifecycle-DXl1-I6b.js} +187 -639
  102. package/dist/{thread-ownership-CbucAmmp.js → thread-ownership-BsDRTsyp.js} +13 -15
  103. package/dist/thread-policy-BuEQfE0g.js +54 -0
  104. package/dist/thread-resume-DsDOZpFg.js +52 -0
  105. package/dist/timeout-BVw8aaM1.js +33 -0
  106. package/dist/transcript-history-projection-v17wXgdK.js +238 -0
  107. package/dist/{transcript-mirror-_njEB84z.js → transcript-mirror-C5CKgNy6.js} +50 -260
  108. package/dist/{transcript-mirror-attestation-Byl34PC-.js → transcript-mirror-attestation-DibE0krH.js} +17 -4
  109. package/dist/{transport-stdio-CzTngV0j.js → transport-stdio-BGjHoYLr.js} +73 -43
  110. package/dist/{upstream-session-fork-1fwbNKzQ.js → upstream-session-fork-BZerMte_.js} +27 -19
  111. package/dist/{usage-i9fv5-4m.js → usage-tCk-mg_x.js} +4 -3
  112. package/dist/version-omm6IPI3.js +12 -0
  113. package/dist/{web-search-provider.runtime-DKQn67A7.js → web-search-provider.runtime-B7bGbGWq.js} +3 -3
  114. package/openclaw.plugin.json +23 -1
  115. package/package.json +4 -4
  116. package/dist/request-C8H22rPi.js +0 -475
  117. package/dist/session-catalog-B47uwekb.js +0 -3272
  118. package/dist/session-history.worker-zZVcx0ME.js +0 -267
  119. package/dist/shared-client-CKhX2kFt.js +0 -7505
  120. package/dist/thread-policy-CTalhWFy.js +0 -105
@@ -0,0 +1,137 @@
1
+ import { asOptionalRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
2
+ //#region extensions/codex/src/command-authorization.ts
3
+ const CODEX_NATIVE_EXECUTION_AUTH_ERROR = "Only an owner or operator.admin can control Codex native execution.";
4
+ const CODEX_HOST_INSPECTION_AUTH_ERROR = "Only an owner or operator.admin can inspect Codex host state.";
5
+ const CODEX_FULL_PERMISSIONS_AUTH_ERROR = "Full Codex permissions require operator.admin. Choose Admin in the Control UI permission picker, or use an admin-authenticated CLI.";
6
+ function hasCodexAdminScope(ctx) {
7
+ return ctx.gatewayClientScopes?.includes("operator.admin") === true;
8
+ }
9
+ function canMutateCodexHost(ctx) {
10
+ return ctx.senderIsOwner === true || hasCodexAdminScope(ctx);
11
+ }
12
+ //#endregion
13
+ //#region extensions/codex/src/plugin-marketplace-discovery.ts
14
+ /** Read-only discovery of Codex-owned local, curated, and remote plugin marketplaces. */
15
+ const PLUGIN_NAME_PATTERN = /^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)*$/;
16
+ const MARKETPLACE_NAME_PATTERN = /^[A-Za-z0-9_-]+$/;
17
+ const MAX_PLUGIN_METADATA_LENGTH = 160;
18
+ const SUPPLEMENTAL_MARKETPLACE_KINDS = [
19
+ "workspace-directory",
20
+ "shared-with-me",
21
+ "created-by-me-remote",
22
+ "vertical"
23
+ ];
24
+ function filterCodexMarketplacePlugins(plugins, query, marketplace) {
25
+ const normalizedQuery = query.trim().toLowerCase();
26
+ return plugins.filter((plugin) => (!marketplace || plugin.marketplaceName === marketplace) && (!normalizedQuery || `${plugin.id} ${plugin.displayName ?? ""} ${plugin.developerName ?? ""} ${plugin.description ?? ""}`.toLowerCase().includes(normalizedQuery)));
27
+ }
28
+ /** Validates the same identifier segments required by Codex's stable PluginId parser. */
29
+ function parseCodexPluginMarketplaceId(value) {
30
+ const separator = value.lastIndexOf("@");
31
+ if (separator <= 0 || separator === value.length - 1) return;
32
+ const pluginName = value.slice(0, separator);
33
+ const marketplaceName = value.slice(separator + 1);
34
+ return PLUGIN_NAME_PATTERN.test(pluginName) && MARKETPLACE_NAME_PATTERN.test(marketplaceName) ? {
35
+ pluginName,
36
+ marketplaceName
37
+ } : void 0;
38
+ }
39
+ /** Lists local/global first and separately requests workspace, shared, and personal catalogs. */
40
+ async function discoverCodexMarketplacePlugins(params) {
41
+ const requestParams = { cwds: [params.workspaceDir] };
42
+ const primary = await params.request(requestParams);
43
+ const warnings = (primary.marketplaceLoadErrors ?? []).map((error) => boundedCatalogText(error.message));
44
+ const marketplaces = [...primary.marketplaces];
45
+ try {
46
+ const supplemental = await params.request({
47
+ ...requestParams,
48
+ marketplaceKinds: [...SUPPLEMENTAL_MARKETPLACE_KINDS]
49
+ });
50
+ marketplaces.push(...supplemental.marketplaces);
51
+ warnings.push(...(supplemental.marketplaceLoadErrors ?? []).map((error) => boundedCatalogText(error.message)));
52
+ } catch (error) {
53
+ let recoveredSupplementalMarketplace = false;
54
+ for (const kind of SUPPLEMENTAL_MARKETPLACE_KINDS) try {
55
+ const supplemental = await params.request({
56
+ ...requestParams,
57
+ marketplaceKinds: [kind]
58
+ });
59
+ marketplaces.push(...supplemental.marketplaces);
60
+ recoveredSupplementalMarketplace ||= supplemental.marketplaces.length > 0;
61
+ warnings.push(...(supplemental.marketplaceLoadErrors ?? []).map((loadError) => boundedCatalogText(loadError.message)));
62
+ } catch (kindError) {
63
+ warnings.push(boundedCatalogText(`${kind} marketplace unavailable: ${kindError instanceof Error ? kindError.message : String(kindError)}`));
64
+ }
65
+ if (!recoveredSupplementalMarketplace && warnings.length === 0) warnings.push(boundedCatalogText(`Additional marketplaces could not be listed: ${error instanceof Error ? error.message : String(error)}`));
66
+ }
67
+ const discovered = /* @__PURE__ */ new Map();
68
+ const ambiguous = /* @__PURE__ */ new Set();
69
+ for (const marketplace of marketplaces) {
70
+ if (!MARKETPLACE_NAME_PATTERN.test(marketplace.name)) continue;
71
+ for (const summary of marketplace.plugins) {
72
+ const pluginName = pluginSlug(summary, marketplace.name);
73
+ if (!pluginName) continue;
74
+ const id = `${pluginName}@${marketplace.name}`;
75
+ if (ambiguous.has(id)) continue;
76
+ const previous = discovered.get(id);
77
+ const pluginInterface = asOptionalRecord(summary.interface);
78
+ const next = {
79
+ id,
80
+ pluginName,
81
+ marketplaceName: marketplace.name,
82
+ displayName: boundedCatalogText(pluginInterface?.displayName) || void 0,
83
+ developerName: boundedCatalogText(pluginInterface?.developerName) || void 0,
84
+ description: boundedCatalogText(pluginInterface?.shortDescription) || boundedCatalogText(pluginInterface?.longDescription) || void 0,
85
+ installed: summary.installed,
86
+ enabled: summary.enabled,
87
+ available: summary.availability !== "DISABLED_BY_ADMIN" && summary.installPolicy !== "NOT_AVAILABLE",
88
+ ...summary.installPolicy ? { installPolicy: summary.installPolicy } : {},
89
+ ...summary.authPolicy ? { authPolicy: summary.authPolicy } : {},
90
+ ...marketplace.path ? { marketplacePath: marketplace.path } : {},
91
+ ...summary.remotePluginId?.trim() ? {
92
+ remotePluginId: summary.remotePluginId.trim(),
93
+ mustShowInstallationInterstitial: summary.mustShowInstallationInterstitial ?? null
94
+ } : {},
95
+ summaryId: summary.id
96
+ };
97
+ if (previous && (previous.marketplacePath !== next.marketplacePath || previous.remotePluginId !== next.remotePluginId)) {
98
+ discovered.delete(id);
99
+ ambiguous.add(id);
100
+ warnings.push(`Multiple discovered plugins share ${id}; installation requires a unique identity.`);
101
+ continue;
102
+ }
103
+ if (!previous) discovered.set(id, next);
104
+ else {
105
+ const preferred = !previous.installed && next.installed || !previous.enabled && next.installed && next.enabled ? next : previous;
106
+ discovered.set(id, {
107
+ ...preferred,
108
+ available: previous.available && next.available,
109
+ ...preferred.remotePluginId ? { mustShowInstallationInterstitial: previous.mustShowInstallationInterstitial === true || next.mustShowInstallationInterstitial === true ? true : previous.mustShowInstallationInterstitial === false && next.mustShowInstallationInterstitial === false ? false : null } : {},
110
+ ...previous.installPolicy === "NOT_AVAILABLE" || next.installPolicy === "NOT_AVAILABLE" ? { installPolicy: "NOT_AVAILABLE" } : {}
111
+ });
112
+ }
113
+ }
114
+ }
115
+ return {
116
+ plugins: [...discovered.values()].toSorted((left, right) => left.id.localeCompare(right.id)),
117
+ warnings
118
+ };
119
+ }
120
+ function pluginSlug(summary, marketplaceName) {
121
+ const qualified = parseCodexPluginMarketplaceId(summary.id);
122
+ if (qualified?.marketplaceName === marketplaceName) return qualified.pluginName;
123
+ const identitySegment = summary.id.split("/").at(-1);
124
+ if (identitySegment && PLUGIN_NAME_PATTERN.test(identitySegment)) return identitySegment;
125
+ return PLUGIN_NAME_PATTERN.test(summary.name) ? summary.name : void 0;
126
+ }
127
+ function boundedCatalogText(value) {
128
+ if (typeof value !== "string") return "";
129
+ let sanitized = "";
130
+ for (const character of value) {
131
+ const codePoint = character.codePointAt(0);
132
+ sanitized += codePoint !== void 0 && (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) ? " " : character;
133
+ }
134
+ return sanitized.replace(/\s+/g, " ").trim().slice(0, MAX_PLUGIN_METADATA_LENGTH);
135
+ }
136
+ //#endregion
137
+ export { CODEX_HOST_INSPECTION_AUTH_ERROR as a, hasCodexAdminScope as c, CODEX_FULL_PERMISSIONS_AUTH_ERROR as i, filterCodexMarketplacePlugins as n, CODEX_NATIVE_EXECUTION_AUTH_ERROR as o, parseCodexPluginMarketplaceId as r, canMutateCodexHost as s, discoverCodexMarketplacePlugins as t };
@@ -1,11 +1,15 @@
1
- import { M as resolveCodexAppServerHomeDir, i as resolveCodexAppServerRuntimeOptions, o as resolveCodexComputerUseConfig } from "./config-CyapYSji.js";
2
- import { B as isCodexAppServerIndeterminateRequestCancellationError, D as acquireCodexNativeConfigFence, Jt as assertNotSymlink, S as waitForCodexAppServerClientDesktopGenerationDrain, V as isCodexAppServerIndeterminateTransportError, c as getLeasedSharedCodexAppServerClient, d as readCodexAppServerClientDesktopGeneration, g as resolveCodexNativeConfigFenceKey, h as releaseLeasedSharedCodexAppServerClient, p as readCodexAppServerClientProcessIdentity, qt as resolveCodexManagedBundledMarketplacePath, t as assertCodexAppServerClientStartSelectionCurrent, u as isCodexAppServerStartSelectionChangedError, z as isCodexAppServerConnectionClosedError, zt as reconcileCodexComputerUseStartArtifacts } from "./shared-client-CKhX2kFt.js";
3
- import { c as resolveFirstExistingMacOSDesktopCodexBundledMarketplacePath, t as isManagedCodexDesktopCommand, u as resolveMacOSDesktopCodexBundledMarketplaceCandidates } from "./managed-binary-DcpnJF9x.js";
4
- import { i as requestCodexAppServerJson } from "./request-C8H22rPi.js";
5
- import { n as describeControlFailure } from "./capabilities-B1mgvpP8.js";
6
- import fs from "node:fs/promises";
7
- import path from "node:path";
1
+ import { o as resolveCodexComputerUseConfig } from "./config-options-CXMq1T-C.js";
2
+ import { s as resolveCodexAppServerHomeDir } from "./protocol-5bh1G-H7.js";
3
+ import { c as isCodexAppServerIndeterminateTransportError, o as isCodexAppServerConnectionClosedError, s as isCodexAppServerIndeterminateRequestCancellationError } from "./client-B57KWPQx.js";
4
+ import { l as resolveMacOSDesktopCodexBundledMarketplaceCandidates, s as resolveFirstExistingMacOSDesktopCodexBundledMarketplacePath, t as isManagedCodexDesktopCommand } from "./managed-binary-D22rNEcR.js";
5
+ import { n as describeControlFailure } from "./capabilities-8vx68WLH.js";
6
+ import { i as requestCodexAppServerJson } from "./request-B7hEkBGq.js";
7
+ import "./config-oIORaQ5T.js";
8
+ import { n as resolveCodexAppServerRuntimeOptions } from "./config-runtime-D0zGNIHu.js";
9
+ import { $ as reconcileCodexComputerUseStartArtifacts, T as acquireCodexNativeConfigFence, b as waitForCodexAppServerClientDesktopGenerationDrain, c as getLeasedSharedCodexAppServerClient, d as readCodexAppServerClientDesktopGeneration, g as resolveCodexNativeConfigFenceKey, h as releaseLeasedSharedCodexAppServerClient, nt as resolveCodexManagedBundledMarketplacePath, p as readCodexAppServerClientProcessIdentity, rt as assertNotSymlink, t as assertCodexAppServerClientStartSelectionCurrent, u as isCodexAppServerStartSelectionChangedError } from "./shared-client-CscigXXL.js";
8
10
  import { existsSync } from "node:fs";
11
+ import path from "node:path";
12
+ import fs$1 from "node:fs/promises";
9
13
  //#region extensions/codex/src/app-server/computer-use.ts
10
14
  /**
11
15
  * Computer Use plugin/MCP readiness checks and optional install flow for Codex
@@ -232,7 +236,7 @@ async function resolveExplicitManagedComputerUseInstallContext(params) {
232
236
  const desktopGeneration = readCodexAppServerClientDesktopGeneration(params.client);
233
237
  if (!desktopGeneration) throw new Error("Codex Computer Use install requires a desktop-generation-bound client; reconnect and retry.");
234
238
  const expectedHome = resolveCodexAppServerHomeDir(params.agentDir);
235
- const [actualRealHome, expectedRealHome] = await Promise.all([fs.realpath(codexHome).catch(() => void 0), fs.realpath(expectedHome).catch(() => void 0)]);
239
+ const [actualRealHome, expectedRealHome] = await Promise.all([fs$1.realpath(codexHome).catch(() => void 0), fs$1.realpath(expectedHome).catch(() => void 0)]);
236
240
  if (!actualRealHome || actualRealHome !== expectedRealHome) return;
237
241
  return {
238
242
  client: params.client,
@@ -245,7 +249,7 @@ async function resolveExplicitManagedComputerUseInstallContext(params) {
245
249
  async function resolveClientManagedBundledMarketplacePath(client, agentDir) {
246
250
  const codexHome = client?.getRuntimeIdentity()?.codexHome;
247
251
  if (!codexHome || !agentDir) return;
248
- const [actualRealHome, expectedRealHome] = await Promise.all([fs.realpath(codexHome).catch(() => void 0), fs.realpath(resolveCodexAppServerHomeDir(agentDir)).catch(() => void 0)]);
252
+ const [actualRealHome, expectedRealHome] = await Promise.all([fs$1.realpath(codexHome).catch(() => void 0), fs$1.realpath(resolveCodexAppServerHomeDir(agentDir)).catch(() => void 0)]);
249
253
  if (!actualRealHome || actualRealHome !== expectedRealHome) return;
250
254
  const managedPath = resolveCodexManagedBundledMarketplacePath(codexHome);
251
255
  return existsSync(managedPath) ? managedPath : void 0;
@@ -441,6 +445,7 @@ async function resolveMarketplaceRef(params) {
441
445
  candidates = await listComputerUseMarketplaceCandidates(params.request, params.config);
442
446
  }
443
447
  const waitUntil = marketplaceDiscoveryWaitUntil(params);
448
+ if (candidates.length === 0 && waitUntil > Date.now() && await codexNativePluginsDisabled(params.request)) return { message: "Codex native plugin support is disabled (features.plugins = false). Enable it in the Codex config, then run /codex computer-use install." };
444
449
  while (candidates.length === 0) {
445
450
  if (Date.now() >= waitUntil) break;
446
451
  await delay(Math.min(CURATED_MARKETPLACE_POLL_INTERVAL_MS, waitUntil - Date.now()), params.signal);
@@ -473,6 +478,9 @@ async function migrateLegacyBundledMarketplaceSource(params) {
473
478
  async function listComputerUseMarketplaceCandidates(request, config) {
474
479
  return findComputerUseMarketplaces(await request("plugin/list", { cwds: [] }), config.pluginName);
475
480
  }
481
+ async function codexNativePluginsDisabled(request) {
482
+ return (await request("experimentalFeature/list", {})).data.find(({ name }) => name === "plugins")?.enabled === false;
483
+ }
476
484
  function blockUnsafeAutoInstallStatus(config) {
477
485
  if (!config.marketplaceSource) return;
478
486
  return unavailableStatus(config, "auto_install_blocked", "Computer Use auto-install only uses marketplaces Codex app-server has already discovered. Run /codex computer-use install to install from a configured marketplace source.");
@@ -0,0 +1,275 @@
1
+ import { i as normalizeCodexServiceTier, m as CODEX_PLUGIN_MARKETPLACE_NAME_PATTERN } from "./config-utils-DujwEnhg.js";
2
+ import { n as normalizeCodexAppServerArgs } from "./launch-args-RXQwn8zV.js";
3
+ import { asNullableRecord, isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
+ import { z } from "zod";
5
+ import { buildSecretInputSchema } from "openclaw/plugin-sdk/secret-input";
6
+ import { detectWindowsSpawnCommandInlineArgs } from "openclaw/plugin-sdk/windows-spawn";
7
+ import path from "node:path";
8
+ import { homedir } from "node:os";
9
+ //#region extensions/codex/src/app-server/session-discovery-config.ts
10
+ const codexSessionCatalogHomeSchema = z.union([z.string().trim().min(1), z.object({
11
+ path: z.string().trim().min(1),
12
+ label: z.string().trim().min(1).optional()
13
+ }).strict()]);
14
+ const codexSessionCatalogConfigSchema = z.object({
15
+ enabled: z.boolean().optional(),
16
+ homes: z.array(codexSessionCatalogHomeSchema).optional()
17
+ }).strict();
18
+ const codexDiscoveryConfigSchema = z.object({
19
+ enabled: z.boolean().optional(),
20
+ timeoutMs: z.number().positive().optional()
21
+ }).strict();
22
+ //#endregion
23
+ //#region extensions/codex/src/app-server/config-parsing.ts
24
+ const DEFAULT_CODEX_COMPUTER_USE_PLUGIN_NAME = "computer-use";
25
+ const DEFAULT_CODEX_COMPUTER_USE_MCP_SERVER_NAME = "computer-use";
26
+ const DEFAULT_CODEX_COMPUTER_USE_MARKETPLACE_DISCOVERY_TIMEOUT_MS = 6e4;
27
+ const DEFAULT_CODEX_COMPUTER_USE_LIVE_TEST_TIMEOUT_MS = 6e4;
28
+ const DEFAULT_CODEX_COMPUTER_USE_TOOL_CALL_TIMEOUT_MS = 6e4;
29
+ const DEFAULT_CODEX_APP_SERVER_NETWORK_PROXY_PROFILE_PREFIX = "openclaw-network";
30
+ const codexAppServerTransportSchema = z.enum([
31
+ "stdio",
32
+ "websocket",
33
+ "unix"
34
+ ]);
35
+ const codexAppServerHomeScopeSchema = z.enum(["agent", "user"]);
36
+ const SecretInputSchema = buildSecretInputSchema();
37
+ const codexAppServerPolicyModeSchema = z.enum(["yolo", "guardian"]);
38
+ const codexAppServerApprovalPolicySchema = z.preprocess((value) => value === "on-failure" ? "on-request" : value, z.enum(["never", "on-request"]));
39
+ const codexAppServerSandboxSchema = z.enum([
40
+ "read-only",
41
+ "workspace-write",
42
+ "danger-full-access"
43
+ ]);
44
+ const codexAppServerApprovalsReviewerSchema = z.enum([
45
+ "user",
46
+ "auto_review",
47
+ "guardian_subagent"
48
+ ]);
49
+ const codexDynamicToolsLoadingSchema = z.enum(["searchable", "direct"]);
50
+ const codexComputerUseHealthIntervalSchema = z.union([
51
+ z.literal(30),
52
+ z.literal(60),
53
+ z.literal(120),
54
+ z.literal(240)
55
+ ]);
56
+ const codexComputerUsePluginCacheModeSchema = z.enum(["shared", "independent"]);
57
+ const codexPluginDestructivePolicySchema = z.union([
58
+ z.boolean(),
59
+ z.literal("auto"),
60
+ z.literal("ask")
61
+ ]);
62
+ const codexAppServerServiceTierSchema = z.preprocess((value) => value === null ? null : normalizeCodexServiceTier(value), z.string().trim().min(1).nullable().optional()).optional();
63
+ const codexAppServerExperimentalSchema = z.object({ sandboxExecServer: z.boolean().optional() }).strict();
64
+ const codexAppServerRemoteWorkspaceRootSchema = z.string().trim().min(1);
65
+ const codexAppServerNetworkProxyDomainPermissionSchema = z.enum(["allow", "deny"]);
66
+ const codexAppServerNetworkProxyUnixSocketPermissionSchema = z.enum(["allow", "none"]);
67
+ const codexAppServerNetworkProxySchema = z.object({
68
+ enabled: z.boolean().optional(),
69
+ profileName: z.string().trim().min(1).optional(),
70
+ baseProfile: z.enum(["read-only", "workspace"]).optional(),
71
+ mode: z.enum(["limited", "full"]).optional(),
72
+ domains: z.record(z.string(), codexAppServerNetworkProxyDomainPermissionSchema).optional(),
73
+ unixSockets: z.record(z.string(), codexAppServerNetworkProxyUnixSocketPermissionSchema).optional(),
74
+ proxyUrl: z.string().trim().min(1).optional(),
75
+ socksUrl: z.string().trim().min(1).optional(),
76
+ enableSocks5: z.boolean().optional(),
77
+ enableSocks5Udp: z.boolean().optional(),
78
+ allowUpstreamProxy: z.boolean().optional(),
79
+ allowLocalBinding: z.boolean().optional(),
80
+ dangerouslyAllowNonLoopbackProxy: z.boolean().optional(),
81
+ dangerouslyAllowAllUnixSockets: z.boolean().optional()
82
+ }).strict();
83
+ const codexPluginEntryConfigSchema = z.object({
84
+ enabled: z.boolean().optional(),
85
+ marketplaceName: z.string().regex(CODEX_PLUGIN_MARKETPLACE_NAME_PATTERN).optional(),
86
+ pluginName: z.string().trim().min(1).optional(),
87
+ allow_destructive_actions: codexPluginDestructivePolicySchema.optional()
88
+ }).strict();
89
+ const codexPluginsConfigSchema = z.object({
90
+ enabled: z.boolean().optional(),
91
+ allow_all_plugins: z.boolean().optional(),
92
+ allow_destructive_actions: codexPluginDestructivePolicySchema.optional(),
93
+ plugins: z.record(z.string(), codexPluginEntryConfigSchema).optional()
94
+ }).strict();
95
+ const codexSupervisionEndpointSchema = z.union([z.object({
96
+ id: z.string().optional(),
97
+ label: z.string().optional(),
98
+ transport: z.literal("stdio-proxy").optional(),
99
+ command: z.string().optional(),
100
+ args: z.array(z.string()).optional(),
101
+ cwd: z.string().optional()
102
+ }).strict(), z.object({
103
+ id: z.string().optional(),
104
+ label: z.string().optional(),
105
+ transport: z.literal("websocket"),
106
+ url: z.string(),
107
+ authTokenEnv: z.string().optional()
108
+ }).strict()]);
109
+ const codexSupervisionConfigSchema = z.object({
110
+ enabled: z.boolean().optional(),
111
+ endpoints: z.array(codexSupervisionEndpointSchema).optional(),
112
+ allowRawTranscripts: z.boolean().optional(),
113
+ allowWriteControls: z.boolean().optional()
114
+ }).strict();
115
+ const codexPluginConfigSchema = z.object({
116
+ codexDynamicToolsLoading: codexDynamicToolsLoadingSchema.optional(),
117
+ codexDynamicToolsExclude: z.array(z.string()).optional(),
118
+ sessionCatalog: codexSessionCatalogConfigSchema.optional(),
119
+ discovery: codexDiscoveryConfigSchema.optional(),
120
+ computerUse: z.object({
121
+ enabled: z.boolean().optional(),
122
+ autoInstall: z.boolean().optional(),
123
+ marketplaceDiscoveryTimeoutMs: z.number().positive().optional(),
124
+ liveTestTimeoutMs: z.number().positive().optional(),
125
+ toolCallTimeoutMs: z.number().positive().optional(),
126
+ healthCheckEnabled: z.boolean().optional(),
127
+ healthCheckIntervalMinutes: codexComputerUseHealthIntervalSchema.optional(),
128
+ pluginCacheMode: codexComputerUsePluginCacheModeSchema.optional(),
129
+ strictReadiness: z.boolean().optional(),
130
+ autoRepair: z.boolean().optional(),
131
+ marketplaceSource: z.string().optional(),
132
+ marketplacePath: z.string().optional(),
133
+ marketplaceName: z.string().optional(),
134
+ pluginName: z.string().optional(),
135
+ mcpServerName: z.string().optional()
136
+ }).strict().optional(),
137
+ codexPlugins: z.unknown().optional(),
138
+ supervision: codexSupervisionConfigSchema.optional(),
139
+ appServer: z.object({
140
+ mode: codexAppServerPolicyModeSchema.optional(),
141
+ transport: codexAppServerTransportSchema.optional(),
142
+ homeScope: codexAppServerHomeScopeSchema.optional(),
143
+ command: z.string().optional(),
144
+ args: z.union([z.array(z.string()), z.string()]).optional(),
145
+ url: z.string().optional(),
146
+ authToken: SecretInputSchema.optional(),
147
+ headers: z.record(z.string(), SecretInputSchema).optional(),
148
+ clearEnv: z.array(z.string()).optional(),
149
+ remoteWorkspaceRoot: codexAppServerRemoteWorkspaceRootSchema.optional(),
150
+ codeModeOnly: z.boolean().optional(),
151
+ loopDetectionPreToolUseRelay: z.boolean().optional(),
152
+ requestTimeoutMs: z.number().positive().optional(),
153
+ approvalPolicy: codexAppServerApprovalPolicySchema.optional(),
154
+ sandbox: codexAppServerSandboxSchema.optional(),
155
+ approvalsReviewer: codexAppServerApprovalsReviewerSchema.optional(),
156
+ serviceTier: codexAppServerServiceTierSchema,
157
+ networkProxy: codexAppServerNetworkProxySchema.optional(),
158
+ defaultWorkspaceDir: z.string().optional(),
159
+ experimental: codexAppServerExperimentalSchema.optional()
160
+ }).strict().optional()
161
+ }).strict();
162
+ function readCodexPluginConfig(value) {
163
+ if (asNullableRecord(asNullableRecord(value)?.appServer)?.approvalPolicy === "untrusted") throw new Error("plugins.entries.codex.config.appServer.approvalPolicy=\"untrusted\" is retired; run \"openclaw doctor --fix\" to migrate it to \"on-request\".");
164
+ const parsed = codexPluginConfigSchema.safeParse(value);
165
+ if (!parsed.success) return {};
166
+ const { codexPlugins: rawCodexPlugins, ...config } = parsed.data;
167
+ const plugins = codexPluginsConfigSchema.safeParse(rawCodexPlugins);
168
+ if (!plugins.success) return config;
169
+ return {
170
+ ...config,
171
+ ...plugins.data ? { codexPlugins: plugins.data } : {}
172
+ };
173
+ }
174
+ function isCodexSandboxExecServerEnabled(pluginConfig, sandbox) {
175
+ return isCodexRemoteExecPlacementSandbox(sandbox) || readCodexPluginConfig(pluginConfig).appServer?.experimental?.sandboxExecServer === true;
176
+ }
177
+ function isCodexRemoteExecPlacementSandbox(sandbox) {
178
+ return typeof sandbox === "object" && sandbox !== null && "placementExecutionMode" in sandbox && sandbox.placementExecutionMode === "remote-exec";
179
+ }
180
+ function isCodexPairedNodeRemoteExecPlacementSandbox(sandbox) {
181
+ return isCodexRemoteExecPlacementSandbox(sandbox) && typeof sandbox === "object" && sandbox !== null && "placementNodeId" in sandbox && typeof sandbox.placementNodeId === "string" && sandbox.placementNodeId.length > 0;
182
+ }
183
+ function assertCodexAppServerCommandHasNoInlineArgs(params) {
184
+ const inlineArgs = detectWindowsSpawnCommandInlineArgs(params.command);
185
+ if (!inlineArgs) return;
186
+ const sourceLabel = params.source === "env" ? "OPENCLAW_CODEX_APP_SERVER_BIN" : "plugins.entries.codex.config.appServer.command";
187
+ const argsLabel = params.source === "env" ? "OPENCLAW_CODEX_APP_SERVER_ARGS" : "plugins.entries.codex.config.appServer.args";
188
+ throw new Error(`${sourceLabel} must be only the Codex app-server executable path; "${inlineArgs.executable}" was configured with inline arguments "${inlineArgs.arguments}". Move those arguments to ${argsLabel}, or remove the override to use the managed Codex startup path.`);
189
+ }
190
+ function resolveCodexPluginsPolicy(pluginConfig) {
191
+ const config = readCodexPluginConfig(pluginConfig).codexPlugins;
192
+ const configured = config !== void 0;
193
+ const enabled = config?.enabled === true;
194
+ const destructivePolicy = resolveCodexPluginDestructivePolicy(config?.allow_destructive_actions ?? true);
195
+ const pluginPolicies = Object.entries(config?.plugins ?? {}).flatMap(([configKey, entry]) => {
196
+ if (!isCodexPluginMarketplaceName(entry.marketplaceName) || !entry.pluginName) return [];
197
+ const entryDestructivePolicy = resolveCodexPluginDestructivePolicy(entry.allow_destructive_actions ?? config?.allow_destructive_actions ?? true);
198
+ return [{
199
+ configKey,
200
+ marketplaceName: entry.marketplaceName,
201
+ pluginName: entry.pluginName,
202
+ enabled: enabled && entry.enabled !== false,
203
+ allowDestructiveActions: entryDestructivePolicy.allowDestructiveActions,
204
+ destructiveApprovalMode: entryDestructivePolicy.destructiveApprovalMode
205
+ }];
206
+ }).toSorted((left, right) => left.configKey.localeCompare(right.configKey));
207
+ return {
208
+ configured,
209
+ enabled,
210
+ allowAllPlugins: enabled && config?.allow_all_plugins === true,
211
+ allowDestructiveActions: destructivePolicy.allowDestructiveActions,
212
+ destructiveApprovalMode: destructivePolicy.destructiveApprovalMode,
213
+ pluginPolicies
214
+ };
215
+ }
216
+ function isCodexPluginMarketplaceName(value) {
217
+ return typeof value === "string" && CODEX_PLUGIN_MARKETPLACE_NAME_PATTERN.test(value);
218
+ }
219
+ function resolveCodexPluginDestructivePolicy(policy) {
220
+ if (policy === "auto" || policy === "ask") return {
221
+ allowDestructiveActions: true,
222
+ destructiveApprovalMode: policy
223
+ };
224
+ return {
225
+ allowDestructiveActions: policy,
226
+ destructiveApprovalMode: policy ? "allow" : "deny"
227
+ };
228
+ }
229
+ //#endregion
230
+ //#region extensions/codex/src/app-server/auth-start-options.ts
231
+ const CODEX_APP_SERVER_HOME_DIRNAME = "codex-home";
232
+ const CODEX_EPHEMERAL_AUTH_STORE_OVERRIDE = "cli_auth_credentials_store=\"ephemeral\"";
233
+ function resolveCodexAppServerHomeDir(agentDir) {
234
+ return path.join(path.resolve(agentDir), CODEX_APP_SERVER_HOME_DIRNAME);
235
+ }
236
+ /** Resolves the native user Codex home used by Desktop and the CLI. */
237
+ function resolveCodexAppServerUserHomeDir(env = process.env, homedir$1 = homedir) {
238
+ const configured = normalizeOptionalString(env.CODEX_HOME);
239
+ return path.resolve(configured ?? path.join(homedir$1(), ".codex"));
240
+ }
241
+ /** Resolves the local CODEX_HOME used when starting one app-server connection. */
242
+ function resolveCodexAppServerLocalHomeDir(startOptions, agentDir, env = process.env) {
243
+ const configured = startOptions.env?.CODEX_HOME;
244
+ if (configured?.trim()) return configured;
245
+ return startOptions.homeScope === "user" ? resolveCodexAppServerUserHomeDir(env) : resolveCodexAppServerHomeDir(agentDir);
246
+ }
247
+ /** Forces OpenClaw-owned Codex auth to remain process-local. */
248
+ function withEphemeralCodexAuthStore(params) {
249
+ const { startOptions } = params;
250
+ if (!params.preparedAuth && params.authProfileId === null) return startOptions;
251
+ const args = normalizeCodexAppServerArgs(startOptions.args, CODEX_EPHEMERAL_AUTH_STORE_OVERRIDE);
252
+ return args === startOptions.args ? startOptions : {
253
+ ...startOptions,
254
+ args
255
+ };
256
+ }
257
+ //#endregion
258
+ //#region extensions/codex/src/app-server/protocol.ts
259
+ /** Namespace Codex keeps directly model-visible without exposing it to Code Mode guests. */
260
+ const CODEX_OPENCLAW_DIRECT_DYNAMIC_TOOL_NAMESPACE = "openclaw_direct";
261
+ function flattenCodexDynamicToolFunctions(tools) {
262
+ return (tools ?? []).flatMap((tool) => tool.type === "namespace" ? tool.tools : [tool]);
263
+ }
264
+ /** Asserts the experimental beforeTurnId request field before it crosses the app-server boundary. */
265
+ function assertCodexThreadForkParams(value) {
266
+ if (!isRecord(value) || typeof value.threadId !== "string" || !value.threadId.trim() || value.beforeTurnId !== void 0 && value.beforeTurnId !== null && typeof value.beforeTurnId !== "string") throw new Error("Invalid Codex app-server thread/fork params");
267
+ return value;
268
+ }
269
+ const CODEX_INTERACTIVE_THREAD_SOURCE_KINDS = ["cli", "vscode"];
270
+ const CODEX_INTERACTIVE_CUSTOM_THREAD_SOURCES = ["atlas", "chatgpt"];
271
+ function isJsonObject(value) {
272
+ return isRecord(value);
273
+ }
274
+ //#endregion
275
+ export { resolveCodexPluginsPolicy as S, assertCodexAppServerCommandHasNoInlineArgs as _, flattenCodexDynamicToolFunctions as a, isCodexSandboxExecServerEnabled as b, resolveCodexAppServerLocalHomeDir as c, DEFAULT_CODEX_APP_SERVER_NETWORK_PROXY_PROFILE_PREFIX as d, DEFAULT_CODEX_COMPUTER_USE_LIVE_TEST_TIMEOUT_MS as f, DEFAULT_CODEX_COMPUTER_USE_TOOL_CALL_TIMEOUT_MS as g, DEFAULT_CODEX_COMPUTER_USE_PLUGIN_NAME as h, assertCodexThreadForkParams as i, resolveCodexAppServerUserHomeDir as l, DEFAULT_CODEX_COMPUTER_USE_MCP_SERVER_NAME as m, CODEX_INTERACTIVE_THREAD_SOURCE_KINDS as n, isJsonObject as o, DEFAULT_CODEX_COMPUTER_USE_MARKETPLACE_DISCOVERY_TIMEOUT_MS as p, CODEX_OPENCLAW_DIRECT_DYNAMIC_TOOL_NAMESPACE as r, resolveCodexAppServerHomeDir as s, CODEX_INTERACTIVE_CUSTOM_THREAD_SOURCES as t, withEphemeralCodexAuthStore as u, isCodexPairedNodeRemoteExecPlacementSandbox as v, readCodexPluginConfig as x, isCodexRemoteExecPlacementSandbox as y };
@@ -0,0 +1,50 @@
1
+ //#region extensions/codex/src/migration/provider.ts
2
+ function isMemoryOnlyMigration(ctx) {
3
+ return Boolean(ctx.itemKinds && ctx.itemKinds.length > 0 && ctx.itemKinds.every((kind) => kind === "memory"));
4
+ }
5
+ function isAuthOnlyMigration(ctx) {
6
+ return Boolean(ctx.itemKinds && ctx.itemKinds.length > 0 && ctx.itemKinds.every((kind) => kind === "auth"));
7
+ }
8
+ function buildCodexMigrationProvider(params = {}) {
9
+ return {
10
+ id: "codex",
11
+ label: "Codex",
12
+ description: "Import Codex memory and skills while keeping Codex native plugins and hooks explicit.",
13
+ supportedItemKinds: ["memory", "auth"],
14
+ async detect(ctx) {
15
+ const { discoverCodexSource, hasCodexSource } = await import("./source-CElXU0Oy.js").then((n) => n.i);
16
+ const source = await discoverCodexSource({
17
+ input: ctx.source,
18
+ memoryOnly: isMemoryOnlyMigration(ctx),
19
+ authOnly: isAuthOnlyMigration(ctx)
20
+ });
21
+ const found = isMemoryOnlyMigration(ctx) ? source.memoryFiles.length > 0 : isAuthOnlyMigration(ctx) ? Boolean(source.authPath) : hasCodexSource(source);
22
+ return {
23
+ found,
24
+ source: source.root,
25
+ label: "Codex",
26
+ confidence: found ? source.confidence : "low",
27
+ message: found ? "Codex state found." : "Codex state not found."
28
+ };
29
+ },
30
+ async plan(ctx) {
31
+ const { buildCodexMigrationPlan } = await import("./plan-7uG-Fp36.js");
32
+ return buildCodexMigrationPlan(ctx);
33
+ },
34
+ deferredApply: { retrySafe: true },
35
+ prepareApply(ctx) {
36
+ if (isMemoryOnlyMigration(ctx) || isAuthOnlyMigration(ctx)) return;
37
+ return import("./apply-CvT8tW5i.js").then(({ prepareTargetCodexAppServer }) => prepareTargetCodexAppServer(ctx));
38
+ },
39
+ async apply(ctx, plan) {
40
+ const { applyCodexMigrationPlan } = await import("./apply-CvT8tW5i.js");
41
+ return await applyCodexMigrationPlan({
42
+ ctx,
43
+ plan,
44
+ runtime: params.runtime
45
+ });
46
+ }
47
+ };
48
+ }
49
+ //#endregion
50
+ export { buildCodexMigrationProvider as t };
@@ -1,5 +1,5 @@
1
- import { h as releaseLeasedSharedCodexAppServerClient } from "./shared-client-CKhX2kFt.js";
2
- import { ut as normalizeCodexDynamicToolName } from "./thread-lifecycle-DPK30jad.js";
1
+ import { h as releaseLeasedSharedCodexAppServerClient } from "./shared-client-CscigXXL.js";
2
+ import { ct as normalizeCodexDynamicToolName } from "./thread-lifecycle-DXl1-I6b.js";
3
3
  import { pinExecToolTarget } from "openclaw/plugin-sdk/codex-mcp-projection";
4
4
  import { loadNodeExecAvailability } from "openclaw/plugin-sdk/node-selection-runtime";
5
5
  //#region extensions/codex/src/app-server/shell-dynamic-tools.ts
@@ -1,4 +1,4 @@
1
- import { B as isJsonObject } from "./config-CyapYSji.js";
1
+ import { o as isJsonObject } from "./protocol-5bh1G-H7.js";
2
2
  import { asBoolean, asFiniteNumber, normalizeOptionalString, parseStrictFiniteNumber } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  import { MAX_DATE_TIMESTAMP_MS, resolveExpiresAtMsFromEpochSeconds } from "openclaw/plugin-sdk/number-runtime";
4
4
  import { expectDefined } from "openclaw/plugin-sdk/expect-runtime";