@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.
Files changed (97) hide show
  1. package/dist/api.js +26 -18
  2. package/dist/{apply-B6el6hdO.js → apply-CvT8tW5i.js} +11 -12
  3. package/dist/{attempt-client-cleanup-D6cR54TV.js → attempt-client-cleanup-DKHzbwt5.js} +8 -204
  4. package/dist/{attempt-context-AO4DSjE0.js → attempt-context-D44yeDII.js} +3 -3
  5. package/dist/{attempt-notifications--H8zXR5-.js → attempt-notifications-C9XufG6l.js} +1 -1
  6. package/dist/{auth-binding-Co2Vfcf_.js → auth-binding-CWlKVccJ.js} +1 -1
  7. package/dist/{auth-cache-key-Kq6oerr6.js → auth-cache-key-7orQae_j.js} +2 -2
  8. package/dist/{binding-connection-QqgcPCgk.js → binding-connection-D3udKbIE.js} +3 -3
  9. package/dist/{bounded-turn-lRpmZHFv.js → bounded-turn-C_Hneydj.js} +12 -12
  10. package/dist/{build-state-6RL6qohz.js → build-state-BCmg9-5p.js} +1 -1
  11. package/dist/{capabilities-BeqLPbtM.js → capabilities-8vx68WLH.js} +1 -1
  12. package/dist/cli-metadata.js +1 -1
  13. package/dist/{client-BEKu4yDx.js → client-B57KWPQx.js} +27 -5
  14. package/dist/{command-dispatch-CisT9Jqq.js → command-dispatch-BpduNGVf.js} +3 -3
  15. package/dist/{command-formatters-DeTfrapr.js → command-formatters-lxlkNZgU.js} +4 -3
  16. package/dist/{command-handlers-BfIsJEuA.js → command-handlers-tiL9iWj7.js} +783 -140
  17. package/dist/{command-rpc-BMqRQOFX.js → command-rpc-CR5EOEZX.js} +26 -19
  18. package/dist/{compact-CGJZ2rlb.js → compact-B_H3AOd7.js} +14 -14
  19. package/dist/{config-JDfTI4VI.js → config-oIORaQ5T.js} +4 -4
  20. package/dist/{config-options-jnIFvwxD.js → config-options-CXMq1T-C.js} +5 -5
  21. package/dist/{config-runtime-BWf6JLWG.js → config-runtime-D0zGNIHu.js} +1 -1
  22. package/dist/{config-utils-C57JiJrU.js → config-utils-DujwEnhg.js} +2 -4
  23. package/dist/{conversation-binding-CxOlHiix.js → conversation-binding-DsB4-O7U.js} +53 -42
  24. package/dist/{conversation-control-CUCrSIQI.js → conversation-control-CtUu1b3m.js} +8 -8
  25. package/dist/doctor-contract-api.js +1 -1
  26. package/dist/{dynamic-tools-D-JBoaLt.js → dynamic-tools-CmN5RAip.js} +76 -15
  27. package/dist/{effective-mcp-catalog-J_5Ep5Um.js → effective-mcp-catalog-Bd73bqA8.js} +3 -3
  28. package/dist/{ephemeral-turn-DSwzP8YY.js → ephemeral-turn-D78_VmzO.js} +5 -5
  29. package/dist/event-projector-items-5VhsECCO.js +200 -0
  30. package/dist/{event-projector-usage-CIyrYYid.js → event-projector-usage-BfXmpOec.js} +1 -1
  31. package/dist/{harness-FR6eQgyO.js → harness-C7rRa7bm.js} +33 -16
  32. package/dist/harness.js +1 -1
  33. package/dist/index.js +39 -84
  34. package/dist/inference-context-Dr_mzvk4.js +94 -0
  35. package/dist/inference-proxy-HGXKUIre.js +311 -0
  36. package/dist/{isolated-completion-DHBefrzg.js → isolated-completion-DWVb5U2J.js} +6 -6
  37. package/dist/{managed-binary-DrjjRRUD.js → managed-binary-D22rNEcR.js} +10 -1
  38. package/dist/media-understanding-provider.js +2 -2
  39. package/dist/migration-provider-api.js +2 -0
  40. package/dist/{model-catalog-B_6M04Wo.js → model-catalog-Dq2n8f_p.js} +6 -6
  41. package/dist/{models-P9k2qAof.js → models-PCKOim-h.js} +3 -3
  42. package/dist/native-subagent-history-DjtPloaU.js +140 -0
  43. package/dist/native-subagent-history-owner-Pcp7JuVF.js +34 -0
  44. package/dist/{native-subagent-monitor-BbCUKRwC.js → native-subagent-monitor-fQ7eIXEf.js} +52 -424
  45. package/dist/native-subagent-task-ids-BzTdT0Uw.js +387 -0
  46. package/dist/{node-cli-sessions-rj0ysJwM.js → node-cli-sessions-DKaOmVUh.js} +1 -1
  47. package/dist/{node-exec-server.runtime-BY_ctYnT.js → node-exec-server.runtime-Cl2vapEi.js} +3 -3
  48. package/dist/{plan-BMJdMOEF.js → plan-7uG-Fp36.js} +288 -52
  49. package/dist/{plugin-activation-BQK-f5sV.js → plugin-activation-BYQculil.js} +24 -19
  50. package/dist/{plugin-app-cache-key-CdSQzWyX.js → plugin-app-cache-key-d0eKxy7b.js} +1 -1
  51. package/dist/{plugin-approval-roundtrip-DeW95wB5.js → plugin-approval-roundtrip-Bz3FT8W5.js} +1 -1
  52. package/dist/{plugin-inventory-CoRCzWW4.js → plugin-inventory-oL4Na1ZG.js} +7 -4
  53. package/dist/{plugin-marketplace-discovery-3akBizzF.js → plugin-marketplace-discovery-P-Vndfqq.js} +18 -15
  54. package/dist/{plugin-metadata-cache-DgNfRAGA.js → plugin-metadata-cache-ClPJpRio.js} +13 -9
  55. package/dist/{protocol-CAAcVIKF.js → protocol-5bh1G-H7.js} +1 -1
  56. package/dist/provider-MQ8PVkuE.js +50 -0
  57. package/dist/{provider-capabilities-W4tfK5Y5.js → provider-capabilities-BvCUL69A.js} +2 -2
  58. package/dist/{rate-limits-Bqnx1N4z.js → rate-limits-CBMmWBr9.js} +1 -1
  59. package/dist/{request-CGvGOpeR.js → request-B7hEkBGq.js} +72 -58
  60. package/dist/rpc-error-ttN_QjEm.js +30 -0
  61. package/dist/{run-attempt-DwKds3DN.js → run-attempt-CvsAAGa0.js} +108 -37
  62. package/dist/{runtime-artifact-T-NwqeSH.js → runtime-artifact-BJ0rXBZ_.js} +1 -1
  63. package/dist/{sandbox-guard-BcT66fWy.js → sandbox-guard-BxgyoM8M.js} +2 -1
  64. package/dist/{session-binding-CKSepwIC.js → session-binding-CI8UuilT.js} +3 -3
  65. package/dist/{session-binding-record-CaZjYwNS.js → session-binding-record-Bcvslnhf.js} +1 -1
  66. package/dist/{session-catalog-adoption-BKLtSrwi.js → session-catalog-adoption-tcZi1IfX.js} +5 -5
  67. package/dist/{session-catalog-archive-D0i2pGj2.js → session-catalog-archive-CwKg8Xz2.js} +6 -6
  68. package/dist/{session-catalog-HaDcp7Sv.js → session-catalog-ct-AH01I.js} +31 -87
  69. package/dist/session-catalog-home-id-CwhLdC03.js +18 -0
  70. package/dist/{session-catalog-node-adoption-BUuDYY8R.js → session-catalog-node-adoption-B1tgDW-m.js} +2 -2
  71. package/dist/{session-catalog-node-continue-CBtc4wkI.js → session-catalog-node-continue-Ci-DXyJP.js} +4 -4
  72. package/dist/{session-catalog-provenance-DkJHo735.js → session-catalog-provenance-D-dIfRAH.js} +2 -30
  73. package/dist/{session-cli-CbgaHh0f.js → session-cli-DNN_jhGc.js} +2 -2
  74. package/dist/{session-history-import-DFN7sWRU.js → session-history-import-DwyijFI6.js} +4 -4
  75. package/dist/session-history-worker-runtime.js +1 -1
  76. package/dist/{session-history.worker-CNEvGaU5.js → session-history.worker-BeK1YOyT.js} +187 -83
  77. package/dist/session-history.worker.js +1 -1
  78. package/dist/{session-initialization-Jo86C60I.js → session-initialization-Ct0_Hzmg.js} +2 -2
  79. package/dist/{session-permission-policy-B22InTp_.js → session-permission-policy-BBmXA8Eg.js} +2 -2
  80. package/dist/{session-retirement-BSNG_mhf.js → session-retirement-B2YfbAAT.js} +5 -5
  81. package/dist/{settled-turn-finalizer-BuLUrZl2.js → settled-turn-finalizer-Dn91stmc.js} +5 -5
  82. package/dist/{shared-client-CVhez2Uo.js → shared-client-CscigXXL.js} +228 -30
  83. package/dist/{side-question-DLbr2vUU.js → side-question-BGMJQf4U.js} +18 -18
  84. package/dist/{source-Da-h6f7e.js → source-CElXU0Oy.js} +12 -12
  85. package/dist/{thread-archive-guard-D1bP04Tf.js → thread-archive-guard-DfpBr-Sz.js} +1 -1
  86. package/dist/{session-catalog-parsing-CdD3JhdM.js → thread-history-page-D0JIp48V.js} +83 -2
  87. package/dist/{thread-lifecycle-D1pzRwHB.js → thread-lifecycle-DXl1-I6b.js} +96 -44
  88. package/dist/{thread-ownership-D6oASVRu.js → thread-ownership-BsDRTsyp.js} +2 -2
  89. package/dist/{thread-policy-D8kI7yAO.js → thread-policy-BuEQfE0g.js} +3 -3
  90. package/dist/{thread-resume-T5cveyxA.js → thread-resume-DsDOZpFg.js} +5 -5
  91. package/dist/{session-catalog-home-id-D7-aLiNt.js → transcript-history-projection-v17wXgdK.js} +66 -18
  92. package/dist/{transcript-mirror-t5TOccct.js → transcript-mirror-C5CKgNy6.js} +1 -1
  93. package/dist/{upstream-session-fork-De-sLJ2r.js → upstream-session-fork-BZerMte_.js} +20 -20
  94. package/dist/{usage-CPPTmBvZ.js → usage-tCk-mg_x.js} +4 -4
  95. package/dist/{web-search-provider.runtime-CSVgQL0w.js → web-search-provider.runtime-B7bGbGWq.js} +3 -3
  96. package/openclaw.plugin.json +1 -0
  97. package/package.json +4 -4
@@ -1,25 +1,192 @@
1
- import { m as CODEX_PLUGINS_MARKETPLACE_NAME } from "./config-utils-C57JiJrU.js";
2
- import "./config-JDfTI4VI.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-Da-h6f7e.js";
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, readCodexCliCredentialsCached, resolveOpenAICodexAuthIdentity, resolveOpenAICodexImportProfileName, updateAuthProfileStoreWithLock } from "openclaw/plugin-sdk/provider-auth";
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 CODEX_CONFIG_PATCH_MODE_RETURN = "return";
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 = readCodexCliCredentialsCached({
202
+ async function buildCodexOAuthCredential(source, includeConfigPatch, options) {
203
+ const credential = await readCodexCliCredentialsAsync({
37
204
  codexHome: source.codexHome,
38
- allowKeychainPrompt: false,
39
- ttlMs: 0
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 modelRefs = await readModelRefs(source);
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 raw = await readJsonObject(source.authPath);
74
- const key = normalizeOptionalString(raw.OPENAI_API_KEY);
75
- if (!key) return null;
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), await buildCodexApiKeyCredential(source)].filter((entry) => entry !== null);
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
- if (credential.accountId && existing.accountId === credential.accountId) return profileId;
90
- if ((!credential.accountId || !existing.accountId) && credential.email && existing.email === credential.email) return profileId;
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 shouldReturnAuthConfigPatch(ctx) {
172
- return ctx.providerOptions?.configPatchMode === CODEX_CONFIG_PATCH_MODE_RETURN;
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 credentials = await readCodexAuthCredentials(params.source);
219
- if (credentials.length === 0) return [];
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 targetExists = Boolean(store.profiles[profileId]);
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 = (targetExists && !matchedExisting && !params.ctx.overwrite || configConflict) && !skipped;
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: `auth:${credential.provider}`,
447
+ id: authItemId(credential),
230
448
  kind: "auth",
231
- action: skipped ? "skip" : "create",
232
- source: params.source.authPath,
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
- sourceKind: "codex-auth-json",
243
- credentialKind: credential.kind
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
- if (!profileId || !provider) return [markMigrationItemError(item, CODEX_REASON_MISSING_AUTH_METADATA)];
255
- const credential = (await readCodexAuthCredentials(source)).find((candidate) => candidate.provider === provider);
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 (credential.kind === "oauth" && sourceProfileId && credential.profileId !== sourceProfileId) return [markMigrationItemSkipped(item, CODEX_REASON_AUTH_NO_LONGER_PRESENT)];
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) return false;
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 = shouldReturnAuthConfigPatch(ctx) ? "unavailable" : await applyCodexAuthConfig(ctx, credential, profileId);
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
- ...shouldReturnAuthConfigPatch(ctx) ? { configPatchReturned: true } : {}
532
+ ...configPatchMode === "return" ? { configPatchReturned: true } : {}
299
533
  }
300
534
  };
301
- return [migratedItem, ...shouldReturnAuthConfigPatch(ctx) ? buildCodexAuthConfigPatchItems(ctx, migratedItem, credential, profileId) : []];
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
- evaluatePluginMigrationEligibility: !memoryOnly,
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
- items.push(...await buildCodexAuthItems({
666
- ctx,
667
- source,
668
- targets
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 { m as CODEX_PLUGINS_MARKETPLACE_NAME } from "./config-utils-C57JiJrU.js";
2
- import { r as CodexAppServerRpcError } from "./session-catalog-provenance-DkJHo735.js";
3
- import "./config-JDfTI4VI.js";
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
- params.appCache.invalidate(params.appCacheKey, "Codex plugin activation changed app inventory", void 0, params.targetAppIds);
94
- if (params.deferAppInventoryRefresh) return { diagnostics };
95
- const request = async (method, requestParams) => await params.request(method, requestParams);
96
- try {
97
- await params.appCache.refreshNow({
98
- key: params.appCacheKey,
99
- request,
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 { refreshCodexPluginRuntimeState as n, ensureCodexPluginActivation as t };
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-CAAcVIKF.js";
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";
@@ -1,4 +1,4 @@
1
- import { A as resolveCodexGatewayTimeoutWithGraceMs } from "./shared-client-CVhez2Uo.js";
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 { h as CODEX_PLUGINS_WORKSPACE_MARKETPLACE_NAME, m as CODEX_PLUGINS_MARKETPLACE_NAME } from "./config-utils-C57JiJrU.js";
2
- import { S as resolveCodexPluginsPolicy } from "./protocol-CAAcVIKF.js";
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 };