codex-subscription-oauth-plugin 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ja.md CHANGED
@@ -20,6 +20,27 @@ pnpm dsh plugin --profile acp add github:askdkc/dsh-codex
20
20
 
21
21
  プラグインはプロファイルごとに読み込まれるため、`web` に導入しただけでは `acp` にモデルは追加されません。ACPクライアントが起動するDSHプロセスを再起動し、モデル選択を開き直してください。別のプロファイルを使っている場合は、`acp` をその名前に置き換えます。
22
22
 
23
+ このプラグインはビルド済みの `lib` を配布しており、インストール時のビルドスクリプトは不要です。インストールや更新が `ERR_PNPM_IGNORED_BUILDS` で失敗し、`codex-subscription-oauth-plugin` が表示された場合は、対象プロファイルの `pnpm-workspace.yaml`(標準では `~/.dsh/profiles/web/pnpm-workspace.yaml`)を編集します。既存の `allowBuilds` 内で、このパッケージのビルドスクリプトを実行しないよう明示してください。
24
+
25
+ ```yaml
26
+ allowBuilds:
27
+ codex-subscription-oauth-plugin: false
28
+ ```
29
+
30
+ 既に `codex-subscription-oauth-plugin: true` があれば `false` に変更します。`allowBuilds` のキーが `codex-subscription-oauth-plugin@` で始まる他の項目は、リポジトリURL、コミットURL、生成された `set this to true or false` のプレースホルダーも含めて削除してください。このパッケージの項目は名前だけの `false` 一つにし、他のパッケージの設定は保持します。再実行する前に、プロファイルの設定ファイルを保存してください。
31
+
32
+ 名前だけの `true` と異なり、名前だけの `false` はGit依存関係にも適用されます。pnpmにスクリプトを実行しない判断を明示するため、更新のたびにコミットハッシュを書き換える必要はありません。この復旧手順はpnpm 11.7.0で動作し、pnpmの更新は不要です。詳しくはpnpmの [Git依存関係のビルド設定](https://pnpm.io/settings/build#allowbuilds) を参照してください。
33
+
34
+ その後、DeepSeek Harnessのチェックアウトから、失敗した `pnpm dsh plugin ...` コマンドを再実行します。別のプラグインを更新する場合も、このプロファイルの依存関係が確認されます。例えば、失敗したKiokukoの更新を再実行する場合:
35
+
36
+ ```sh
37
+ pnpm dsh plugin --profile web update kiokuko-dsh --latest
38
+ ```
39
+
40
+ コマンドが正常終了するまで確認してください。`Already up to date` はビルド設定のエラーより前に表示される場合があり、その表示だけでは更新成功とは判断できません。
41
+
42
+ 設定を編集するプロファイルと再実行するプロファイルを合わせてください。`DSH_HOME` を変更している場合はパスも合わせます。Harnessのチェックアウトで `pnpm approve-builds` を実行しても、対象はそのチェックアウトであり、プラグインのプロファイルではありません。`minimumReleaseAge` を変更しても、ビルドの承認エラーは解消しません。
43
+
23
44
  既存のACPプロファイルへのインストールが `ERR_PNPM_UNEXPECTED_STORE` で失敗した場合は、現在のpnpmストアを使ってそのプロファイルの依存関係を再インストールしてから、プラグインの追加を再実行します。
24
45
 
25
46
  ```sh
@@ -43,6 +64,12 @@ Codex用のChatGPTアカウントでログインします。
43
64
  pnpm dsh plugin --profile web remove codex-subscription-oauth-plugin
44
65
  ```
45
66
 
67
+ ## モデルと接続診断
68
+
69
+ GPT-6.1 Terraには、Astraからのコピーではなく[公式Codexカタログ](https://github.com/openai/codex/blob/main/codex-rs/models-manager/models.json)の通常コンテキスト500,000、テキスト・画像入力と、本アダプターで扱えるlow〜maxのreasoning情報を使用します。出力上限と価格の見積りは[Terraのモデル情報](https://developers.openai.com/api/docs/models/gpt-6.1-terra)と[API価格](https://developers.openai.com/api/docs/pricing)に基づきます。アカウントでの表示可否は認証済みカタログで決まります。実行に必要な出力上限・価格情報がない未知モデルには `MODEL_METADATA_MISSING` を出し、他モデルの能力を推測でコピーしません。
70
+
71
+ 接続失敗には、SDKの開始前・開始後の段階、SSE切替の有無と安全なエラーコードを残します。診断には生のclose理由・stack・header・本文を含めません。最初の応答イベントより前ではSDKがSSEに切り替えることがありますが、プラグインは再試行を追加せず、途中の応答やツール出力を再送しません。キャンセルを維持し、SSEのHTTPエラーではホストが分類できるようstatusを保持します。
72
+
46
73
  ## ライセンス
47
74
 
48
75
  MITライセンスです。詳細は [LICENSE](./LICENSE) を参照してください。
package/README.md CHANGED
@@ -20,6 +20,27 @@ pnpm dsh plugin --profile acp add github:askdkc/dsh-codex
20
20
 
21
21
  Profiles load plugins independently: installing into `web` does not add models to `acp`. Restart the DSH process launched by your ACP client, then reopen its model selector. If the client uses a different profile, replace `acp` with that name.
22
22
 
23
+ This plugin ships prebuilt `lib` files and does not need install-time build scripts. If an installation or update fails with `ERR_PNPM_IGNORED_BUILDS` naming `codex-subscription-oauth-plugin`, edit the target profile's `pnpm-workspace.yaml` (by default, `~/.dsh/profiles/web/pnpm-workspace.yaml`). In its existing `allowBuilds` map, explicitly skip this package's build scripts:
24
+
25
+ ```yaml
26
+ allowBuilds:
27
+ codex-subscription-oauth-plugin: false
28
+ ```
29
+
30
+ Change an existing `codex-subscription-oauth-plugin: true` to `false`. Delete any other `allowBuilds` entries whose key starts with `codex-subscription-oauth-plugin@`, including repository URLs, commit URLs, and generated `set this to true or false` placeholders. Keep only the name-only `false` entry for this package and preserve other packages' settings. Save the profile file before retrying.
31
+
32
+ Unlike a name-only `true`, a name-only `false` also applies to Git dependencies: pnpm records an explicit decision to skip the scripts, so updates do not require commit-hash edits. This recovery works with pnpm 11.7.0; upgrading pnpm is not required. See pnpm's [Git dependency build settings](https://pnpm.io/settings/build#allowbuilds).
33
+
34
+ Then rerun the failed `pnpm dsh plugin ...` command from the DeepSeek Harness checkout. Even an update of another plugin checks this profile's dependencies; for example, retry a failed Kiokuko update with:
35
+
36
+ ```sh
37
+ pnpm dsh plugin --profile web update kiokuko-dsh --latest
38
+ ```
39
+
40
+ Wait for the command to exit successfully. `Already up to date` can appear before a build-policy error and does not by itself mean the update succeeded.
41
+
42
+ Use the same profile for the configuration edit and retry; adjust the path for a custom `DSH_HOME`. Running `pnpm approve-builds` in the Harness checkout targets that checkout, not the plugin profile. Changing `minimumReleaseAge` does not resolve build approval failures.
43
+
23
44
  If installation into an existing ACP profile fails with `ERR_PNPM_UNEXPECTED_STORE`, reinstall that profile's dependencies using the current pnpm store, then retry:
24
45
 
25
46
  ```sh
@@ -43,6 +64,12 @@ Remove the plugin:
43
64
  pnpm dsh plugin --profile web remove codex-subscription-oauth-plugin
44
65
  ```
45
66
 
67
+ ## Models and connection diagnostics
68
+
69
+ GPT-6.1 Terra uses its own [Codex catalog metadata](https://github.com/openai/codex/blob/main/codex-rs/models-manager/models.json): a 500,000-token default context, text/image input, and low through max reasoning supported by this adapter. Its output cap and cost estimate come from the [Terra model page](https://developers.openai.com/api/docs/models/gpt-6.1-terra) and [API pricing](https://developers.openai.com/api/docs/pricing), rather than Astra. Account visibility still comes from the authenticated catalog. Unknown entries without executable output/cost metadata emit `MODEL_METADATA_MISSING`; their capabilities are not guessed from another model.
70
+
71
+ Connection failures retain the SDK's before/after-start phase, fallback choice and safe error code. Raw close reasons, stacks, headers and bodies are omitted from these diagnostics. The SDK may switch to SSE before its first response event; the plugin adds no retries and does not replay an interrupted response or tool output. Cancellation stays cancelled, and an SSE HTTP error retains its status for the host's classification.
72
+
46
73
  ## License
47
74
 
48
75
  MIT. See [LICENSE](./LICENSE).
package/lib/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import { c as lazyApi, i as createProvider, r as createModels } from "./models-BdCc9Ab5.js";
1
+ import { c as lazyApi, i as createProvider, r as createModels, u as createAssistantMessageEventStream } from "./models-SNl0ezHJ.js";
2
2
  import AuthorizationService, { AuthorizationDeclinedError } from "@deepseek-ai/dsh-authorization";
3
3
  import { credentialKey, credentialKeyId, credentialKeyScope, isCredentialKeySegment } from "@deepseek-ai/dsh-credentials";
4
4
  import { LlmError, resolveImageAttachmentAccess, resolveRetryPolicy } from "@deepseek-ai/dsh-llm";
5
5
  import { PiAiAdapter, recordKeyFor } from "@deepseek-ai/dsh-llm-pi-ai";
6
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/auth/helpers.js
6
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/auth/helpers.js
7
7
  /**
8
8
  * Wraps a dynamically imported `OAuthAuth` so provider definitions can
9
9
  * advertise OAuth without importing the implementation. The flow loads on
@@ -27,10 +27,10 @@ function lazyOAuth(input) {
27
27
  };
28
28
  }
29
29
  //#endregion
30
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.lazy.js
31
- const openAICodexResponsesApi = () => lazyApi(() => import("./openai-codex-responses-DKg-2_3a.js"));
30
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.lazy.js
31
+ const openAICodexResponsesApi = () => lazyApi(() => import("./openai-codex-responses-CYGCQRS8.js"));
32
32
  //#endregion
33
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js
33
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js
34
34
  var __rewriteRelativeImportExtension = function(path, preserveJsx) {
35
35
  if (typeof path === "string" && /^\.\.?\//.test(path)) return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m, tsx, d, ext, cm) {
36
36
  return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : d + ext + "." + cm.toLowerCase() + "js";
@@ -50,7 +50,7 @@ const loadOpenAICodexOAuth = async () => {
50
50
  return (await importOAuthModule("./openai-codex.ts")).openaiCodexOAuth;
51
51
  };
52
52
  //#endregion
53
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json
53
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json
54
54
  var openai_codex_default = { "openai-codex-responses": {
55
55
  "gpt-5.3-codex-spark": {
56
56
  "id": "gpt-5.3-codex-spark",
@@ -305,15 +305,15 @@ var openai_codex_default = { "openai-codex-responses": {
305
305
  }
306
306
  } };
307
307
  //#endregion
308
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/model-catalog.js
308
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/model-catalog.js
309
309
  function flattenModelCatalog(_provider, groups) {
310
310
  return Object.assign({}, ...Object.values(groups));
311
311
  }
312
312
  //#endregion
313
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js
313
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js
314
314
  const OPENAI_CODEX_MODELS = flattenModelCatalog("openai-codex", openai_codex_default);
315
315
  //#endregion
316
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.js
316
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.js
317
317
  function openaiCodexProvider() {
318
318
  return createProvider({
319
319
  id: "openai-codex",
@@ -525,6 +525,8 @@ var CodexCatalog = class {
525
525
  }
526
526
  const official = parseOfficialModels(payload);
527
527
  if (official.length === 0) throw Object.assign(/* @__PURE__ */ new Error("empty model list"), { code: "EMPTY_LIST" });
528
+ const missing = official.filter((entry) => !this.baselineById.has(entry.slug)).length;
529
+ if (missing > 0) this.warn(`codex-subscription-oauth: MODEL_METADATA_MISSING (${missing} listed models)`);
528
530
  const models = official.map((entry) => {
529
531
  const baseline = this.baselineById.get(entry.slug);
530
532
  if (baseline === void 0) return void 0;
@@ -751,13 +753,114 @@ function toBundledCodexContext(context) {
751
753
  };
752
754
  }
753
755
  /** Freeze a catalog generation and bridge both provider streaming entry points. */
754
- function providerWithModels(provider, models) {
756
+ function providerWithModels(provider, models, warn = () => {}) {
755
757
  const generation = Object.freeze([...models]);
758
+ function observed(model, run) {
759
+ const stream = createAssistantMessageEventStream();
760
+ let httpStatus;
761
+ (async () => {
762
+ for await (const event of run((response) => {
763
+ httpStatus = response.status;
764
+ })) {
765
+ if (event.type !== "done" && event.type !== "error") {
766
+ stream.push(event);
767
+ continue;
768
+ }
769
+ const message = event.type === "done" ? event.message : event.error;
770
+ const diagnostics = message.diagnostics?.map((diagnostic) => {
771
+ if (diagnostic.type !== "provider_transport_failure") return diagnostic;
772
+ const details = diagnostic.details ?? {};
773
+ const safe = {};
774
+ for (const key of ["configuredTransport", "fallbackTransport"]) if ([
775
+ "auto",
776
+ "sse",
777
+ "websocket",
778
+ "websocket-cached"
779
+ ].includes(String(details[key]))) safe[key] = String(details[key]);
780
+ if (details.phase === "before_message_stream_start" || details.phase === "after_message_stream_start") safe.phase = details.phase;
781
+ if (typeof details.eventsEmitted === "boolean") safe.eventsEmitted = details.eventsEmitted;
782
+ if (Number.isSafeInteger(details.requestBytes) && Number(details.requestBytes) >= 0) safe.requestBytes = Number(details.requestBytes);
783
+ const code = diagnostic.error?.code;
784
+ if (typeof code === "number" && Number.isSafeInteger(code) || typeof code === "string" && /^[A-Z0-9_]{1,64}$/.test(code)) safe.code = code;
785
+ const summary = `Codex WebSocket failure ${JSON.stringify(safe)}`;
786
+ warn(summary);
787
+ return {
788
+ type: diagnostic.type,
789
+ timestamp: diagnostic.timestamp,
790
+ error: { message: summary },
791
+ details: safe
792
+ };
793
+ });
794
+ const failures = diagnostics?.filter((diagnostic) => diagnostic.type === "provider_transport_failure") ?? [];
795
+ const terminal = {
796
+ ...message,
797
+ ...diagnostics === void 0 ? {} : { diagnostics },
798
+ ...message.stopReason !== "aborted" && event.type === "error" && failures.some((diagnostic) => diagnostic.details?.phase === "after_message_stream_start") ? { errorMessage: failures.map((diagnostic) => diagnostic.error?.message).join("; ") } : {}
799
+ };
800
+ if (event.type === "error" && message.stopReason !== "aborted" && httpStatus !== void 0 && httpStatus >= 400) {
801
+ terminal.errorMessage = `Codex HTTP ${httpStatus} failure`;
802
+ warn(terminal.errorMessage);
803
+ }
804
+ Object.assign(message, terminal);
805
+ stream.push(event.type === "done" ? {
806
+ ...event,
807
+ message: terminal
808
+ } : {
809
+ ...event,
810
+ error: terminal
811
+ });
812
+ }
813
+ stream.end();
814
+ })().catch(() => {
815
+ stream.push({
816
+ type: "error",
817
+ reason: "error",
818
+ error: {
819
+ role: "assistant",
820
+ content: [],
821
+ api: model.api,
822
+ provider: model.provider,
823
+ model: model.id,
824
+ timestamp: Date.now(),
825
+ stopReason: "error",
826
+ errorMessage: "Codex provider stream failed",
827
+ usage: {
828
+ input: 0,
829
+ output: 0,
830
+ cacheRead: 0,
831
+ cacheWrite: 0,
832
+ totalTokens: 0,
833
+ cost: {
834
+ input: 0,
835
+ output: 0,
836
+ cacheRead: 0,
837
+ cacheWrite: 0,
838
+ total: 0
839
+ }
840
+ }
841
+ }
842
+ });
843
+ stream.end();
844
+ });
845
+ return stream;
846
+ }
756
847
  return {
757
848
  ...provider,
758
849
  getModels: () => generation,
759
- stream: (model, context, options) => provider.stream(model, toBundledCodexContext(context), options),
760
- streamSimple: (model, context, options) => provider.streamSimple(model, toBundledCodexContext(context), options)
850
+ stream: (model, context, options) => observed(model, (onResponse) => provider.stream(model, toBundledCodexContext(context), {
851
+ ...options,
852
+ onResponse: (response, responseModel) => {
853
+ onResponse(response);
854
+ return options?.onResponse?.(response, responseModel);
855
+ }
856
+ })),
857
+ streamSimple: (model, context, options) => observed(model, (onResponse) => provider.streamSimple(model, toBundledCodexContext(context), {
858
+ ...options,
859
+ onResponse: (response, responseModel) => {
860
+ onResponse(response);
861
+ return options?.onResponse?.(response, responseModel);
862
+ }
863
+ }))
761
864
  };
762
865
  }
763
866
  //#endregion
@@ -988,36 +1091,65 @@ function bundledCodexModels(provider) {
988
1091
  cacheWrite: .125
989
1092
  }
990
1093
  ];
991
- return Object.freeze([...models, ...additions.filter((entry) => !models.some((model) => model.id === entry.id)).map((entry) => Object.freeze({
992
- ...astra,
993
- id: entry.id,
994
- name: entry.name,
995
- thinkingLevelMap: {
996
- off: null,
997
- ...entry.id === "gpt-6.1-sol" ? { minimal: null } : {},
998
- low: "low",
999
- medium: "medium",
1000
- high: "high",
1001
- xhigh: "xhigh",
1002
- max: "max"
1003
- },
1004
- cost: {
1005
- input: entry.input,
1006
- output: entry.output,
1007
- cacheRead: entry.cacheRead,
1008
- cacheWrite: entry.cacheWrite,
1009
- tiers: [{
1010
- inputTokensAbove: 272e3,
1011
- input: entry.input * 2,
1012
- output: entry.output * 1.5,
1013
- cacheRead: entry.cacheRead * 2,
1014
- cacheWrite: entry.cacheWrite * 2
1015
- }]
1016
- }
1017
- }))]);
1094
+ return Object.freeze([
1095
+ ...models,
1096
+ ...additions.filter((entry) => !models.some((model) => model.id === entry.id)).map((entry) => Object.freeze({
1097
+ ...astra,
1098
+ id: entry.id,
1099
+ name: entry.name,
1100
+ thinkingLevelMap: {
1101
+ off: null,
1102
+ ...entry.id === "gpt-6.1-sol" ? { minimal: null } : {},
1103
+ low: "low",
1104
+ medium: "medium",
1105
+ high: "high",
1106
+ xhigh: "xhigh",
1107
+ max: "max"
1108
+ },
1109
+ cost: {
1110
+ input: entry.input,
1111
+ output: entry.output,
1112
+ cacheRead: entry.cacheRead,
1113
+ cacheWrite: entry.cacheWrite,
1114
+ tiers: [{
1115
+ inputTokensAbove: 272e3,
1116
+ input: entry.input * 2,
1117
+ output: entry.output * 1.5,
1118
+ cacheRead: entry.cacheRead * 2,
1119
+ cacheWrite: entry.cacheWrite * 2
1120
+ }]
1121
+ }
1122
+ })),
1123
+ ...models.some((model) => model.id === "gpt-6.1-terra") ? [] : [{
1124
+ id: "gpt-6.1-terra",
1125
+ name: "GPT-6.1 Terra",
1126
+ api: "openai-codex-responses",
1127
+ provider: ROUTE,
1128
+ baseUrl: "https://chatgpt.com/backend-api",
1129
+ reasoning: true,
1130
+ input: ["text", "image"],
1131
+ contextWindow: 5e5,
1132
+ maxTokens: 128e3,
1133
+ thinkingLevelMap: {
1134
+ off: null,
1135
+ minimal: null,
1136
+ low: "low",
1137
+ medium: "medium",
1138
+ high: "high",
1139
+ xhigh: "xhigh",
1140
+ max: "max"
1141
+ },
1142
+ cost: {
1143
+ input: 1,
1144
+ output: 5,
1145
+ cacheRead: .05,
1146
+ cacheWrite: 1.25
1147
+ }
1148
+ }]
1149
+ ]);
1018
1150
  }
1019
1151
  /** Build the one profile shape consumed by DSH's public pi-ai adapter. */
1020
- function profileFor(provider, models) {
1152
+ function profileFor(provider, models, warn) {
1021
1153
  return /* @__PURE__ */ new Map([[ROUTE, {
1022
1154
  provider: ROUTE,
1023
1155
  displayName: provider.name,
@@ -1028,7 +1160,7 @@ function profileFor(provider, models) {
1028
1160
  retryPolicy: resolveRetryPolicy(void 0, `codex-subscription-oauth: provider "${ROUTE}" retryPolicy`),
1029
1161
  configuredMaxTokens: /* @__PURE__ */ new Map(),
1030
1162
  modelErrors: /* @__PURE__ */ new Map(),
1031
- piProvider: providerWithModels(provider, models)
1163
+ piProvider: providerWithModels(provider, models, warn)
1032
1164
  }]]);
1033
1165
  }
1034
1166
  /** Register the command, dynamic model route, and fallback authorization service. */
@@ -1051,6 +1183,9 @@ function apply(ctx, config = {}) {
1051
1183
  authModels.setProvider(upstream);
1052
1184
  let profiles;
1053
1185
  let registration;
1186
+ const warn = (message) => {
1187
+ ctx.logger.warn(message);
1188
+ };
1054
1189
  const catalog = new CodexCatalog({
1055
1190
  ...catalogConfig,
1056
1191
  baseline: bundledModels,
@@ -1066,12 +1201,12 @@ function apply(ctx, config = {}) {
1066
1201
  };
1067
1202
  },
1068
1203
  onChange(snapshot) {
1069
- profiles = profileFor(upstream, snapshot.models);
1204
+ profiles = profileFor(upstream, snapshot.models, warn);
1070
1205
  registration?.replace([ROUTE]);
1071
1206
  },
1072
- warn: (message) => ctx.logger.warn(message)
1207
+ warn
1073
1208
  });
1074
- profiles = profileFor(upstream, catalog.current.models);
1209
+ profiles = profileFor(upstream, catalog.current.models, warn);
1075
1210
  const adapter = new LiveCodexAdapter({
1076
1211
  profiles: () => profiles,
1077
1212
  resolveApiKey: async () => void 0,
@@ -1,4 +1,4 @@
1
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js
1
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js
2
2
  var EventStream = class {
3
3
  queue = [];
4
4
  waiting = [];
@@ -57,8 +57,12 @@ var AssistantMessageEventStream = class extends EventStream {
57
57
  });
58
58
  }
59
59
  };
60
+ /** Factory function for AssistantMessageEventStream (for use in extensions) */
61
+ function createAssistantMessageEventStream() {
62
+ return new AssistantMessageEventStream();
63
+ }
60
64
  //#endregion
61
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/api/lazy.js
65
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/api/lazy.js
62
66
  function createSetupErrorMessage(model, error) {
63
67
  return {
64
68
  role: "assistant",
@@ -128,7 +132,7 @@ function lazyApi(load, capabilities) {
128
132
  return api;
129
133
  }
130
134
  //#endregion
131
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/auth/context.js
135
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/auth/context.js
132
136
  var __rewriteRelativeImportExtension = function(path, preserveJsx) {
133
137
  if (typeof path === "string" && /^\.\.?\//.test(path)) return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m, tsx, d, ext, cm) {
134
138
  return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : d + ext + "." + cm.toLowerCase() + "js";
@@ -163,7 +167,7 @@ function defaultProviderAuthContext() {
163
167
  };
164
168
  }
165
169
  //#endregion
166
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/abort.js
170
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/abort.js
167
171
  function abortReason(signal) {
168
172
  if (signal.reason !== void 0) return signal.reason;
169
173
  const error = /* @__PURE__ */ new Error("The operation was aborted");
@@ -208,7 +212,7 @@ function raceWithAbortSignal(operation, signal) {
208
212
  });
209
213
  }
210
214
  //#endregion
211
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js
215
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js
212
216
  /**
213
217
  * Default in-memory credential store. Apps inject persistent stores.
214
218
  * Keyed by `Provider.id`, one credential per provider; see `CredentialStore`.
@@ -260,7 +264,7 @@ var InMemoryCredentialStore = class {
260
264
  }
261
265
  };
262
266
  //#endregion
263
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/diagnostics.js
267
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/diagnostics.js
264
268
  function formatThrownValue(value) {
265
269
  if (value instanceof Error) return value.message || value.name;
266
270
  if (typeof value === "string") return value;
@@ -291,7 +295,7 @@ function appendAssistantMessageDiagnostic(message, diagnostic) {
291
295
  message.diagnostics = [...message.diagnostics ?? [], diagnostic];
292
296
  }
293
297
  //#endregion
294
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js
298
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js
295
299
  var ModelsError = class extends Error {
296
300
  code;
297
301
  constructor(code, message, options) {
@@ -408,7 +412,7 @@ async function readCredential(credentials, providerId, signal) {
408
412
  }
409
413
  }
410
414
  //#endregion
411
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/models-store.js
415
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/models-store.js
412
416
  var InMemoryModelsStore = class {
413
417
  entries = /* @__PURE__ */ new Map();
414
418
  async read(providerId, options) {
@@ -426,7 +430,7 @@ var InMemoryModelsStore = class {
426
430
  }
427
431
  };
428
432
  //#endregion
429
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/models.js
433
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/models.js
430
434
  function mergeHeaders(base, override) {
431
435
  if (!base && !override) return void 0;
432
436
  const merged = { ...base };
@@ -938,4 +942,4 @@ function clampThinkingLevel(model, level) {
938
942
  return availableLevels[0] ?? "off";
939
943
  }
940
944
  //#endregion
941
- export { appendAssistantMessageDiagnostic as a, lazyApi as c, createProvider as i, AssistantMessageEventStream as l, clampThinkingLevel as n, createAssistantMessageDiagnostic as o, createModels as r, formatThrownValue as s, calculateCost as t };
945
+ export { appendAssistantMessageDiagnostic as a, lazyApi as c, createProvider as i, AssistantMessageEventStream as l, clampThinkingLevel as n, createAssistantMessageDiagnostic as o, createModels as r, formatThrownValue as s, calculateCost as t, createAssistantMessageEventStream as u };
@@ -1,6 +1,6 @@
1
- import { n as __commonJSMin, t as getProviderEnvValue } from "./provider-env-BoYS8tP5.js";
2
- import { a as appendAssistantMessageDiagnostic, l as AssistantMessageEventStream, n as clampThinkingLevel, o as createAssistantMessageDiagnostic, s as formatThrownValue, t as calculateCost } from "./models-BdCc9Ab5.js";
3
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/session-resources.js
1
+ import { n as __commonJSMin, t as getProviderEnvValue } from "./provider-env-BO8sNc-2.js";
2
+ import { a as appendAssistantMessageDiagnostic, l as AssistantMessageEventStream, n as clampThinkingLevel, o as createAssistantMessageDiagnostic, s as formatThrownValue, t as calculateCost } from "./models-SNl0ezHJ.js";
3
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/session-resources.js
4
4
  const sessionResourceCleanups = /* @__PURE__ */ new Set();
5
5
  function registerSessionResourceCleanup(cleanup) {
6
6
  sessionResourceCleanups.add(cleanup);
@@ -9,7 +9,7 @@ function registerSessionResourceCleanup(cleanup) {
9
9
  };
10
10
  }
11
11
  //#endregion
12
- //#region node_modules/.pnpm/partial-json@0.1.7/node_modules/partial-json/dist/options.js
12
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/partial-json/dist/options.js
13
13
  var require_options = /* @__PURE__ */ __commonJSMin(((exports) => {
14
14
  /**
15
15
  * Sometimes you don't allow every type to be partially parsed.
@@ -99,7 +99,7 @@ var require_options = /* @__PURE__ */ __commonJSMin(((exports) => {
99
99
  exports.default = exports.Allow;
100
100
  }));
101
101
  //#endregion
102
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/json-parse.js
102
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/json-parse.js
103
103
  var import_dist = (/* @__PURE__ */ __commonJSMin(((exports) => {
104
104
  var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
105
105
  if (k2 === void 0) k2 = k;
@@ -388,7 +388,7 @@ function parseStreamingJson(partialJson) {
388
388
  }
389
389
  }
390
390
  //#endregion
391
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/uuid.js
391
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/uuid.js
392
392
  const MAX_UUID_V7_TIMESTAMP = 0xffffffffffff;
393
393
  const MAX_SEQUENCE = (1n << 41n) - 1n;
394
394
  let lastOrdinaryTimestamp = -1;
@@ -418,7 +418,7 @@ function uuidv7(timestampMs) {
418
418
  return `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10).join("")}`;
419
419
  }
420
420
  //#endregion
421
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js
421
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js
422
422
  function combineAbortSignals(signals) {
423
423
  const activeSignals = signals.filter((signal) => signal !== void 0);
424
424
  if (activeSignals.length === 0) return { cleanup: () => {} };
@@ -451,7 +451,7 @@ function combineAbortSignals(signals) {
451
451
  };
452
452
  }
453
453
  //#endregion
454
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js
454
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js
455
455
  const identityToolName = (name) => name;
456
456
  /** Split current tools into prefix and transcript-loaded definitions. */
457
457
  function splitDeferredTools(context, enabled, normalizeName = identityToolName) {
@@ -479,7 +479,7 @@ function splitDeferredTools(context, enabled, normalizeName = identityToolName)
479
479
  };
480
480
  }
481
481
  //#endregion
482
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js
482
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js
483
483
  const MAX_PROVIDER_ERROR_BODY_CHARS = 4e3;
484
484
  function normalizeProviderError(error) {
485
485
  if (!(error instanceof Error)) return {
@@ -579,14 +579,14 @@ function safeJsonStringify$1(value) {
579
579
  }
580
580
  }
581
581
  //#endregion
582
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/headers.js
582
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/headers.js
583
583
  function headersToRecord(headers) {
584
584
  const result = {};
585
585
  for (const [key, value] of headers.entries()) result[key] = value;
586
586
  return result;
587
587
  }
588
588
  //#endregion
589
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.js
589
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.js
590
590
  const DEFAULT_PROXY_PORTS = {
591
591
  ftp: 21,
592
592
  gopher: 70,
@@ -691,7 +691,7 @@ function resolveHttpProxyUrlForTarget(targetUrl, env) {
691
691
  return proxyUrl;
692
692
  }
693
693
  //#endregion
694
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.js
694
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.js
695
695
  function loadNodeOs() {
696
696
  if (typeof process === "undefined" || !(process.versions?.node || process.versions?.bun)) return null;
697
697
  return process.getBuiltinModule?.("node:os") ?? null;
@@ -701,7 +701,7 @@ function getPiUserAgent() {
701
701
  return nodeOs ? `pi (${nodeOs.platform()} ${nodeOs.release()}; ${nodeOs.arch()})` : "pi (browser)";
702
702
  }
703
703
  //#endregion
704
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js
704
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js
705
705
  var UnsupportedStrictJsonSchemaError = class extends Error {};
706
706
  const UNSUPPORTED_STRICT_SCHEMA_KEYS = [
707
707
  "$ref",
@@ -860,7 +860,7 @@ function clampOpenAIPromptCacheKey(key) {
860
860
  return chars.slice(0, 64).join("");
861
861
  }
862
862
  //#endregion
863
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/hash.js
863
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/hash.js
864
864
  /** Fast deterministic hash to shorten long strings */
865
865
  function shortHash(str) {
866
866
  let h1 = 3735928559;
@@ -875,7 +875,7 @@ function shortHash(str) {
875
875
  return (h2 >>> 0).toString(36) + (h1 >>> 0).toString(36);
876
876
  }
877
877
  //#endregion
878
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/sanitize-unicode.js
878
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/sanitize-unicode.js
879
879
  /**
880
880
  * Removes unpaired Unicode surrogate characters from a string.
881
881
  *
@@ -900,7 +900,7 @@ function sanitizeSurrogates(text) {
900
900
  return text.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, "");
901
901
  }
902
902
  //#endregion
903
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js
903
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js
904
904
  const NON_VISION_USER_IMAGE_PLACEHOLDER = "(image omitted: model does not support images)";
905
905
  const NON_VISION_TOOL_IMAGE_PLACEHOLDER = "(tool image omitted: model does not support images)";
906
906
  function replaceImagesWithPlaceholder(content, placeholder) {
@@ -1047,7 +1047,7 @@ function transformMessages(messages, model, normalizeToolCallId) {
1047
1047
  return result;
1048
1048
  }
1049
1049
  //#endregion
1050
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js
1050
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js
1051
1051
  function encodeTextSignatureV1(id, phase) {
1052
1052
  const payload = {
1053
1053
  v: 1,
@@ -1624,7 +1624,7 @@ function mapStopReason(status, incompleteReason) {
1624
1624
  }
1625
1625
  }
1626
1626
  //#endregion
1627
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js
1627
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js
1628
1628
  const CHARS_PER_TOKEN = 4;
1629
1629
  const ESTIMATED_IMAGE_CHARS = 4800;
1630
1630
  function calculateContextTokens(usage) {
@@ -1725,7 +1725,7 @@ function estimateContextTokens(context) {
1725
1725
  };
1726
1726
  }
1727
1727
  //#endregion
1728
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js
1728
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js
1729
1729
  const CONTEXT_SAFETY_TOKENS = 4096;
1730
1730
  const MIN_MAX_TOKENS = 1;
1731
1731
  function clampMaxTokensToContext(model, context, maxTokens) {
@@ -1761,7 +1761,7 @@ function buildBaseOptions(model, context, options, apiKey) {
1761
1761
  };
1762
1762
  }
1763
1763
  //#endregion
1764
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js
1764
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js
1765
1765
  const DEFAULT_CODEX_BASE_URL = "https://chatgpt.com/backend-api";
1766
1766
  const JWT_CLAIM_PATH = "https://api.openai.com/auth";
1767
1767
  const DEFAULT_MAX_RETRIES = 0;
@@ -1,5 +1,5 @@
1
- import { t as getProviderEnvValue } from "./provider-env-BoYS8tP5.js";
2
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/auth/oauth/device-code.js
1
+ import { t as getProviderEnvValue } from "./provider-env-BO8sNc-2.js";
2
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/auth/oauth/device-code.js
3
3
  const CANCEL_MESSAGE = "Login cancelled";
4
4
  const TIMEOUT_MESSAGE = "Device flow timed out";
5
5
  const SLOW_DOWN_TIMEOUT_MESSAGE = "Device flow timed out after one or more slow_down responses. This is often caused by clock drift in WSL or VM environments. Please sync or restart the VM clock and try again.";
@@ -47,7 +47,7 @@ async function pollOAuthDeviceCodeFlow(options) {
47
47
  throw new Error(slowDownResponses > 0 ? SLOW_DOWN_TIMEOUT_MESSAGE : TIMEOUT_MESSAGE);
48
48
  }
49
49
  //#endregion
50
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/auth/oauth/oauth-page.js
50
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/auth/oauth/oauth-page.js
51
51
  const LOGO_SVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" aria-hidden="true"><path fill="#fff" fill-rule="evenodd" d="M165.29 165.29 H517.36 V400 H400 V517.36 H282.65 V634.72 H165.29 Z M282.65 282.65 V400 H400 V282.65 Z"/><path fill="#fff" d="M517.36 400 H634.72 V634.72 H517.36 Z"/></svg>`;
52
52
  function escapeHtml(value) {
53
53
  return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&#39;");
@@ -148,7 +148,7 @@ function oauthErrorHtml(message, details) {
148
148
  });
149
149
  }
150
150
  //#endregion
151
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/auth/oauth/pkce.js
151
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/auth/oauth/pkce.js
152
152
  /**
153
153
  * PKCE utilities using Web Crypto API.
154
154
  * Works in both Node.js 20+ and browsers.
@@ -177,7 +177,7 @@ async function generatePKCE() {
177
177
  };
178
178
  }
179
179
  //#endregion
180
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js
180
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js
181
181
  /**
182
182
  * OpenAI Codex (ChatGPT OAuth) flow
183
183
  *
@@ -3,7 +3,7 @@ import { createRequire } from "node:module";
3
3
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
4
4
  var __require = /* #__PURE__ */ (() => createRequire(import.meta.url))();
5
5
  //#endregion
6
- //#region node_modules/.pnpm/@earendil-works+pi-ai@0.85.1_ws@8.21.3_zod@4.6.4/node_modules/@earendil-works/pi-ai/dist/utils/provider-env.js
6
+ //#region ../../../../Users/dkc/Sites/Src/dsh-codex/node_modules/@earendil-works/pi-ai/dist/utils/provider-env.js
7
7
  let procEnvCache = null;
8
8
  /**
9
9
  * Fallback for https://github.com/oven-sh/bun/issues/27802.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-subscription-oauth-plugin",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Out-of-tree DSH bundle for ChatGPT Codex OAuth and live models",
5
5
  "private": false,
6
6
  "license": "MIT",