@openclaw/codex 2026.9.3 → 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/dist/api.js +26 -18
- package/dist/{apply-B6el6hdO.js → apply-CvT8tW5i.js} +11 -12
- package/dist/{attempt-client-cleanup-D6cR54TV.js → attempt-client-cleanup-DKHzbwt5.js} +8 -204
- package/dist/{attempt-context-AO4DSjE0.js → attempt-context-D44yeDII.js} +3 -3
- package/dist/{attempt-notifications--H8zXR5-.js → attempt-notifications-C9XufG6l.js} +1 -1
- package/dist/{auth-binding-Co2Vfcf_.js → auth-binding-CWlKVccJ.js} +1 -1
- package/dist/{auth-cache-key-Kq6oerr6.js → auth-cache-key-7orQae_j.js} +2 -2
- package/dist/{binding-connection-QqgcPCgk.js → binding-connection-D3udKbIE.js} +3 -3
- package/dist/{bounded-turn-lRpmZHFv.js → bounded-turn-C_Hneydj.js} +12 -12
- package/dist/{build-state-6RL6qohz.js → build-state-BCmg9-5p.js} +1 -1
- package/dist/{capabilities-BeqLPbtM.js → capabilities-8vx68WLH.js} +1 -1
- package/dist/cli-metadata.js +1 -1
- package/dist/{client-BEKu4yDx.js → client-B57KWPQx.js} +27 -5
- package/dist/{command-dispatch-CisT9Jqq.js → command-dispatch-BpduNGVf.js} +3 -3
- package/dist/{command-formatters-DeTfrapr.js → command-formatters-lxlkNZgU.js} +4 -3
- package/dist/{command-handlers-BfIsJEuA.js → command-handlers-tiL9iWj7.js} +783 -140
- package/dist/{command-rpc-BMqRQOFX.js → command-rpc-CR5EOEZX.js} +26 -19
- package/dist/{compact-CGJZ2rlb.js → compact-B_H3AOd7.js} +14 -14
- package/dist/{config-JDfTI4VI.js → config-oIORaQ5T.js} +4 -4
- package/dist/{config-options-jnIFvwxD.js → config-options-CXMq1T-C.js} +5 -5
- package/dist/{config-runtime-BWf6JLWG.js → config-runtime-D0zGNIHu.js} +1 -1
- package/dist/{config-utils-C57JiJrU.js → config-utils-DujwEnhg.js} +2 -4
- package/dist/{conversation-binding-CxOlHiix.js → conversation-binding-DsB4-O7U.js} +53 -42
- package/dist/{conversation-control-CUCrSIQI.js → conversation-control-CtUu1b3m.js} +8 -8
- package/dist/doctor-contract-api.js +1 -1
- package/dist/{dynamic-tools-D-JBoaLt.js → dynamic-tools-CmN5RAip.js} +76 -15
- package/dist/{effective-mcp-catalog-J_5Ep5Um.js → effective-mcp-catalog-Bd73bqA8.js} +3 -3
- package/dist/{ephemeral-turn-DSwzP8YY.js → ephemeral-turn-D78_VmzO.js} +5 -5
- package/dist/event-projector-items-5VhsECCO.js +200 -0
- package/dist/{event-projector-usage-CIyrYYid.js → event-projector-usage-BfXmpOec.js} +1 -1
- package/dist/{harness-FR6eQgyO.js → harness-C7rRa7bm.js} +33 -16
- package/dist/harness.js +1 -1
- package/dist/index.js +39 -84
- package/dist/inference-context-Dr_mzvk4.js +94 -0
- package/dist/inference-proxy-HGXKUIre.js +311 -0
- package/dist/{isolated-completion-DHBefrzg.js → isolated-completion-DWVb5U2J.js} +6 -6
- package/dist/{managed-binary-DrjjRRUD.js → managed-binary-D22rNEcR.js} +10 -1
- package/dist/media-understanding-provider.js +2 -2
- package/dist/migration-provider-api.js +2 -0
- package/dist/{model-catalog-B_6M04Wo.js → model-catalog-Dq2n8f_p.js} +6 -6
- package/dist/{models-P9k2qAof.js → models-PCKOim-h.js} +3 -3
- package/dist/native-subagent-history-DjtPloaU.js +140 -0
- package/dist/native-subagent-history-owner-Pcp7JuVF.js +34 -0
- package/dist/{native-subagent-monitor-BbCUKRwC.js → native-subagent-monitor-fQ7eIXEf.js} +52 -424
- package/dist/native-subagent-task-ids-BzTdT0Uw.js +387 -0
- package/dist/{node-cli-sessions-rj0ysJwM.js → node-cli-sessions-DKaOmVUh.js} +1 -1
- package/dist/{node-exec-server.runtime-BY_ctYnT.js → node-exec-server.runtime-Cl2vapEi.js} +3 -3
- package/dist/{plan-BMJdMOEF.js → plan-7uG-Fp36.js} +288 -52
- package/dist/{plugin-activation-BQK-f5sV.js → plugin-activation-BYQculil.js} +24 -19
- package/dist/{plugin-app-cache-key-CdSQzWyX.js → plugin-app-cache-key-d0eKxy7b.js} +1 -1
- package/dist/{plugin-approval-roundtrip-DeW95wB5.js → plugin-approval-roundtrip-Bz3FT8W5.js} +1 -1
- package/dist/{plugin-inventory-CoRCzWW4.js → plugin-inventory-oL4Na1ZG.js} +7 -4
- package/dist/{plugin-marketplace-discovery-3akBizzF.js → plugin-marketplace-discovery-P-Vndfqq.js} +18 -15
- package/dist/{plugin-metadata-cache-DgNfRAGA.js → plugin-metadata-cache-ClPJpRio.js} +13 -9
- package/dist/{protocol-CAAcVIKF.js → protocol-5bh1G-H7.js} +1 -1
- package/dist/provider-MQ8PVkuE.js +50 -0
- package/dist/{provider-capabilities-W4tfK5Y5.js → provider-capabilities-BvCUL69A.js} +2 -2
- package/dist/{rate-limits-Bqnx1N4z.js → rate-limits-CBMmWBr9.js} +1 -1
- package/dist/{request-CGvGOpeR.js → request-B7hEkBGq.js} +72 -58
- package/dist/rpc-error-ttN_QjEm.js +30 -0
- package/dist/{run-attempt-DwKds3DN.js → run-attempt-CvsAAGa0.js} +108 -37
- package/dist/{runtime-artifact-T-NwqeSH.js → runtime-artifact-BJ0rXBZ_.js} +1 -1
- package/dist/{sandbox-guard-BcT66fWy.js → sandbox-guard-BxgyoM8M.js} +2 -1
- package/dist/{session-binding-CKSepwIC.js → session-binding-CI8UuilT.js} +3 -3
- package/dist/{session-binding-record-CaZjYwNS.js → session-binding-record-Bcvslnhf.js} +1 -1
- package/dist/{session-catalog-adoption-BKLtSrwi.js → session-catalog-adoption-tcZi1IfX.js} +5 -5
- package/dist/{session-catalog-archive-D0i2pGj2.js → session-catalog-archive-CwKg8Xz2.js} +6 -6
- package/dist/{session-catalog-HaDcp7Sv.js → session-catalog-ct-AH01I.js} +31 -87
- package/dist/session-catalog-home-id-CwhLdC03.js +18 -0
- package/dist/{session-catalog-node-adoption-BUuDYY8R.js → session-catalog-node-adoption-B1tgDW-m.js} +2 -2
- package/dist/{session-catalog-node-continue-CBtc4wkI.js → session-catalog-node-continue-Ci-DXyJP.js} +4 -4
- package/dist/{session-catalog-provenance-DkJHo735.js → session-catalog-provenance-D-dIfRAH.js} +2 -30
- package/dist/{session-cli-CbgaHh0f.js → session-cli-DNN_jhGc.js} +2 -2
- package/dist/{session-history-import-DFN7sWRU.js → session-history-import-DwyijFI6.js} +4 -4
- package/dist/session-history-worker-runtime.js +1 -1
- package/dist/{session-history.worker-CNEvGaU5.js → session-history.worker-BeK1YOyT.js} +187 -83
- package/dist/session-history.worker.js +1 -1
- package/dist/{session-initialization-Jo86C60I.js → session-initialization-Ct0_Hzmg.js} +2 -2
- package/dist/{session-permission-policy-B22InTp_.js → session-permission-policy-BBmXA8Eg.js} +2 -2
- package/dist/{session-retirement-BSNG_mhf.js → session-retirement-B2YfbAAT.js} +5 -5
- package/dist/{settled-turn-finalizer-BuLUrZl2.js → settled-turn-finalizer-Dn91stmc.js} +5 -5
- package/dist/{shared-client-CVhez2Uo.js → shared-client-CscigXXL.js} +228 -30
- package/dist/{side-question-DLbr2vUU.js → side-question-BGMJQf4U.js} +18 -18
- package/dist/{source-Da-h6f7e.js → source-CElXU0Oy.js} +12 -12
- package/dist/{thread-archive-guard-D1bP04Tf.js → thread-archive-guard-DfpBr-Sz.js} +1 -1
- package/dist/{session-catalog-parsing-CdD3JhdM.js → thread-history-page-D0JIp48V.js} +83 -2
- package/dist/{thread-lifecycle-D1pzRwHB.js → thread-lifecycle-DXl1-I6b.js} +96 -44
- package/dist/{thread-ownership-D6oASVRu.js → thread-ownership-BsDRTsyp.js} +2 -2
- package/dist/{thread-policy-D8kI7yAO.js → thread-policy-BuEQfE0g.js} +3 -3
- package/dist/{thread-resume-T5cveyxA.js → thread-resume-DsDOZpFg.js} +5 -5
- package/dist/{session-catalog-home-id-D7-aLiNt.js → transcript-history-projection-v17wXgdK.js} +66 -18
- package/dist/{transcript-mirror-t5TOccct.js → transcript-mirror-C5CKgNy6.js} +1 -1
- package/dist/{upstream-session-fork-De-sLJ2r.js → upstream-session-fork-BZerMte_.js} +20 -20
- package/dist/{usage-CPPTmBvZ.js → usage-tCk-mg_x.js} +4 -4
- package/dist/{web-search-provider.runtime-CSVgQL0w.js → web-search-provider.runtime-B7bGbGWq.js} +3 -3
- package/openclaw.plugin.json +1 -0
- package/package.json +4 -4
|
@@ -1,25 +1,192 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "./config-
|
|
3
|
-
import { a as exists, c as sanitizeName, n as discoverCodexSource, o as readJsonObject, r as hasCodexSource, s as resolveHomePath, t as codexPluginMigrationSubscriptionWarning } from "./source-
|
|
4
|
-
import { asBoolean, isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
1
|
+
import { c as CODEX_PLUGINS_MARKETPLACE_NAME } from "./plugin-inventory-oL4Na1ZG.js";
|
|
2
|
+
import "./config-oIORaQ5T.js";
|
|
3
|
+
import { a as exists, c as sanitizeName, n as discoverCodexSource, o as readJsonObject, r as hasCodexSource, s as resolveHomePath, t as codexPluginMigrationSubscriptionWarning } from "./source-CElXU0Oy.js";
|
|
4
|
+
import { asBoolean, asOptionalRecord, isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
import { runCommandBuffered } from "openclaw/plugin-sdk/process-runtime";
|
|
5
7
|
import path from "node:path";
|
|
6
8
|
import fs from "node:fs/promises";
|
|
7
9
|
import { canonicalPathFromExistingAncestor, isPathInside } from "openclaw/plugin-sdk/file-access-runtime";
|
|
10
|
+
import { readSecretFile } from "openclaw/plugin-sdk/secret-file";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
8
12
|
import { loadAuthProfileStoreWithoutExternalProfiles, resolveAgentConfig, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "openclaw/plugin-sdk/agent-runtime";
|
|
9
13
|
import { extractErrorCode } from "openclaw/plugin-sdk/security-runtime";
|
|
10
|
-
import { applyAuthProfileConfig, buildApiKeyCredential, buildOauthProviderAuthResult, buildOpenAICodexCredentialExtra,
|
|
14
|
+
import { applyAuthProfileConfig, buildApiKeyCredential, buildOauthProviderAuthResult, buildOpenAICodexCredentialExtra, hasUsableOAuthCredential, resolveOpenAICodexAuthIdentity, resolveOpenAICodexImportProfileName, updateAuthProfileStoreWithLock } from "openclaw/plugin-sdk/provider-auth";
|
|
11
15
|
import { MIGRATION_REASON_TARGET_EXISTS, createMigrationItem, createMigrationManualItem, hasMigrationConfigPatchConflict, markMigrationItemConflict, markMigrationItemError, markMigrationItemSkipped, mergeMigrationConfigValue, readMigrationConfigPath, resolveMigrationConfigRuntime, summarizeMigrationItems } from "openclaw/plugin-sdk/migration";
|
|
16
|
+
import { decodeOpenAICodexJwtPayload } from "openclaw/plugin-sdk/provider-oauth-runtime";
|
|
17
|
+
//#region extensions/codex/src/migration/cli-credentials.ts
|
|
18
|
+
/** Explicit migration reads the storage selected by the native credential owner. */
|
|
19
|
+
async function readAuthFile(home) {
|
|
20
|
+
try {
|
|
21
|
+
return asOptionalRecord(JSON.parse(await readSecretFile(path.join(home, "auth.json"), "Codex auth")));
|
|
22
|
+
} catch {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function readDirectKeyring(home, signal) {
|
|
27
|
+
const account = `cli|${createHash("sha256").update(home).digest("hex").slice(0, 16)}`;
|
|
28
|
+
const result = await runCommandBuffered([
|
|
29
|
+
"security",
|
|
30
|
+
"find-generic-password",
|
|
31
|
+
"-s",
|
|
32
|
+
"Codex Auth",
|
|
33
|
+
"-a",
|
|
34
|
+
account,
|
|
35
|
+
"-w"
|
|
36
|
+
], {
|
|
37
|
+
timeoutMs: 6e4,
|
|
38
|
+
maxCombinedOutputBytes: 16384,
|
|
39
|
+
signal
|
|
40
|
+
});
|
|
41
|
+
if (result.termination !== "exit" || result.code !== 0) return;
|
|
42
|
+
try {
|
|
43
|
+
return asOptionalRecord(JSON.parse(result.stdout.toString("utf8")));
|
|
44
|
+
} catch {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function readSelectedCredentialStorage(options, requireApiKey) {
|
|
49
|
+
options.signal?.throwIfAborted();
|
|
50
|
+
const home = await fs.realpath(options.codexHome).catch(() => path.resolve(options.codexHome));
|
|
51
|
+
const { CodexAppServerClient } = await import("./client-B57KWPQx.js").then((n) => n.n);
|
|
52
|
+
const { resolveManagedCodexPackageEntrypoint, resolveManagedCodexNativeCommand } = await import("./managed-binary-D22rNEcR.js").then((n) => n.n);
|
|
53
|
+
const launcher = resolveManagedCodexPackageEntrypoint(path.dirname(fileURLToPath(import.meta.url)));
|
|
54
|
+
const command = launcher ? resolveManagedCodexNativeCommand(launcher) : void 0;
|
|
55
|
+
if (!command) return;
|
|
56
|
+
const signal = AbortSignal.any([AbortSignal.timeout(options.allowKeychainPrompt && process.platform === "darwin" ? 6e4 : 5e3), ...options.signal ? [options.signal] : []]);
|
|
57
|
+
const client = await CodexAppServerClient.start({
|
|
58
|
+
transport: "stdio",
|
|
59
|
+
command,
|
|
60
|
+
commandSource: "resolved-managed",
|
|
61
|
+
args: ["app-server"],
|
|
62
|
+
cwd: home,
|
|
63
|
+
homeScope: "user",
|
|
64
|
+
env: { CODEX_HOME: home },
|
|
65
|
+
clearEnv: [
|
|
66
|
+
"OPENAI_API_KEY",
|
|
67
|
+
"CODEX_API_KEY",
|
|
68
|
+
"CODEX_ACCESS_TOKEN"
|
|
69
|
+
]
|
|
70
|
+
}, () => signal.throwIfAborted()).catch(() => {
|
|
71
|
+
options.signal?.throwIfAborted();
|
|
72
|
+
});
|
|
73
|
+
if (!client) return;
|
|
74
|
+
const abort = () => client.close();
|
|
75
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
76
|
+
let credential;
|
|
77
|
+
try {
|
|
78
|
+
credential = await readNativeCredential(client, home, requireApiKey, options, signal);
|
|
79
|
+
} catch {}
|
|
80
|
+
signal.removeEventListener("abort", abort);
|
|
81
|
+
const closed = await client.closeAndWait({
|
|
82
|
+
forceKillDelayMs: 6e3,
|
|
83
|
+
exitTimeoutMs: 7e3
|
|
84
|
+
});
|
|
85
|
+
if (!closed.exited || closed.cleanup !== "closed") throw new Error("The Codex credential reader could not stop. No credential was imported.", { cause: options.signal?.reason });
|
|
86
|
+
options.signal?.throwIfAborted();
|
|
87
|
+
return credential;
|
|
88
|
+
}
|
|
89
|
+
async function readNativeCredential(client, home, requireApiKey, options, signal) {
|
|
90
|
+
signal.throwIfAborted();
|
|
91
|
+
await client.initialize();
|
|
92
|
+
if (client.getRuntimeIdentity()?.codexHome !== home) return;
|
|
93
|
+
const revision = client.getModelCatalogRevision();
|
|
94
|
+
if (requireApiKey) {
|
|
95
|
+
const account = await client.request("account/read", { refreshToken: false }, { signal });
|
|
96
|
+
if (asOptionalRecord(account.account)?.type !== "apiKey" || account.requiresOpenaiAuth !== true) return;
|
|
97
|
+
}
|
|
98
|
+
const configured = await client.request("config/read", {
|
|
99
|
+
includeLayers: false,
|
|
100
|
+
cwd: home
|
|
101
|
+
}, { signal });
|
|
102
|
+
const mode = (await client.request("configRequirements/read", {}, { signal })).requirements?.cli_auth_credentials_store ?? configured.config.cli_auth_credentials_store ?? "file";
|
|
103
|
+
let record;
|
|
104
|
+
if (mode === "file") record = await readAuthFile(home);
|
|
105
|
+
else if ((mode === "keyring" || mode === "auto") && process.platform === "darwin" && options.allowKeychainPrompt) {
|
|
106
|
+
let cursor;
|
|
107
|
+
let encrypted;
|
|
108
|
+
do {
|
|
109
|
+
const features = await client.request("experimentalFeature/list", {
|
|
110
|
+
limit: 100,
|
|
111
|
+
cursor
|
|
112
|
+
}, { signal });
|
|
113
|
+
const storage = features.data.find((feature) => feature.name === "secret_auth_storage");
|
|
114
|
+
if (storage) {
|
|
115
|
+
encrypted = storage.enabled;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
cursor = features.nextCursor ?? void 0;
|
|
119
|
+
} while (cursor);
|
|
120
|
+
if (encrypted !== false) return;
|
|
121
|
+
record = await readDirectKeyring(home, signal);
|
|
122
|
+
}
|
|
123
|
+
signal.throwIfAborted();
|
|
124
|
+
return !client.getCloseError() && client.getModelCatalogRevision() === revision ? record : void 0;
|
|
125
|
+
}
|
|
126
|
+
function jwtExpiry(token) {
|
|
127
|
+
try {
|
|
128
|
+
const exp = asOptionalRecord(JSON.parse(Buffer.from(token.split(".")[1] ?? "", "base64url").toString("utf8")))?.exp;
|
|
129
|
+
return typeof exp === "number" && Number.isFinite(exp) && exp > 0 ? exp * 1e3 : void 0;
|
|
130
|
+
} catch {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function readCodexCliCredentialsAsync(options) {
|
|
135
|
+
const data = await readSelectedCredentialStorage(options, false);
|
|
136
|
+
const mode = typeof data?.auth_mode === "string" ? data.auth_mode.toLowerCase() : void 0;
|
|
137
|
+
if (!data || mode !== void 0 && mode !== "chatgpt" && mode !== "chatgptauthtokens") return;
|
|
138
|
+
const tokens = asOptionalRecord(data.tokens);
|
|
139
|
+
if (typeof tokens?.access_token !== "string" || !tokens.access_token || typeof tokens.refresh_token !== "string" || !tokens.refresh_token) return;
|
|
140
|
+
const lastRefresh = typeof data.last_refresh === "string" ? Date.parse(data.last_refresh) : NaN;
|
|
141
|
+
return {
|
|
142
|
+
type: "oauth",
|
|
143
|
+
provider: "openai",
|
|
144
|
+
access: tokens.access_token,
|
|
145
|
+
refresh: tokens.refresh_token,
|
|
146
|
+
expires: jwtExpiry(tokens.access_token) ?? (Number.isFinite(lastRefresh) ? lastRefresh : Date.now()) + 36e5,
|
|
147
|
+
...typeof tokens.account_id === "string" ? { accountId: tokens.account_id } : {},
|
|
148
|
+
...typeof tokens.id_token === "string" ? { idToken: tokens.id_token } : {}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
async function readCodexCliActiveApiKeyAsync(options) {
|
|
152
|
+
const data = await readSelectedCredentialStorage(options, true);
|
|
153
|
+
const mode = typeof data?.auth_mode === "string" ? data.auth_mode.toLowerCase() : void 0;
|
|
154
|
+
if (!data || mode !== void 0 && mode !== "apikey" && mode !== "api_key") return;
|
|
155
|
+
const key = typeof data.OPENAI_API_KEY === "string" ? data.OPENAI_API_KEY.trim() : "";
|
|
156
|
+
return key ? {
|
|
157
|
+
type: "api_key",
|
|
158
|
+
provider: "openai",
|
|
159
|
+
key
|
|
160
|
+
} : void 0;
|
|
161
|
+
}
|
|
162
|
+
//#endregion
|
|
12
163
|
//#region extensions/codex/src/migration/auth.ts
|
|
13
164
|
const OPENAI_PROVIDER_ID = "openai";
|
|
165
|
+
const OPENAI_OAUTH_ITEM_ID = "auth:openai";
|
|
166
|
+
const OPENAI_API_KEY_ITEM_ID = "auth:openai:api-key";
|
|
14
167
|
const OPENAI_CODEX_DEFAULT_MODEL = "openai/gpt-5.6-sol";
|
|
15
168
|
const CODEX_IMPORT_DISPLAY_NAME = "Codex import";
|
|
16
169
|
const CODEX_REASON_AUTH_NOT_SELECTED = "auth credential migration not selected";
|
|
17
170
|
const CODEX_REASON_AUTH_PROFILE_EXISTS = "auth profile exists";
|
|
171
|
+
const CODEX_REASON_AUTH_PROFILE_UNUSABLE = "existing OAuth profile requires sign-in";
|
|
18
172
|
const CODEX_REASON_AUTH_PROFILE_WRITE_FAILED = "failed to write auth profile";
|
|
19
173
|
const CODEX_REASON_AUTH_NO_LONGER_PRESENT = "auth credential no longer present";
|
|
20
174
|
const CODEX_REASON_MISSING_AUTH_METADATA = "missing auth metadata";
|
|
21
|
-
const
|
|
175
|
+
const CODEX_REASON_AUTH_STORAGE_NOT_IMPORTABLE = "credential storage is not importable";
|
|
22
176
|
var CodexAuthConfigConflict = class extends Error {};
|
|
177
|
+
function authItemId(credential) {
|
|
178
|
+
return credential.kind === "oauth" ? OPENAI_OAUTH_ITEM_ID : OPENAI_API_KEY_ITEM_ID;
|
|
179
|
+
}
|
|
180
|
+
function sourceCredentialFingerprint(credential) {
|
|
181
|
+
const profile = credential.kind === "oauth" ? credential.result.profiles[0]?.credential : void 0;
|
|
182
|
+
const source = credential.kind === "api_key" ? credential.key : profile?.type === "oauth" ? [
|
|
183
|
+
profile.access,
|
|
184
|
+
profile.refresh,
|
|
185
|
+
profile.accountId,
|
|
186
|
+
profile.idToken
|
|
187
|
+
] : void 0;
|
|
188
|
+
return createHash("sha256").update(JSON.stringify([credential.kind, source])).digest("hex");
|
|
189
|
+
}
|
|
23
190
|
async function readModelRefs(source) {
|
|
24
191
|
const cache = await readJsonObject(source.modelsCachePath);
|
|
25
192
|
const models = Array.isArray(cache.models) ? cache.models : [];
|
|
@@ -32,19 +199,18 @@ async function readModelRefs(source) {
|
|
|
32
199
|
refs.add(OPENAI_CODEX_DEFAULT_MODEL);
|
|
33
200
|
return [...refs].toSorted();
|
|
34
201
|
}
|
|
35
|
-
async function buildCodexOAuthCredential(source) {
|
|
36
|
-
const credential =
|
|
202
|
+
async function buildCodexOAuthCredential(source, includeConfigPatch, options) {
|
|
203
|
+
const credential = await readCodexCliCredentialsAsync({
|
|
37
204
|
codexHome: source.codexHome,
|
|
38
|
-
allowKeychainPrompt:
|
|
39
|
-
|
|
205
|
+
allowKeychainPrompt: options.allowKeychainPrompt,
|
|
206
|
+
...options.signal ? { signal: options.signal } : {}
|
|
40
207
|
});
|
|
41
208
|
if (!credential) return null;
|
|
42
209
|
const identity = resolveOpenAICodexAuthIdentity({
|
|
43
210
|
access: credential.access,
|
|
44
211
|
accountId: credential.accountId
|
|
45
212
|
});
|
|
46
|
-
const
|
|
47
|
-
const configPatch = { agents: { defaults: { models: Object.fromEntries(modelRefs.map((modelRef) => [modelRef, {}])) } } };
|
|
213
|
+
const configPatch = includeConfigPatch ? { agents: { defaults: { models: Object.fromEntries((await readModelRefs(source)).map((modelRef) => [modelRef, {}])) } } } : {};
|
|
48
214
|
const result = buildOauthProviderAuthResult({
|
|
49
215
|
providerId: OPENAI_PROVIDER_ID,
|
|
50
216
|
defaultModel: OPENAI_CODEX_DEFAULT_MODEL,
|
|
@@ -69,27 +235,45 @@ async function buildCodexOAuthCredential(source) {
|
|
|
69
235
|
result
|
|
70
236
|
} : null;
|
|
71
237
|
}
|
|
72
|
-
async function buildCodexApiKeyCredential(source) {
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
238
|
+
async function buildCodexApiKeyCredential(source, allowKeychainPrompt, signal) {
|
|
239
|
+
const credential = await readCodexCliActiveApiKeyAsync({
|
|
240
|
+
codexHome: source.codexHome,
|
|
241
|
+
allowKeychainPrompt,
|
|
242
|
+
...signal ? { signal } : {}
|
|
243
|
+
});
|
|
244
|
+
if (!credential) return null;
|
|
76
245
|
return {
|
|
77
246
|
kind: "api_key",
|
|
78
247
|
provider: OPENAI_PROVIDER_ID,
|
|
79
248
|
profileId: "openai:codex-import",
|
|
80
|
-
key
|
|
249
|
+
key: credential.key
|
|
81
250
|
};
|
|
82
251
|
}
|
|
83
|
-
async function readCodexAuthCredentials(source) {
|
|
84
|
-
return [await buildCodexOAuthCredential(source
|
|
252
|
+
async function readCodexAuthCredentials(source, options) {
|
|
253
|
+
return [options.credentialKind === "api_key" ? null : await buildCodexOAuthCredential(source, options.includeConfigPatch, {
|
|
254
|
+
allowKeychainPrompt: options.allowKeychainPrompt,
|
|
255
|
+
...options.signal ? { signal: options.signal } : {}
|
|
256
|
+
}), options.credentialKind === "oauth" ? null : await buildCodexApiKeyCredential(source, options.allowKeychainPrompt, options.signal)].filter((entry) => entry !== null);
|
|
85
257
|
}
|
|
86
258
|
function findMatchingOAuthProfile(store, credential) {
|
|
259
|
+
const subject = oauthSubject(credential);
|
|
260
|
+
if (!subject) return;
|
|
87
261
|
for (const [profileId, existing] of Object.entries(store.profiles)) {
|
|
88
262
|
if (existing.type !== "oauth" || existing.provider !== credential.provider) continue;
|
|
89
|
-
|
|
90
|
-
if (
|
|
263
|
+
const previous = oauthSubject(existing);
|
|
264
|
+
if (previous?.accountId === subject.accountId && previous.userId === subject.userId) return profileId;
|
|
91
265
|
}
|
|
92
266
|
}
|
|
267
|
+
function oauthSubject(credential) {
|
|
268
|
+
const claims = decodeOpenAICodexJwtPayload(credential.access)?.["https://api.openai.com/auth"];
|
|
269
|
+
if (!isRecord(claims)) return;
|
|
270
|
+
const accountId = normalizeOptionalString(claims.chatgpt_account_id);
|
|
271
|
+
const userId = normalizeOptionalString(claims.chatgpt_user_id) ?? normalizeOptionalString(claims.user_id);
|
|
272
|
+
return accountId && userId ? {
|
|
273
|
+
accountId,
|
|
274
|
+
userId
|
|
275
|
+
} : void 0;
|
|
276
|
+
}
|
|
93
277
|
function findMatchingApiKeyProfile(store, provider, key) {
|
|
94
278
|
for (const [profileId, existing] of Object.entries(store.profiles)) if (existing.type === "api_key" && existing.provider === provider && existing.key === key) return profileId;
|
|
95
279
|
}
|
|
@@ -168,8 +352,16 @@ function applyApiKeyConfigToConfig(cfg, credential, profileId) {
|
|
|
168
352
|
preferProfileFirst: false
|
|
169
353
|
});
|
|
170
354
|
}
|
|
171
|
-
function
|
|
172
|
-
|
|
355
|
+
function resolveCodexConfigPatchMode(ctx) {
|
|
356
|
+
const mode = ctx.providerOptions?.configPatchMode;
|
|
357
|
+
return mode === "none" || mode === "return" ? mode : "apply";
|
|
358
|
+
}
|
|
359
|
+
function allowCodexKeychainPrompt(ctx) {
|
|
360
|
+
return ctx.providerOptions?.allowKeychainPrompt === true;
|
|
361
|
+
}
|
|
362
|
+
function resolveRequestedCredentialKind(ctx) {
|
|
363
|
+
const kind = ctx.providerOptions?.credentialKind;
|
|
364
|
+
return kind === "oauth" || kind === "api_key" ? kind : void 0;
|
|
173
365
|
}
|
|
174
366
|
function authProfileConfigForCredential(credential, profileId) {
|
|
175
367
|
if (credential.kind === "api_key") return {
|
|
@@ -215,32 +407,60 @@ function applyCredentialConfig(config, credential, profileId) {
|
|
|
215
407
|
return credential.kind === "oauth" ? applyOAuthConfigToConfig(config, credential, profileId) : applyApiKeyConfigToConfig(config, credential, profileId);
|
|
216
408
|
}
|
|
217
409
|
async function buildCodexAuthItems(params) {
|
|
218
|
-
const
|
|
219
|
-
|
|
410
|
+
const configPatchMode = resolveCodexConfigPatchMode(params.ctx);
|
|
411
|
+
const credentials = await readCodexAuthCredentials(params.source, {
|
|
412
|
+
credentialKind: resolveRequestedCredentialKind(params.ctx),
|
|
413
|
+
includeConfigPatch: configPatchMode !== "none",
|
|
414
|
+
allowKeychainPrompt: allowCodexKeychainPrompt(params.ctx),
|
|
415
|
+
signal: params.ctx.signal
|
|
416
|
+
});
|
|
417
|
+
if (credentials.length === 0) {
|
|
418
|
+
const requestedKind = resolveRequestedCredentialKind(params.ctx);
|
|
419
|
+
if (!requestedKind) return [];
|
|
420
|
+
const credentialKind = requestedKind;
|
|
421
|
+
return [createMigrationItem({
|
|
422
|
+
id: credentialKind === "oauth" ? OPENAI_OAUTH_ITEM_ID : OPENAI_API_KEY_ITEM_ID,
|
|
423
|
+
kind: "auth",
|
|
424
|
+
action: "skip",
|
|
425
|
+
source: params.source.codexHome,
|
|
426
|
+
status: "skipped",
|
|
427
|
+
sensitive: true,
|
|
428
|
+
reason: CODEX_REASON_AUTH_STORAGE_NOT_IMPORTABLE,
|
|
429
|
+
message: "No supported Codex credential could be imported. Continue with sign-in to connect OpenClaw.",
|
|
430
|
+
details: {
|
|
431
|
+
provider: OPENAI_PROVIDER_ID,
|
|
432
|
+
credentialKind,
|
|
433
|
+
credentialImportUnavailable: true
|
|
434
|
+
}
|
|
435
|
+
})];
|
|
436
|
+
}
|
|
220
437
|
const store = loadAuthProfileStoreWithoutExternalProfiles(params.targets.agentDir);
|
|
221
438
|
const skipped = !params.ctx.includeSecrets;
|
|
222
439
|
return credentials.map((credential) => {
|
|
223
440
|
const { profileId, matchedExisting } = itemProfileTarget(credential, store);
|
|
224
|
-
const
|
|
441
|
+
const existing = store.profiles[profileId];
|
|
225
442
|
const configProfile = authProfileConfigForCredential(credential, profileId);
|
|
226
443
|
const configConflict = configProfile ? hasAuthProfileConfigConflict(params.ctx.config, configProfile, Boolean(params.ctx.overwrite)) : false;
|
|
227
|
-
const conflict = (
|
|
444
|
+
const conflict = (existing && !matchedExisting && !params.ctx.overwrite || configConflict) && !skipped;
|
|
445
|
+
const unavailable = !skipped && !conflict && !params.ctx.overwrite && existing?.type === "oauth" && !hasUsableOAuthCredential(existing);
|
|
228
446
|
return createMigrationItem({
|
|
229
|
-
id:
|
|
447
|
+
id: authItemId(credential),
|
|
230
448
|
kind: "auth",
|
|
231
|
-
action: skipped ? "skip" : "create",
|
|
232
|
-
source: params.source.
|
|
449
|
+
action: skipped || unavailable ? "skip" : "create",
|
|
450
|
+
source: params.source.codexHome,
|
|
233
451
|
target: `${params.targets.agentDir}/openclaw-agent.sqlite#auth_profile_store:${profileId}`,
|
|
234
|
-
status: skipped ? "skipped" : conflict ? "conflict" : "planned",
|
|
452
|
+
status: skipped || unavailable ? "skipped" : conflict ? "conflict" : "planned",
|
|
235
453
|
sensitive: true,
|
|
236
|
-
reason: skipped ? CODEX_REASON_AUTH_NOT_SELECTED : conflict ? CODEX_REASON_AUTH_PROFILE_EXISTS : void 0,
|
|
237
|
-
message: credential.kind === "oauth" ? "Import Codex OAuth credentials and configure OpenAI Codex models." : "Import Codex OpenAI API key.",
|
|
454
|
+
reason: skipped ? CODEX_REASON_AUTH_NOT_SELECTED : conflict ? CODEX_REASON_AUTH_PROFILE_EXISTS : unavailable ? CODEX_REASON_AUTH_PROFILE_UNUSABLE : void 0,
|
|
455
|
+
message: unavailable ? "The existing OpenAI sign-in needs to be renewed. Continue with sign-in." : credential.kind === "oauth" ? configPatchMode === "none" ? "Import Codex OAuth credentials." : "Import Codex OAuth credentials and configure OpenAI Codex models." : "Import Codex OpenAI API key.",
|
|
238
456
|
details: {
|
|
239
457
|
provider: credential.provider,
|
|
240
458
|
profileId,
|
|
241
459
|
sourceProfileId: credential.profileId,
|
|
242
|
-
|
|
243
|
-
|
|
460
|
+
sourceCredentialFingerprint: sourceCredentialFingerprint(credential),
|
|
461
|
+
sourceKind: "codex-native-selected-storage",
|
|
462
|
+
credentialKind: credential.kind,
|
|
463
|
+
credentialImportUnavailable: unavailable
|
|
244
464
|
}
|
|
245
465
|
});
|
|
246
466
|
});
|
|
@@ -251,10 +471,18 @@ async function applyCodexAuthItems(params) {
|
|
|
251
471
|
const profileId = typeof item.details?.profileId === "string" ? item.details.profileId : "";
|
|
252
472
|
const provider = typeof item.details?.provider === "string" ? item.details.provider : "";
|
|
253
473
|
const sourceProfileId = typeof item.details?.sourceProfileId === "string" ? item.details.sourceProfileId : void 0;
|
|
254
|
-
|
|
255
|
-
|
|
474
|
+
const credentialKind = item.details?.credentialKind;
|
|
475
|
+
if (!profileId || !provider || credentialKind !== "oauth" && credentialKind !== "api_key") return [markMigrationItemError(item, CODEX_REASON_MISSING_AUTH_METADATA)];
|
|
476
|
+
const configPatchMode = resolveCodexConfigPatchMode(ctx);
|
|
477
|
+
const credential = (await readCodexAuthCredentials(source, {
|
|
478
|
+
credentialKind,
|
|
479
|
+
includeConfigPatch: configPatchMode !== "none",
|
|
480
|
+
allowKeychainPrompt: allowCodexKeychainPrompt(ctx),
|
|
481
|
+
signal: ctx.signal
|
|
482
|
+
})).find((candidate) => candidate.provider === provider && candidate.kind === credentialKind && (!sourceProfileId || candidate.profileId === sourceProfileId));
|
|
256
483
|
if (!credential) return [markMigrationItemSkipped(item, CODEX_REASON_AUTH_NO_LONGER_PRESENT)];
|
|
257
|
-
if (
|
|
484
|
+
if (item.details?.sourceCredentialFingerprint !== sourceCredentialFingerprint(credential)) return [markMigrationItemSkipped(item, CODEX_REASON_AUTH_NO_LONGER_PRESENT)];
|
|
485
|
+
ctx.signal?.throwIfAborted();
|
|
258
486
|
const oauthProfile = credential.kind === "oauth" ? credential.result.profiles[0] : void 0;
|
|
259
487
|
const oauthCredential = oauthProfile?.credential.type === "oauth" ? oauthProfile.credential : void 0;
|
|
260
488
|
if (credential.kind === "oauth" && !oauthCredential) return [markMigrationItemError(item, CODEX_REASON_MISSING_AUTH_METADATA)];
|
|
@@ -262,14 +490,19 @@ async function applyCodexAuthItems(params) {
|
|
|
262
490
|
if (!configProfile) return [markMigrationItemError(item, CODEX_REASON_MISSING_AUTH_METADATA)];
|
|
263
491
|
if (hasCurrentAuthProfileConfigConflict(ctx, configProfile)) return [markMigrationItemConflict(item, CODEX_REASON_AUTH_PROFILE_EXISTS)];
|
|
264
492
|
let conflicted = false;
|
|
493
|
+
let unusable = false;
|
|
265
494
|
let wrote = false;
|
|
266
495
|
const store = await updateAuthProfileStoreWithLock({
|
|
267
496
|
agentDir: targets.agentDir,
|
|
268
497
|
stateDir: ctx.stateDir,
|
|
269
498
|
updater: (freshStore) => {
|
|
499
|
+
ctx.signal?.throwIfAborted();
|
|
270
500
|
const existing = freshStore.profiles[profileId];
|
|
271
501
|
if (!ctx.overwrite && existing) {
|
|
272
|
-
if ((credential.kind === "oauth" ? findMatchingOAuthProfile(freshStore, oauthCredential) : findMatchingApiKeyProfile(freshStore, credential.provider, credential.key)) === profileId)
|
|
502
|
+
if ((credential.kind === "oauth" ? findMatchingOAuthProfile(freshStore, oauthCredential) : findMatchingApiKeyProfile(freshStore, credential.provider, credential.key)) === profileId) {
|
|
503
|
+
unusable = existing.type === "oauth" && !hasUsableOAuthCredential(existing);
|
|
504
|
+
return false;
|
|
505
|
+
}
|
|
273
506
|
conflicted = true;
|
|
274
507
|
return false;
|
|
275
508
|
}
|
|
@@ -285,8 +518,9 @@ async function applyCodexAuthItems(params) {
|
|
|
285
518
|
}
|
|
286
519
|
});
|
|
287
520
|
if (conflicted) return [markMigrationItemConflict(item, CODEX_REASON_AUTH_PROFILE_EXISTS)];
|
|
521
|
+
if (unusable) return [markMigrationItemSkipped(item, CODEX_REASON_AUTH_PROFILE_UNUSABLE)];
|
|
288
522
|
if (!store?.profiles[profileId]) return [markMigrationItemError(item, CODEX_REASON_AUTH_PROFILE_WRITE_FAILED)];
|
|
289
|
-
const configResult =
|
|
523
|
+
const configResult = configPatchMode !== "apply" ? "unavailable" : await applyCodexAuthConfig(ctx, credential, profileId);
|
|
290
524
|
if (configResult === "conflict") return [markMigrationItemConflict(item, CODEX_REASON_AUTH_PROFILE_EXISTS)];
|
|
291
525
|
const migratedItem = {
|
|
292
526
|
...item,
|
|
@@ -295,10 +529,10 @@ async function applyCodexAuthItems(params) {
|
|
|
295
529
|
...item.details,
|
|
296
530
|
wroteAuthProfile: wrote,
|
|
297
531
|
configUpdated: configResult === "configured",
|
|
298
|
-
...
|
|
532
|
+
...configPatchMode === "return" ? { configPatchReturned: true } : {}
|
|
299
533
|
}
|
|
300
534
|
};
|
|
301
|
-
return [migratedItem, ...
|
|
535
|
+
return [migratedItem, ...configPatchMode === "return" ? buildCodexAuthConfigPatchItems(ctx, migratedItem, credential, profileId) : []];
|
|
302
536
|
}
|
|
303
537
|
function buildCodexAuthConfigPatchItems(ctx, item, credential, profileId) {
|
|
304
538
|
const next = applyCredentialConfig(ctx.config, credential, profileId);
|
|
@@ -648,25 +882,27 @@ function buildPluginConfigItem(ctx, pluginItems) {
|
|
|
648
882
|
async function buildCodexMigrationPlan(ctx) {
|
|
649
883
|
const targets = resolveCodexMigrationTargets(ctx);
|
|
650
884
|
const memoryOnly = ctx.itemKinds !== void 0 && ctx.itemKinds.length > 0 && ctx.itemKinds.every((kind) => kind === "memory");
|
|
885
|
+
const authOnly = ctx.itemKinds !== void 0 && ctx.itemKinds.length > 0 && ctx.itemKinds.every((kind) => kind === "auth");
|
|
651
886
|
const source = await discoverCodexSource({
|
|
652
887
|
input: ctx.source,
|
|
653
888
|
memoryOnly,
|
|
654
|
-
|
|
889
|
+
authOnly,
|
|
890
|
+
evaluatePluginMigrationEligibility: !memoryOnly && !authOnly,
|
|
655
891
|
verifyPluginApps: shouldVerifyPluginApps(ctx)
|
|
656
892
|
});
|
|
657
|
-
if (!hasCodexSource(source)) throw new Error(`Codex state was not found at ${source.root}. Pass --from <path> if it lives elsewhere.`);
|
|
893
|
+
if (!hasCodexSource(source) && !authOnly) throw new Error(`Codex state was not found at ${source.root}. Pass --from <path> if it lives elsewhere.`);
|
|
658
894
|
const items = [];
|
|
659
|
-
items.push(...await buildCodexMemoryItems({
|
|
895
|
+
if (!authOnly) items.push(...await buildCodexMemoryItems({
|
|
660
896
|
memoryFiles: source.memoryFiles,
|
|
661
897
|
workspaceDir: targets.workspaceDir,
|
|
662
898
|
overwrite: ctx.overwrite
|
|
663
899
|
}));
|
|
664
|
-
if (!memoryOnly) {
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
900
|
+
if (!memoryOnly) items.push(...await buildCodexAuthItems({
|
|
901
|
+
ctx,
|
|
902
|
+
source,
|
|
903
|
+
targets
|
|
904
|
+
}));
|
|
905
|
+
if (!memoryOnly && !authOnly) {
|
|
670
906
|
items.push(...await buildCodexSkillItems({
|
|
671
907
|
skills: source.skills,
|
|
672
908
|
workspaceDir: targets.workspaceDir,
|
|
@@ -708,4 +944,4 @@ async function buildCodexMigrationPlan(ctx) {
|
|
|
708
944
|
};
|
|
709
945
|
}
|
|
710
946
|
//#endregion
|
|
711
|
-
export { CODEX_PLUGIN_CONFIG_ITEM_ID, CODEX_PLUGIN_CONFIG_PATH, buildCodexMigrationPlan, buildCodexPluginsConfigValue, hasCodexPluginConfigConflict, applyCodexAuthItems as n, readCodexPluginMigrationConfigEntry, resolveCodexMigrationTargets as t };
|
|
947
|
+
export { CODEX_PLUGIN_CONFIG_ITEM_ID, CODEX_PLUGIN_CONFIG_PATH, buildCodexMigrationPlan, buildCodexPluginsConfigValue, hasCodexPluginConfigConflict, applyCodexAuthItems as n, resolveCodexConfigPatchMode as r, readCodexPluginMigrationConfigEntry, resolveCodexMigrationTargets as t };
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import "./config-
|
|
4
|
-
import { i as pluginReadParams, n as isOpenAiCuratedMarketplace, r as isOpenAiCuratedMarketplaceName, t as findCodexMarketplacePluginSummary } from "./plugin-inventory-CoRCzWW4.js";
|
|
1
|
+
import { c as CODEX_PLUGINS_MARKETPLACE_NAME, i as pluginReadParams, n as isOpenAiCuratedMarketplace, r as isOpenAiCuratedMarketplaceName, t as findCodexMarketplacePluginSummary } from "./plugin-inventory-oL4Na1ZG.js";
|
|
2
|
+
import { t as CodexAppServerRpcError } from "./rpc-error-ttN_QjEm.js";
|
|
3
|
+
import "./config-oIORaQ5T.js";
|
|
5
4
|
import { coerceErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
6
5
|
//#region extensions/codex/src/app-server/plugin-activation.ts
|
|
7
6
|
/**
|
|
@@ -89,23 +88,29 @@ async function refreshCodexPluginRuntimeState(params) {
|
|
|
89
88
|
diagnostics.push({ message: `Codex hooks refresh skipped: ${coerceErrorMessage(error)}` });
|
|
90
89
|
}
|
|
91
90
|
await params.request("config/mcpServer/reload", void 0);
|
|
92
|
-
if (params.appCache && params.appCacheKey) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
forceRefetch: true,
|
|
101
|
-
targetAppIds: params.targetAppIds
|
|
102
|
-
});
|
|
103
|
-
} catch (error) {
|
|
104
|
-
diagnostics.push({ message: `Codex app inventory refresh skipped: ${coerceErrorMessage(error)}` });
|
|
105
|
-
}
|
|
91
|
+
if (params.appCache && params.appCacheKey) try {
|
|
92
|
+
await refreshCodexAppRuntimeState({
|
|
93
|
+
...params,
|
|
94
|
+
appCache: params.appCache,
|
|
95
|
+
appCacheKey: params.appCacheKey
|
|
96
|
+
});
|
|
97
|
+
} catch (error) {
|
|
98
|
+
diagnostics.push({ message: `Codex app inventory refresh skipped: ${coerceErrorMessage(error)}` });
|
|
106
99
|
}
|
|
107
100
|
return { diagnostics };
|
|
108
101
|
}
|
|
102
|
+
/** Refreshes hosted app tools without reloading unrelated active threads. */
|
|
103
|
+
async function refreshCodexAppRuntimeState(params) {
|
|
104
|
+
params.appCache.invalidate(params.appCacheKey, "Codex plugin app inventory refresh requested", void 0, params.targetAppIds);
|
|
105
|
+
if (params.deferAppInventoryRefresh) return;
|
|
106
|
+
const request = async (method, requestParams) => await params.request(method, requestParams);
|
|
107
|
+
await params.appCache.refreshNow({
|
|
108
|
+
key: params.appCacheKey,
|
|
109
|
+
request,
|
|
110
|
+
forceRefetch: true,
|
|
111
|
+
targetAppIds: params.targetAppIds
|
|
112
|
+
});
|
|
113
|
+
}
|
|
109
114
|
async function listCuratedCodexPluginMetadata(params, options = {}) {
|
|
110
115
|
const requestParams = {
|
|
111
116
|
...params.configCwd ? { cwds: [params.configCwd] } : {},
|
|
@@ -130,4 +135,4 @@ function activationFailure(identity, reason, diagnostic, extraDiagnostics = [])
|
|
|
130
135
|
};
|
|
131
136
|
}
|
|
132
137
|
//#endregion
|
|
133
|
-
export {
|
|
138
|
+
export { refreshCodexAppRuntimeState as n, refreshCodexPluginRuntimeState as r, ensureCodexPluginActivation as t };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as resolveCodexAppServerLocalHomeDir, l as resolveCodexAppServerUserHomeDir, s as resolveCodexAppServerHomeDir } from "./protocol-
|
|
1
|
+
import { c as resolveCodexAppServerLocalHomeDir, l as resolveCodexAppServerUserHomeDir, s as resolveCodexAppServerHomeDir } from "./protocol-5bh1G-H7.js";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
4
4
|
import { createHash } from "node:crypto";
|
package/dist/{plugin-approval-roundtrip-DeW95wB5.js → plugin-approval-roundtrip-Bz3FT8W5.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { P as resolveCodexGatewayTimeoutWithGraceMs } from "./shared-client-CscigXXL.js";
|
|
2
2
|
import { isApprovalNotFoundError, toErrorObject } from "openclaw/plugin-sdk/error-runtime";
|
|
3
3
|
import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
|
|
4
4
|
//#region extensions/codex/src/app-server/plugin-approval-roundtrip.ts
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import "./config-JDfTI4VI.js";
|
|
1
|
+
import { S as resolveCodexPluginsPolicy } from "./protocol-5bh1G-H7.js";
|
|
2
|
+
import "./config-oIORaQ5T.js";
|
|
4
3
|
import { embeddedAgentLog } from "openclaw/plugin-sdk/agent-harness-runtime";
|
|
4
|
+
//#region extensions/codex/src/app-server/config-contracts.ts
|
|
5
|
+
const CODEX_PLUGINS_MARKETPLACE_NAME = "openai-curated";
|
|
6
|
+
const CODEX_PLUGINS_WORKSPACE_MARKETPLACE_NAME = "workspace-directory";
|
|
7
|
+
//#endregion
|
|
5
8
|
//#region extensions/codex/src/app-server/plugin-inventory.ts
|
|
6
9
|
/**
|
|
7
10
|
* Reads Codex plugin marketplace state and app inventory to decide which
|
|
@@ -322,4 +325,4 @@ function isOpenAiCuratedMarketplaceName(marketplaceName) {
|
|
|
322
325
|
return marketplaceName === "openai-curated" || marketplaceName === CODEX_PLUGINS_REMOTE_MARKETPLACE_NAME || marketplaceName === CODEX_PLUGINS_API_MARKETPLACE_NAME;
|
|
323
326
|
}
|
|
324
327
|
//#endregion
|
|
325
|
-
export { readCodexPluginInventory as a, pluginReadParams as i, isOpenAiCuratedMarketplace as n, resolveOwnedAppApprovalOverrideKeys as o, isOpenAiCuratedMarketplaceName as r, resolveRecoverableCodexPluginConfigKeys as s, findCodexMarketplacePluginSummary as t };
|
|
328
|
+
export { readCodexPluginInventory as a, CODEX_PLUGINS_MARKETPLACE_NAME as c, pluginReadParams as i, CODEX_PLUGINS_WORKSPACE_MARKETPLACE_NAME as l, isOpenAiCuratedMarketplace as n, resolveOwnedAppApprovalOverrideKeys as o, isOpenAiCuratedMarketplaceName as r, resolveRecoverableCodexPluginConfigKeys as s, findCodexMarketplacePluginSummary as t };
|