dsh-codex-connect 0.1.0-alpha.4.20 → 0.1.0-alpha.4.21

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/lib/client.js CHANGED
@@ -2869,12 +2869,18 @@ window.__ModuleLoader__.load({
2869
2869
  unknownResult: "The image result could not be displayed safely.",
2870
2870
  imageDetails: "Image details",
2871
2871
  imageDetail: "{name}: {format} · {width} × {height} · {size}",
2872
+ originalImageDetail: "Original {name}: {format} · {width} × {height} · {size}",
2873
+ previewImageDetail: "Conversation preview: {format} · {width} × {height} · {size}",
2872
2874
  download: "Download",
2873
2875
  downloadNamed: "Download {name}",
2876
+ downloadOriginal: "Download original",
2877
+ downloadOriginalNamed: "Download original {name}",
2878
+ downloadPreview: "Download preview",
2879
+ downloadPreviewNamed: "Download preview {name}",
2874
2880
  downloading: "Downloading…",
2875
2881
  downloadFailed: "Download failed. Retry",
2876
2882
  image: "Generated image",
2877
- open: "Open original image",
2883
+ open: "Open image preview",
2878
2884
  openNamed: "Open {name}",
2879
2885
  loading: "Loading image",
2880
2886
  loadFailed: "Image could not be loaded. Retry",
@@ -3072,12 +3078,18 @@ window.__ModuleLoader__.load({
3072
3078
  unknownResult: "无法安全显示这次图片结果。",
3073
3079
  imageDetails: "图片详情",
3074
3080
  imageDetail: "{name}:{format} · {width} × {height} · {size}",
3081
+ originalImageDetail: "原图 {name}:{format} · {width} × {height} · {size}",
3082
+ previewImageDetail: "对话预览:{format} · {width} × {height} · {size}",
3075
3083
  download: "下载",
3076
3084
  downloadNamed: "下载 {name}",
3085
+ downloadOriginal: "下载原图",
3086
+ downloadOriginalNamed: "下载原图 {name}",
3087
+ downloadPreview: "下载预览图",
3088
+ downloadPreviewNamed: "下载预览图 {name}",
3077
3089
  downloading: "正在下载…",
3078
3090
  downloadFailed: "下载失败,重试",
3079
3091
  image: "生成的图片",
3080
- open: "打开原图",
3092
+ open: "打开图片预览",
3081
3093
  openNamed: "打开 {name}",
3082
3094
  loading: "正在加载图片",
3083
3095
  loadFailed: "图片加载失败,重试",
@@ -3165,6 +3177,38 @@ window.__ModuleLoader__.load({
3165
3177
  dismissUpdate: "稍后提醒"
3166
3178
  };
3167
3179
  //#endregion
3180
+ //#region src/image-assets-contract.ts
3181
+ /** Same-origin endpoint serving one session-owned original generated image. */
3182
+ const OPENAI_CODEX_ORIGINAL_IMAGE_PATH = "/plugins/dsh-codex-connect/images/original";
3183
+ /** Opaque identifier format for one plugin-owned original image. */
3184
+ const OPENAI_CODEX_IMAGE_ASSET_ID_PATTERN = /^img_[0-9a-f]{32}$/u;
3185
+ function positiveSafeInteger$1(value) {
3186
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
3187
+ }
3188
+ /** Decode session-log metadata without trusting an asset id, filename, or media type. */
3189
+ function decodeOpenAICodexOriginalImageRef(value) {
3190
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
3191
+ const candidate = value;
3192
+ if (typeof candidate.assetId !== "string" || !OPENAI_CODEX_IMAGE_ASSET_ID_PATTERN.test(candidate.assetId) || candidate.mediaType !== "image/png" && candidate.mediaType !== "image/jpeg" && candidate.mediaType !== "image/webp" || !positiveSafeInteger$1(candidate.width) || !positiveSafeInteger$1(candidate.height) || !positiveSafeInteger$1(candidate.bytes) || candidate.bytes > 50331648 || typeof candidate.name !== "string" || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(candidate.name) || typeof candidate.sha256 !== "string" || !/^[0-9a-f]{64}$/u.test(candidate.sha256)) return void 0;
3193
+ return {
3194
+ assetId: candidate.assetId,
3195
+ mediaType: candidate.mediaType,
3196
+ width: candidate.width,
3197
+ height: candidate.height,
3198
+ bytes: candidate.bytes,
3199
+ name: candidate.name,
3200
+ sha256: candidate.sha256
3201
+ };
3202
+ }
3203
+ /** Build a same-origin URL without allowing either opaque id to become a path segment. */
3204
+ function openAICodexOriginalImageUrl(sessionId, assetId) {
3205
+ const query = new URLSearchParams({
3206
+ sessionId,
3207
+ assetId
3208
+ });
3209
+ return `${OPENAI_CODEX_ORIGINAL_IMAGE_PATH}?${query.toString()}`;
3210
+ }
3211
+ //#endregion
3168
3212
  //#region src/image-presentation.ts
3169
3213
  /** Stable metadata marker for generated image result views. */
3170
3214
  const IMAGE_PRESENTATION_KIND = "codex-connect-images";
@@ -3192,10 +3236,32 @@ window.__ModuleLoader__.load({
3192
3236
  if (typeof value !== "object" || value === null) return void 0;
3193
3237
  const candidate = value;
3194
3238
  if (candidate.kind !== "codex-connect-images" || typeof candidate.prompt !== "string" || candidate.prompt.length < 1 || candidate.prompt.length > 32e3 || !Array.isArray(candidate.images) || candidate.images.length < 1 || candidate.images.length > 4) return void 0;
3195
- const images = candidate.images.map(imageRef);
3196
- if (images.some((image) => image === void 0)) return void 0;
3239
+ if (candidate.schemaVersion === void 0) {
3240
+ const previews = candidate.images.map(imageRef);
3241
+ if (previews.some((image) => image === void 0)) return void 0;
3242
+ return {
3243
+ kind: IMAGE_PRESENTATION_KIND,
3244
+ schemaVersion: 1,
3245
+ prompt: candidate.prompt,
3246
+ images: previews.map((preview) => ({ preview }))
3247
+ };
3248
+ }
3249
+ if (candidate.schemaVersion !== 1) return void 0;
3250
+ const images = [];
3251
+ for (const value of candidate.images) {
3252
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
3253
+ const entry = value;
3254
+ const preview = imageRef(entry.preview);
3255
+ const original = decodeOpenAICodexOriginalImageRef(entry.original);
3256
+ if (preview === void 0 || original === void 0) return void 0;
3257
+ images.push({
3258
+ preview,
3259
+ original
3260
+ });
3261
+ }
3197
3262
  return {
3198
3263
  kind: IMAGE_PRESENTATION_KIND,
3264
+ schemaVersion: 1,
3199
3265
  prompt: candidate.prompt,
3200
3266
  images
3201
3267
  };
@@ -3791,7 +3857,19 @@ window.__ModuleLoader__.load({
3791
3857
  children: t("actionFailed")
3792
3858
  }) : null;
3793
3859
  }
3794
- function DownloadButton({ image, label, load, t }) {
3860
+ function triggerDownload(url, name) {
3861
+ const anchor = document.createElement("a");
3862
+ anchor.href = url;
3863
+ anchor.download = name;
3864
+ anchor.rel = "noopener";
3865
+ document.body.append(anchor);
3866
+ try {
3867
+ anchor.click();
3868
+ } finally {
3869
+ anchor.remove();
3870
+ }
3871
+ }
3872
+ function DownloadButton({ label, onDownload, t }) {
3795
3873
  const [state, setState] = (0, react.useState)("idle");
3796
3874
  const alive = (0, react.useRef)(true);
3797
3875
  (0, react.useEffect)(() => () => {
@@ -3801,17 +3879,7 @@ window.__ModuleLoader__.load({
3801
3879
  if (state === "pending") return;
3802
3880
  setState("pending");
3803
3881
  try {
3804
- const url = await load(image);
3805
- const anchor = document.createElement("a");
3806
- anchor.href = url;
3807
- anchor.download = image.name ?? t("image");
3808
- anchor.rel = "noopener";
3809
- document.body.append(anchor);
3810
- try {
3811
- anchor.click();
3812
- } finally {
3813
- anchor.remove();
3814
- }
3882
+ await onDownload();
3815
3883
  if (alive.current) setState("idle");
3816
3884
  } catch {
3817
3885
  if (alive.current) setState("failed");
@@ -3835,6 +3903,22 @@ window.__ModuleLoader__.load({
3835
3903
  children: status
3836
3904
  })] });
3837
3905
  }
3906
+ async function downloadOriginal(sessionId, original) {
3907
+ const response = await fetch(openAICodexOriginalImageUrl(sessionId, original.assetId), {
3908
+ method: "GET",
3909
+ headers: { accept: original.mediaType },
3910
+ credentials: "same-origin"
3911
+ });
3912
+ if (!response.ok) throw new Error("Original image download failed");
3913
+ const blob = await response.blob();
3914
+ if (blob.size !== original.bytes) throw new Error("Original image download was incomplete");
3915
+ const url = URL.createObjectURL(blob);
3916
+ try {
3917
+ triggerDownload(url, original.name);
3918
+ } finally {
3919
+ URL.revokeObjectURL(url);
3920
+ }
3921
+ }
3838
3922
  function PromptPanel({ prompt, t }) {
3839
3923
  const [copyState, setCopyState] = (0, react.useState)("idle");
3840
3924
  const [hovered, setHovered] = (0, react.useState)(false);
@@ -4151,7 +4235,7 @@ window.__ModuleLoader__.load({
4151
4235
  style: header,
4152
4236
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("completed") })
4153
4237
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CodexImageGallery, {
4154
- images: decoded.images.map((attachment) => ({ attachment })),
4238
+ images: decoded.images.map((image) => ({ attachment: image.preview })),
4155
4239
  load,
4156
4240
  align: "start",
4157
4241
  labels: galleryLabels
@@ -4196,12 +4280,21 @@ window.__ModuleLoader__.load({
4196
4280
  flexWrap: "wrap",
4197
4281
  gap: 8
4198
4282
  },
4199
- children: decoded.images.map((image, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadButton, {
4200
- image,
4201
- load,
4202
- t,
4203
- label: decoded.images.length === 1 ? t("download") : t("downloadNamed", { name: image.name ?? String(index + 1) })
4204
- }, image.attachmentId))
4283
+ children: decoded.images.flatMap((image, index) => {
4284
+ const suffix = image.preview.name ?? String(index + 1);
4285
+ const exactOriginal = image.original;
4286
+ return [...exactOriginal === void 0 ? [] : [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadButton, {
4287
+ onDownload: () => downloadOriginal(sessionId, exactOriginal),
4288
+ t,
4289
+ label: decoded.images.length === 1 ? t("downloadOriginal") : t("downloadOriginalNamed", { name: exactOriginal.name })
4290
+ }, `${image.preview.attachmentId}:original`)], /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadButton, {
4291
+ onDownload: async () => {
4292
+ triggerDownload(await load(image.preview), image.preview.name ?? t("image"));
4293
+ },
4294
+ t,
4295
+ label: image.original === void 0 ? decoded.images.length === 1 ? t("download") : t("downloadNamed", { name: suffix }) : decoded.images.length === 1 ? t("downloadPreview") : t("downloadPreviewNamed", { name: suffix })
4296
+ }, `${image.preview.attachmentId}:preview`)];
4297
+ })
4205
4298
  }),
4206
4299
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("details", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("summary", {
4207
4300
  style: {
@@ -4217,20 +4310,37 @@ window.__ModuleLoader__.load({
4217
4310
  gap: 4,
4218
4311
  marginTop: 6
4219
4312
  },
4220
- children: decoded.images.map((image, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("imageDetail", {
4221
- name: image.name ?? String(index + 1),
4222
- format: formatMediaType(image.mediaType),
4223
- width: image.width,
4224
- height: image.height,
4225
- size: formatBytes(image.bytes)
4226
- }) }, image.attachmentId))
4313
+ children: decoded.images.flatMap((image, index) => {
4314
+ const preview = image.preview;
4315
+ const original = image.original;
4316
+ const name = preview.name ?? String(index + 1);
4317
+ if (original === void 0) return [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("imageDetail", {
4318
+ name,
4319
+ format: formatMediaType(preview.mediaType),
4320
+ width: preview.width,
4321
+ height: preview.height,
4322
+ size: formatBytes(preview.bytes)
4323
+ }) }, preview.attachmentId)];
4324
+ return [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("originalImageDetail", {
4325
+ name: original.name,
4326
+ format: formatMediaType(original.mediaType),
4327
+ width: original.width,
4328
+ height: original.height,
4329
+ size: formatBytes(original.bytes)
4330
+ }) }, `${preview.attachmentId}:original`), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("previewImageDetail", {
4331
+ format: formatMediaType(preview.mediaType),
4332
+ width: preview.width,
4333
+ height: preview.height,
4334
+ size: formatBytes(preview.bytes)
4335
+ }) }, `${preview.attachmentId}:preview`)];
4336
+ })
4227
4337
  })] })
4228
4338
  ] })
4229
4339
  });
4230
4340
  }
4231
4341
  //#endregion
4232
4342
  //#region src/version.ts
4233
- const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.20";
4343
+ const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.21";
4234
4344
  //#endregion
4235
4345
  //#region src/client/index.tsx
4236
4346
  /** Stable browser-plugin name. */
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as OPENAI_CODEX_PROXY_PROBE_URL, A as openAICodexConflictMessage, At as openAICodexAuthPath, B as DSH_PLUGIN_API_PACKAGES, C as OpenAICodexTransport, Ct as readOpenAICodexRateLimits, D as IMAGE_GENERATE_TOOL_NAME, Dt as OPENAI_CODEX_AUTH_FILENAME, E as VIEW_IMAGE_TOOL_NAME, Et as openAICodexAuthStatus, F as parseOpenAICodexUpdateResult, G as assessCompatibility, H as SUPPORTED_DSH_PLUGIN_API_VERSION, I as parseOpenAICodexVersion, J as OPENAI_CODEX_PROXY_DETECT_PATH, K as detectCompatibility, L as COMPATIBILITY_CONTRACT, M as OPENAI_CODEX_UPDATE_PATH, N as checkForOpenAICodexUpdate, O as assertNoOpenAICodexProviderConflict, Ot as OPENAI_CODEX_PROVIDER, P as compareOpenAICodexVersions, Q as OPENAI_CODEX_PROXY_PROBE_TIMEOUT_MS, R as COMPATIBILITY_PACKAGES, S as OPENAI_CODEX_TRANSPORT_SERVICE, St as parseOpenAICodexUsage, T as isOpenAICodexTransportError, Tt as logoutOpenAICodex, U as SUPPORTED_NODE_RANGE, V as PI_AI_PACKAGE, W as SUPPORTED_PI_AI_VERSION, X as OPENAI_CODEX_LOCAL_PROXY_CANDIDATES, Y as OPENAI_CODEX_PROXY_TEST_PATH, Z as OPENAI_CODEX_PROXY_CANDIDATE_LIMIT, _ as OPENAI_CODEX_IMAGE_MAX_RESPONSE_BYTES, _t as OPENAI_CODEX_FAST_MODE_MAX_SESSION_ID_LENGTH, a as name, at as DEFAULT_OPENAI_CODEX_SEARCH_MAX_OUTPUT_TOKENS, b as OPENAI_CODEX_TRANSPORT_API_VERSION, c as migrateOpenAICodexSearchHistory, ct as DEFAULT_OPENAI_CODEX_SETTINGS, d as OPENAI_CODEX_SEARCH_URL, dt as isValidOpenAICodexProxyUrl, et as OpenAICodexProxyManager, f as OpenAICodexSearchProvider, ft as resolveOpenAICodexProxyUrl, g as OPENAI_CODEX_IMAGE_MAX_ERROR_BYTES, gt as OPENAI_CODEX_FAST_MODE_MAX_SESSIONS, h as OPENAI_CODEX_IMAGE_MAX_COUNT, ht as FastModeRegistry, i as inject, it as DEFAULT_OPENAI_CODEX_SEARCH_CONTEXT_SIZE, k as diagnoseOpenAICodex, kt as OpenAICodexCredentialStore, l as OPENAI_CODEX_BASE_URL, lt as OPENAI_CODEX_SETTINGS_NAMESPACE, m as OPENAI_CODEX_IMAGE_GENERATION_URL, mt as OPENAI_CODEX_FAST_MODE_PATH, n as OPENAI_CODEX_SETTINGS_NS, nt as listOpenAICodexProxyCandidates, o as OPENAI_CODEX_HISTORY_BACKUP_SUFFIX, ot as DEFAULT_OPENAI_CODEX_SEARCH_MODE, p as mapOpenAICodexSearchResponse, pt as resolveOpenAICodexSettings, q as evaluateCompatibility, r as apply, rt as DEFAULT_OPENAI_CODEX_PROXY_URL, s as OPENAI_CODEX_SEARCH_MODEL_REQUEST_EVENT, st as DEFAULT_OPENAI_CODEX_SEARCH_MODEL, t as Config, tt as detectOpenAICodexProxies, u as OPENAI_CODEX_SEARCH_PROVIDER, ut as decodeOpenAICodexSettings, v as OPENAI_CODEX_IMAGE_PROMPT_MAX_LENGTH, vt as isFastModeSessionId, w as OpenAICodexTransportError, wt as loginOpenAICodex, x as OPENAI_CODEX_TRANSPORT_ERROR_CODES, xt as OPENAI_CODEX_USAGE_URL, y as OPENAI_CODEX_IMAGE_REQUEST_TIMEOUT_MS, z as COMPATIBILITY_SCHEMA_VERSION } from "./src-B2d5HLN5.js";
1
+ import { $ as OPENAI_CODEX_PROXY_PROBE_TIMEOUT_MS, A as openAICodexConflictMessage, At as OPENAI_CODEX_AUTH_FILENAME, B as DSH_PLUGIN_API_PACKAGES, C as OpenAICodexTransport, Ct as OPENAI_CODEX_USAGE_URL, D as IMAGE_GENERATE_TOOL_NAME, Dt as logoutOpenAICodex, E as VIEW_IMAGE_TOOL_NAME, Et as loginOpenAICodex, F as parseOpenAICodexUpdateResult, G as assessCompatibility, H as SUPPORTED_DSH_PLUGIN_API_VERSION, I as parseOpenAICodexVersion, K as detectCompatibility, L as COMPATIBILITY_CONTRACT, M as OPENAI_CODEX_UPDATE_PATH, Mt as OpenAICodexCredentialStore, N as checkForOpenAICodexUpdate, Nt as openAICodexAuthPath, O as assertNoOpenAICodexProviderConflict, Ot as openAICodexAuthStatus, P as compareOpenAICodexVersions, Q as OPENAI_CODEX_PROXY_CANDIDATE_LIMIT, R as COMPATIBILITY_PACKAGES, S as OPENAI_CODEX_TRANSPORT_SERVICE, T as isOpenAICodexTransportError, Tt as readOpenAICodexRateLimits, U as SUPPORTED_NODE_RANGE, V as PI_AI_PACKAGE, W as SUPPORTED_PI_AI_VERSION, X as OPENAI_CODEX_PROXY_TEST_PATH, Y as OPENAI_CODEX_PROXY_DETECT_PATH, Z as OPENAI_CODEX_LOCAL_PROXY_CANDIDATES, _ as OPENAI_CODEX_IMAGE_MAX_RESPONSE_BYTES, _t as FastModeRegistry, a as name, at as DEFAULT_OPENAI_CODEX_SEARCH_CONTEXT_SIZE, b as OPENAI_CODEX_TRANSPORT_API_VERSION, bt as isFastModeSessionId, c as migrateOpenAICodexSearchHistory, ct as DEFAULT_OPENAI_CODEX_SEARCH_MODEL, d as OPENAI_CODEX_SEARCH_URL, dt as decodeOpenAICodexSettings, et as OPENAI_CODEX_PROXY_PROBE_URL, f as OpenAICodexSearchProvider, ft as isValidOpenAICodexProxyUrl, g as OPENAI_CODEX_IMAGE_MAX_ERROR_BYTES, gt as OPENAI_CODEX_FAST_MODE_PATH, h as OPENAI_CODEX_IMAGE_MAX_COUNT, ht as resolveOpenAICodexSettings, i as inject, it as DEFAULT_OPENAI_CODEX_PROXY_URL, jt as OPENAI_CODEX_PROVIDER, k as diagnoseOpenAICodex, l as OPENAI_CODEX_BASE_URL, lt as DEFAULT_OPENAI_CODEX_SETTINGS, m as OPENAI_CODEX_IMAGE_GENERATION_URL, mt as resolveOpenAICodexProxyUrl, n as OPENAI_CODEX_SETTINGS_NS, nt as detectOpenAICodexProxies, o as OPENAI_CODEX_HISTORY_BACKUP_SUFFIX, ot as DEFAULT_OPENAI_CODEX_SEARCH_MAX_OUTPUT_TOKENS, p as mapOpenAICodexSearchResponse, q as evaluateCompatibility, r as apply, rt as listOpenAICodexProxyCandidates, s as OPENAI_CODEX_SEARCH_MODEL_REQUEST_EVENT, st as DEFAULT_OPENAI_CODEX_SEARCH_MODE, t as Config, tt as OpenAICodexProxyManager, u as OPENAI_CODEX_SEARCH_PROVIDER, ut as OPENAI_CODEX_SETTINGS_NAMESPACE, v as OPENAI_CODEX_IMAGE_PROMPT_MAX_LENGTH, vt as OPENAI_CODEX_FAST_MODE_MAX_SESSIONS, w as OpenAICodexTransportError, wt as parseOpenAICodexUsage, x as OPENAI_CODEX_TRANSPORT_ERROR_CODES, y as OPENAI_CODEX_IMAGE_REQUEST_TIMEOUT_MS, yt as OPENAI_CODEX_FAST_MODE_MAX_SESSION_ID_LENGTH, z as COMPATIBILITY_SCHEMA_VERSION } from "./src-Cxq99TvF.js";
2
2
  export { COMPATIBILITY_CONTRACT, COMPATIBILITY_PACKAGES, COMPATIBILITY_SCHEMA_VERSION, Config, DEFAULT_OPENAI_CODEX_PROXY_URL, DEFAULT_OPENAI_CODEX_SEARCH_CONTEXT_SIZE, DEFAULT_OPENAI_CODEX_SEARCH_MAX_OUTPUT_TOKENS, DEFAULT_OPENAI_CODEX_SEARCH_MODE, DEFAULT_OPENAI_CODEX_SEARCH_MODEL, DEFAULT_OPENAI_CODEX_SETTINGS, DSH_PLUGIN_API_PACKAGES, FastModeRegistry, FastModeRegistry as OpenAICodexFastModeRegistry, IMAGE_GENERATE_TOOL_NAME, OPENAI_CODEX_AUTH_FILENAME, OPENAI_CODEX_BASE_URL, OPENAI_CODEX_FAST_MODE_MAX_SESSIONS, OPENAI_CODEX_FAST_MODE_MAX_SESSION_ID_LENGTH, OPENAI_CODEX_FAST_MODE_PATH, OPENAI_CODEX_HISTORY_BACKUP_SUFFIX, OPENAI_CODEX_IMAGE_GENERATION_URL, OPENAI_CODEX_IMAGE_MAX_COUNT, OPENAI_CODEX_IMAGE_MAX_ERROR_BYTES, OPENAI_CODEX_IMAGE_MAX_RESPONSE_BYTES, OPENAI_CODEX_IMAGE_PROMPT_MAX_LENGTH, OPENAI_CODEX_IMAGE_REQUEST_TIMEOUT_MS, OPENAI_CODEX_LOCAL_PROXY_CANDIDATES, OPENAI_CODEX_PROVIDER, OPENAI_CODEX_PROXY_CANDIDATE_LIMIT, OPENAI_CODEX_PROXY_DETECT_PATH, OPENAI_CODEX_PROXY_PROBE_TIMEOUT_MS, OPENAI_CODEX_PROXY_PROBE_URL, OPENAI_CODEX_PROXY_TEST_PATH, OPENAI_CODEX_SEARCH_MODEL_REQUEST_EVENT, OPENAI_CODEX_SEARCH_PROVIDER, OPENAI_CODEX_SEARCH_URL, OPENAI_CODEX_SETTINGS_NAMESPACE, OPENAI_CODEX_SETTINGS_NS, OPENAI_CODEX_TRANSPORT_API_VERSION, OPENAI_CODEX_TRANSPORT_ERROR_CODES, OPENAI_CODEX_TRANSPORT_SERVICE, OPENAI_CODEX_UPDATE_PATH, OPENAI_CODEX_USAGE_URL, OpenAICodexCredentialStore, OpenAICodexProxyManager, OpenAICodexSearchProvider, OpenAICodexTransport, OpenAICodexTransportError, PI_AI_PACKAGE, SUPPORTED_DSH_PLUGIN_API_VERSION, SUPPORTED_NODE_RANGE, SUPPORTED_PI_AI_VERSION, VIEW_IMAGE_TOOL_NAME, apply, assertNoOpenAICodexProviderConflict, assessCompatibility, checkForOpenAICodexUpdate, compareOpenAICodexVersions, decodeOpenAICodexSettings, detectCompatibility, detectOpenAICodexProxies, diagnoseOpenAICodex, evaluateCompatibility, inject, isFastModeSessionId, isOpenAICodexTransportError, isValidOpenAICodexProxyUrl, listOpenAICodexProxyCandidates, loginOpenAICodex, logoutOpenAICodex, mapOpenAICodexSearchResponse, migrateOpenAICodexSearchHistory, name, openAICodexAuthPath, openAICodexAuthStatus, openAICodexConflictMessage, parseOpenAICodexUpdateResult, parseOpenAICodexUsage, parseOpenAICodexVersion, readOpenAICodexRateLimits, resolveOpenAICodexProxyUrl, resolveOpenAICodexSettings };