@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.
- package/README.md +2 -0
- package/dist/api.js +29 -26
- package/dist/apply-CvT8tW5i.js +356 -0
- package/dist/{attempt-client-cleanup-Bp1ZOnk2.js → attempt-client-cleanup-DKHzbwt5.js} +38 -214
- package/dist/{attempt-context-CSazkWns.js → attempt-context-D44yeDII.js} +9 -7
- package/dist/{event-projector-usage-ZqEVbAEY.js → attempt-notifications-C9XufG6l.js} +3 -106
- package/dist/{auth-binding-Ds_QVm-X.js → auth-binding-CWlKVccJ.js} +2 -2
- package/dist/auth-cache-key-7orQae_j.js +498 -0
- package/dist/auth-profile-CwzO4_RG.js +43 -0
- package/dist/auth-profile-selection-DFu9e167.js +45 -0
- package/dist/binding-connection-D3udKbIE.js +60 -0
- package/dist/{bounded-turn-DxGJRYbY.js → bounded-turn-C_Hneydj.js} +28 -125
- package/dist/build-state-BCmg9-5p.js +19 -0
- package/dist/{capabilities-B1mgvpP8.js → capabilities-8vx68WLH.js} +1 -1
- package/dist/cli-metadata.js +1 -1
- package/dist/client-B57KWPQx.js +4005 -0
- package/dist/command-dispatch-BpduNGVf.js +21 -0
- package/dist/{command-formatters-DSbGMXA0.js → command-formatters-lxlkNZgU.js} +4 -3
- package/dist/{command-handlers-DOJvGv6-.js → command-handlers-tiL9iWj7.js} +788 -135
- package/dist/command-rpc-CR5EOEZX.js +233 -0
- package/dist/{compact-Y_xBqrHN.js → compact-B_H3AOd7.js} +19 -14
- package/dist/config-oIORaQ5T.js +106 -0
- package/dist/{config-CyapYSji.js → config-options-CXMq1T-C.js} +205 -593
- package/dist/config-runtime-D0zGNIHu.js +11 -0
- package/dist/{config-utils-C57JiJrU.js → config-utils-DujwEnhg.js} +2 -4
- package/dist/conversation-binding-DsB4-O7U.js +900 -0
- package/dist/{plugin-marketplace-discovery-B7gHXJ3d.js → conversation-control-CtUu1b3m.js} +11 -143
- package/dist/doctor-contract-api.js +5 -5
- package/dist/{dynamic-tools-BwpvTxaX.js → dynamic-tools-CmN5RAip.js} +133 -76
- package/dist/{effective-mcp-catalog-CY9Jn4bA.js → effective-mcp-catalog-Bd73bqA8.js} +3 -3
- package/dist/{elicitation-input-DMkeki8d.js → elicitation-input-DPoK8F7w.js} +8 -22
- package/dist/ephemeral-turn-D78_VmzO.js +101 -0
- package/dist/{event-projector-assistant-message-B9kp6iGC.js → event-projector-assistant-message-BmBM4qBV.js} +12 -25
- package/dist/event-projector-items-5VhsECCO.js +200 -0
- package/dist/event-projector-usage-BfXmpOec.js +102 -0
- package/dist/{harness-Czh2Sdoc.js → harness-C7rRa7bm.js} +48 -24
- package/dist/harness.js +1 -1
- package/dist/history-rejection-B4nOXNXF.js +13 -0
- package/dist/incognito-session-uhrBF6wJ.js +15 -0
- package/dist/index.js +406 -2915
- package/dist/inference-context-Dr_mzvk4.js +94 -0
- package/dist/inference-proxy-HGXKUIre.js +311 -0
- package/dist/{isolated-completion-CRh-51AK.js → isolated-completion-DWVb5U2J.js} +7 -4
- package/dist/launch-args-RXQwn8zV.js +90 -0
- package/dist/{managed-binary-DcpnJF9x.js → managed-binary-D22rNEcR.js} +13 -103
- package/dist/managed-thread-store-D1t5jh3G.js +66 -0
- package/dist/media-understanding-provider.js +4 -1
- package/dist/migration-provider-api.js +2 -0
- package/dist/{model-catalog-DT5vo6qo.js → model-catalog-Dq2n8f_p.js} +6 -5
- package/dist/{models-CcrgSMQR.js → models-PCKOim-h.js} +3 -3
- package/dist/native-execution-policy-umd0tgh4.js +128 -0
- package/dist/native-subagent-history-DjtPloaU.js +140 -0
- package/dist/native-subagent-history-owner-Pcp7JuVF.js +34 -0
- package/dist/{native-subagent-monitor-B3bvQGcg.js → native-subagent-monitor-fQ7eIXEf.js} +115 -460
- package/dist/native-subagent-task-ids-BzTdT0Uw.js +387 -0
- package/dist/node-cli-sessions-DKaOmVUh.js +527 -0
- package/dist/{node-exec-server.runtime-nfbUOtUB.js → node-exec-server.runtime-Cl2vapEi.js} +55 -24
- package/dist/plan-7uG-Fp36.js +947 -0
- package/dist/plugin-activation-BYQculil.js +138 -0
- package/dist/{thread-resume-BLgqkUc1.js → plugin-app-cache-key-d0eKxy7b.js} +4 -52
- package/dist/{plugin-approval-roundtrip-aQVdyL5g.js → plugin-approval-roundtrip-Bz3FT8W5.js} +1 -1
- package/dist/plugin-inventory-oL4Na1ZG.js +328 -0
- package/dist/plugin-marketplace-discovery-P-Vndfqq.js +137 -0
- package/dist/{plugin-metadata-cache-BwCLTY_U.js → plugin-metadata-cache-ClPJpRio.js} +17 -9
- package/dist/protocol-5bh1G-H7.js +275 -0
- package/dist/provider-MQ8PVkuE.js +50 -0
- package/dist/{provider-capabilities-BpG9Ltc5.js → provider-capabilities-BvCUL69A.js} +2 -2
- package/dist/{rate-limits-Fx_l4eNa.js → rate-limits-CBMmWBr9.js} +1 -1
- package/dist/request-B7hEkBGq.js +212 -0
- package/dist/rpc-error-ttN_QjEm.js +30 -0
- package/dist/{run-attempt-BzthFQSM.js → run-attempt-CvsAAGa0.js} +664 -377
- package/dist/{runtime-artifact-Bh_gf6-t.js → runtime-artifact-BJ0rXBZ_.js} +27 -27
- package/dist/sandbox-guard-BxgyoM8M.js +166 -0
- package/dist/{session-binding-4Ki04sW-.js → session-binding-CI8UuilT.js} +30 -48
- package/dist/{session-binding-record-CyaXZvTe.js → session-binding-record-Bcvslnhf.js} +12 -26
- package/dist/session-catalog-adoption-tcZi1IfX.js +251 -0
- package/dist/session-catalog-archive-CwKg8Xz2.js +56 -0
- package/dist/session-catalog-ct-AH01I.js +1477 -0
- package/dist/session-catalog-home-id-CwhLdC03.js +18 -0
- package/dist/session-catalog-node-adoption-B1tgDW-m.js +182 -0
- package/dist/session-catalog-node-continue-Ci-DXyJP.js +238 -0
- package/dist/session-catalog-provenance-D-dIfRAH.js +96 -0
- package/dist/{session-cli-BjLhpmS1.js → session-cli-DNN_jhGc.js} +3 -2
- package/dist/{session-history-DWmMqiqW.js → session-history-Cz-tOOYj.js} +6 -3
- package/dist/{session-upstream-marker-DReTpGz6.js → session-history-import-DwyijFI6.js} +5 -50
- package/dist/{session-history-read-LHldwvyh.js → session-history-read-cxPUxyVV.js} +21 -7
- package/dist/session-history-worker-runtime.js +18 -6
- package/dist/session-history.worker-BeK1YOyT.js +378 -0
- package/dist/session-history.worker.js +1 -1
- package/dist/{session-initialization-BCFVnLL4.js → session-initialization-Ct0_Hzmg.js} +2 -2
- package/dist/{session-permission-policy-BaueHmSj.js → session-permission-policy-BBmXA8Eg.js} +4 -7
- package/dist/{session-retirement-DNdmYdFc.js → session-retirement-B2YfbAAT.js} +6 -5
- package/dist/session-upstream-marker-D15C9NHp.js +46 -0
- package/dist/{settled-turn-context-BOM3Y1pl.js → settled-turn-context-Du6gdUDd.js} +9 -9
- package/dist/{settled-turn-finalizer-BI-b1sry.js → settled-turn-finalizer-Dn91stmc.js} +8 -7
- package/dist/shared-client-CscigXXL.js +3109 -0
- package/dist/{side-question-B6DWAw1A.js → side-question-BGMJQf4U.js} +65 -170
- package/dist/source-CElXU0Oy.js +518 -0
- package/dist/thread-archive-guard-DfpBr-Sz.js +53 -0
- package/dist/thread-history-page-D0JIp48V.js +361 -0
- package/dist/{thread-lifecycle-DPK30jad.js → thread-lifecycle-DXl1-I6b.js} +187 -639
- package/dist/{thread-ownership-CbucAmmp.js → thread-ownership-BsDRTsyp.js} +13 -15
- package/dist/thread-policy-BuEQfE0g.js +54 -0
- package/dist/thread-resume-DsDOZpFg.js +52 -0
- package/dist/timeout-BVw8aaM1.js +33 -0
- package/dist/transcript-history-projection-v17wXgdK.js +238 -0
- package/dist/{transcript-mirror-_njEB84z.js → transcript-mirror-C5CKgNy6.js} +50 -260
- package/dist/{transcript-mirror-attestation-Byl34PC-.js → transcript-mirror-attestation-DibE0krH.js} +17 -4
- package/dist/{transport-stdio-CzTngV0j.js → transport-stdio-BGjHoYLr.js} +73 -43
- package/dist/{upstream-session-fork-1fwbNKzQ.js → upstream-session-fork-BZerMte_.js} +27 -19
- package/dist/{usage-i9fv5-4m.js → usage-tCk-mg_x.js} +4 -3
- package/dist/version-omm6IPI3.js +12 -0
- package/dist/{web-search-provider.runtime-DKQn67A7.js → web-search-provider.runtime-B7bGbGWq.js} +3 -3
- package/openclaw.plugin.json +23 -1
- package/package.json +4 -4
- package/dist/request-C8H22rPi.js +0 -475
- package/dist/session-catalog-B47uwekb.js +0 -3272
- package/dist/session-history.worker-zZVcx0ME.js +0 -267
- package/dist/shared-client-CKhX2kFt.js +0 -7505
- 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 {
|
|
2
|
-
import {
|
|
3
|
-
import { c as
|
|
4
|
-
import {
|
|
5
|
-
import { n as describeControlFailure } from "./capabilities-
|
|
6
|
-
import
|
|
7
|
-
import
|
|
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-
|
|
2
|
-
import {
|
|
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 {
|
|
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";
|