@iam-brain/opencode-codex-auth 1.2.5 → 1.3.0

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 (148) hide show
  1. package/README.md +41 -97
  2. package/dist/lib/accounts-tools.d.ts.map +1 -1
  3. package/dist/lib/accounts-tools.js +1 -3
  4. package/dist/lib/accounts-tools.js.map +1 -1
  5. package/dist/lib/codex-native/acquire-auth.d.ts.map +1 -1
  6. package/dist/lib/codex-native/acquire-auth.js +2 -1
  7. package/dist/lib/codex-native/acquire-auth.js.map +1 -1
  8. package/dist/lib/codex-native/chat-hooks.d.ts.map +1 -1
  9. package/dist/lib/codex-native/chat-hooks.js.map +1 -1
  10. package/dist/lib/codex-native/oauth-auth-methods.d.ts.map +1 -1
  11. package/dist/lib/codex-native/oauth-auth-methods.js +5 -2
  12. package/dist/lib/codex-native/oauth-auth-methods.js.map +1 -1
  13. package/dist/lib/codex-native/oauth-server-debug.d.ts +10 -0
  14. package/dist/lib/codex-native/oauth-server-debug.d.ts.map +1 -0
  15. package/dist/lib/codex-native/oauth-server-debug.js +92 -0
  16. package/dist/lib/codex-native/oauth-server-debug.js.map +1 -0
  17. package/dist/lib/codex-native/oauth-server-network.d.ts +5 -0
  18. package/dist/lib/codex-native/oauth-server-network.d.ts.map +1 -0
  19. package/dist/lib/codex-native/oauth-server-network.js +39 -0
  20. package/dist/lib/codex-native/oauth-server-network.js.map +1 -0
  21. package/dist/lib/codex-native/oauth-server-types.d.ts +24 -0
  22. package/dist/lib/codex-native/oauth-server-types.d.ts.map +1 -0
  23. package/dist/lib/codex-native/oauth-server-types.js +2 -0
  24. package/dist/lib/codex-native/oauth-server-types.js.map +1 -0
  25. package/dist/lib/codex-native/oauth-server.d.ts +2 -17
  26. package/dist/lib/codex-native/oauth-server.d.ts.map +1 -1
  27. package/dist/lib/codex-native/oauth-server.js +11 -130
  28. package/dist/lib/codex-native/oauth-server.js.map +1 -1
  29. package/dist/lib/codex-native/openai-loader-fetch-quota.d.ts +18 -0
  30. package/dist/lib/codex-native/openai-loader-fetch-quota.d.ts.map +1 -0
  31. package/dist/lib/codex-native/openai-loader-fetch-quota.js +71 -0
  32. package/dist/lib/codex-native/openai-loader-fetch-quota.js.map +1 -0
  33. package/dist/lib/codex-native/openai-loader-fetch-state.d.ts +27 -0
  34. package/dist/lib/codex-native/openai-loader-fetch-state.d.ts.map +1 -0
  35. package/dist/lib/codex-native/openai-loader-fetch-state.js +91 -0
  36. package/dist/lib/codex-native/openai-loader-fetch-state.js.map +1 -0
  37. package/dist/lib/codex-native/openai-loader-fetch.d.ts.map +1 -1
  38. package/dist/lib/codex-native/openai-loader-fetch.js +21 -162
  39. package/dist/lib/codex-native/openai-loader-fetch.js.map +1 -1
  40. package/dist/lib/codex-native/request-transform-instructions.d.ts +16 -0
  41. package/dist/lib/codex-native/request-transform-instructions.d.ts.map +1 -0
  42. package/dist/lib/codex-native/request-transform-instructions.js +114 -0
  43. package/dist/lib/codex-native/request-transform-instructions.js.map +1 -0
  44. package/dist/lib/codex-native/request-transform-model.d.ts +39 -0
  45. package/dist/lib/codex-native/request-transform-model.d.ts.map +1 -0
  46. package/dist/lib/codex-native/request-transform-model.js +270 -0
  47. package/dist/lib/codex-native/request-transform-model.js.map +1 -0
  48. package/dist/lib/codex-native/request-transform-payload-helpers.d.ts +26 -0
  49. package/dist/lib/codex-native/request-transform-payload-helpers.d.ts.map +1 -0
  50. package/dist/lib/codex-native/request-transform-payload-helpers.js +232 -0
  51. package/dist/lib/codex-native/request-transform-payload-helpers.js.map +1 -0
  52. package/dist/lib/codex-native/request-transform-payload.d.ts +53 -0
  53. package/dist/lib/codex-native/request-transform-payload.d.ts.map +1 -0
  54. package/dist/lib/codex-native/request-transform-payload.js +214 -0
  55. package/dist/lib/codex-native/request-transform-payload.js.map +1 -0
  56. package/dist/lib/codex-native/request-transform-shared.d.ts +8 -0
  57. package/dist/lib/codex-native/request-transform-shared.d.ts.map +1 -0
  58. package/dist/lib/codex-native/request-transform-shared.js +49 -0
  59. package/dist/lib/codex-native/request-transform-shared.js.map +1 -0
  60. package/dist/lib/codex-native/request-transform.d.ts +3 -122
  61. package/dist/lib/codex-native/request-transform.d.ts.map +1 -1
  62. package/dist/lib/codex-native/request-transform.js +3 -862
  63. package/dist/lib/codex-native/request-transform.js.map +1 -1
  64. package/dist/lib/codex-native/session-affinity-state.d.ts +13 -0
  65. package/dist/lib/codex-native/session-affinity-state.d.ts.map +1 -1
  66. package/dist/lib/codex-native/session-affinity-state.js +20 -8
  67. package/dist/lib/codex-native/session-affinity-state.js.map +1 -1
  68. package/dist/lib/codex-prompts-cache.d.ts.map +1 -1
  69. package/dist/lib/codex-prompts-cache.js.map +1 -1
  70. package/dist/lib/codex-quota-fetch.js +1 -1
  71. package/dist/lib/codex-quota-fetch.js.map +1 -1
  72. package/dist/lib/config/io.d.ts +16 -0
  73. package/dist/lib/config/io.d.ts.map +1 -0
  74. package/dist/lib/config/io.js +64 -0
  75. package/dist/lib/config/io.js.map +1 -0
  76. package/dist/lib/config/parse.d.ts +21 -0
  77. package/dist/lib/config/parse.d.ts.map +1 -0
  78. package/dist/lib/config/parse.js +347 -0
  79. package/dist/lib/config/parse.js.map +1 -0
  80. package/dist/lib/config/resolve.d.ts +27 -0
  81. package/dist/lib/config/resolve.d.ts.map +1 -0
  82. package/dist/lib/config/resolve.js +152 -0
  83. package/dist/lib/config/resolve.js.map +1 -0
  84. package/dist/lib/config/types.d.ts +72 -0
  85. package/dist/lib/config/types.d.ts.map +1 -0
  86. package/dist/lib/config/types.js +151 -0
  87. package/dist/lib/config/types.js.map +1 -0
  88. package/dist/lib/config/validation.d.ts +6 -0
  89. package/dist/lib/config/validation.d.ts.map +1 -0
  90. package/dist/lib/config/validation.js +160 -0
  91. package/dist/lib/config/validation.js.map +1 -0
  92. package/dist/lib/config.d.ts +5 -114
  93. package/dist/lib/config.d.ts.map +1 -1
  94. package/dist/lib/config.js +5 -855
  95. package/dist/lib/config.js.map +1 -1
  96. package/dist/lib/fetch-orchestrator-helpers.d.ts +13 -0
  97. package/dist/lib/fetch-orchestrator-helpers.d.ts.map +1 -0
  98. package/dist/lib/fetch-orchestrator-helpers.js +63 -0
  99. package/dist/lib/fetch-orchestrator-helpers.js.map +1 -0
  100. package/dist/lib/fetch-orchestrator-types.d.ts +71 -0
  101. package/dist/lib/fetch-orchestrator-types.d.ts.map +1 -0
  102. package/dist/lib/fetch-orchestrator-types.js +11 -0
  103. package/dist/lib/fetch-orchestrator-types.js.map +1 -0
  104. package/dist/lib/fetch-orchestrator.d.ts +2 -69
  105. package/dist/lib/fetch-orchestrator.d.ts.map +1 -1
  106. package/dist/lib/fetch-orchestrator.js +30 -79
  107. package/dist/lib/fetch-orchestrator.js.map +1 -1
  108. package/dist/lib/model-catalog/cache-helpers.d.ts +23 -0
  109. package/dist/lib/model-catalog/cache-helpers.d.ts.map +1 -0
  110. package/dist/lib/model-catalog/cache-helpers.js +210 -0
  111. package/dist/lib/model-catalog/cache-helpers.js.map +1 -0
  112. package/dist/lib/model-catalog/catalog-fetch.d.ts +3 -0
  113. package/dist/lib/model-catalog/catalog-fetch.d.ts.map +1 -0
  114. package/dist/lib/model-catalog/catalog-fetch.js +159 -0
  115. package/dist/lib/model-catalog/catalog-fetch.js.map +1 -0
  116. package/dist/lib/model-catalog/provider.d.ts +6 -0
  117. package/dist/lib/model-catalog/provider.d.ts.map +1 -0
  118. package/dist/lib/model-catalog/provider.js +254 -0
  119. package/dist/lib/model-catalog/provider.js.map +1 -0
  120. package/dist/lib/model-catalog/shared.d.ts +95 -0
  121. package/dist/lib/model-catalog/shared.d.ts.map +1 -0
  122. package/dist/lib/model-catalog/shared.js +154 -0
  123. package/dist/lib/model-catalog/shared.js.map +1 -0
  124. package/dist/lib/model-catalog.d.ts +3 -68
  125. package/dist/lib/model-catalog.d.ts.map +1 -1
  126. package/dist/lib/model-catalog.js +3 -767
  127. package/dist/lib/model-catalog.js.map +1 -1
  128. package/dist/lib/proactive-refresh.d.ts.map +1 -1
  129. package/dist/lib/proactive-refresh.js +2 -4
  130. package/dist/lib/proactive-refresh.js.map +1 -1
  131. package/dist/lib/quarantine.js.map +1 -1
  132. package/dist/lib/quota-threshold-alerts.d.ts.map +1 -1
  133. package/dist/lib/quota-threshold-alerts.js +3 -1
  134. package/dist/lib/quota-threshold-alerts.js.map +1 -1
  135. package/dist/lib/rotation.js.map +1 -1
  136. package/dist/lib/storage/domain-state.d.ts +23 -0
  137. package/dist/lib/storage/domain-state.d.ts.map +1 -0
  138. package/dist/lib/storage/domain-state.js +275 -0
  139. package/dist/lib/storage/domain-state.js.map +1 -0
  140. package/dist/lib/storage/migration.d.ts +13 -0
  141. package/dist/lib/storage/migration.d.ts.map +1 -0
  142. package/dist/lib/storage/migration.js +225 -0
  143. package/dist/lib/storage/migration.js.map +1 -0
  144. package/dist/lib/storage.d.ts +2 -9
  145. package/dist/lib/storage.d.ts.map +1 -1
  146. package/dist/lib/storage.js +12 -503
  147. package/dist/lib/storage.js.map +1 -1
  148. package/package.json +10 -9
@@ -0,0 +1,210 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { fetchRemoteText } from "../remote-cache-fetch.js";
5
+ import { isFsErrorCode, readJsonFileBestEffort, writeJsonFileBestEffort } from "../cache-io.js";
6
+ import { withLockedDirectory } from "../cache-lock.js";
7
+ import { buildCodexModelsMemoryCacheKey, codexAuthModelsCachePath, codexModelsCompatShardPath, codexModelsMetaPath, codexModelsSharedCachePath, isCodexModelsCacheFileName } from "../codex-cache-layout.js";
8
+ import { CACHE_TTL_MS, compareSemver, FETCH_TIMEOUT_MS, githubModelsTag, githubModelsUrl, isRecord, normalizeSemver, parseCatalogResponse, parseSemver, parseFetchedAtFromUnknown, semverFromTag } from "./shared.js";
9
+ export function cacheKey(cacheDir, accountId) {
10
+ return buildCodexModelsMemoryCacheKey(cacheDir, accountId);
11
+ }
12
+ export function cachePath(cacheDir, accountId) {
13
+ return codexAuthModelsCachePath(cacheDir, accountId);
14
+ }
15
+ export function opencodeShardCachePath(cacheDir, accountId) {
16
+ return codexModelsCompatShardPath(cacheDir, accountId);
17
+ }
18
+ function opencodeSharedCachePath(cacheDir) {
19
+ return codexModelsSharedCachePath(cacheDir);
20
+ }
21
+ async function readGitHubModelsCacheMeta(cacheDir) {
22
+ const file = codexModelsMetaPath(cacheDir);
23
+ const parsed = await readJsonFileBestEffort(file);
24
+ if (!isRecord(parsed))
25
+ return undefined;
26
+ const parsedVersion = normalizeSemver(typeof parsed.version === "string" ? parsed.version : undefined);
27
+ const parsedTag = typeof parsed.tag === "string" ? parsed.tag.trim() : "";
28
+ const tag = parsedTag || (parsedVersion ? githubModelsTag(parsedVersion) : "");
29
+ const url = typeof parsed.url === "string" ? parsed.url.trim() : "";
30
+ const lastChecked = typeof parsed.lastChecked === "number" && Number.isFinite(parsed.lastChecked) ? parsed.lastChecked : 0;
31
+ const etag = typeof parsed.etag === "string" ? parsed.etag.trim() : undefined;
32
+ if (!tag || !url)
33
+ return undefined;
34
+ return { etag, tag, url, lastChecked };
35
+ }
36
+ async function writeGitHubModelsCacheMeta(cacheDir, meta) {
37
+ const file = codexModelsMetaPath(cacheDir);
38
+ await writeJsonFileBestEffort(file, meta);
39
+ }
40
+ export async function refreshSharedGitHubModelsCache(input) {
41
+ const targetVersion = normalizeSemver(input.targetClientVersion);
42
+ if (!targetVersion)
43
+ return;
44
+ const existingMeta = await readGitHubModelsCacheMeta(input.cacheDir);
45
+ const existingVersion = parseSemver(semverFromTag(existingMeta?.tag));
46
+ const target = parseSemver(targetVersion);
47
+ if (!target)
48
+ return;
49
+ if (existingVersion && compareSemver(existingVersion, target) >= 0)
50
+ return;
51
+ const tag = githubModelsTag(targetVersion);
52
+ const url = githubModelsUrl(targetVersion);
53
+ const result = await fetchRemoteText({
54
+ key: "models",
55
+ url,
56
+ etag: existingMeta?.url === url ? existingMeta.etag : undefined
57
+ }, {
58
+ fetchImpl: input.fetchImpl,
59
+ timeoutMs: FETCH_TIMEOUT_MS,
60
+ allowedHosts: ["raw.githubusercontent.com"]
61
+ });
62
+ if (result.status === "not_modified" && existingMeta) {
63
+ await writeGitHubModelsCacheMeta(input.cacheDir, {
64
+ etag: existingMeta.etag,
65
+ tag,
66
+ lastChecked: input.now,
67
+ url
68
+ });
69
+ return;
70
+ }
71
+ if (result.status !== "ok") {
72
+ return;
73
+ }
74
+ try {
75
+ const payload = JSON.parse(result.text);
76
+ const models = parseCatalogResponse(payload);
77
+ if (models.length === 0)
78
+ return;
79
+ const etag = result.etag || (existingMeta?.url === url ? existingMeta.etag : undefined);
80
+ const file = opencodeSharedCachePath(input.cacheDir);
81
+ await writeJsonFileBestEffort(file, { fetchedAt: input.now, source: "github", models });
82
+ await writeGitHubModelsCacheMeta(input.cacheDir, {
83
+ etag,
84
+ tag,
85
+ lastChecked: input.now,
86
+ url
87
+ });
88
+ }
89
+ catch (_error) {
90
+ // Best effort refresh; continue without blocking catalog load.
91
+ }
92
+ }
93
+ export function isFresh(cache, now) {
94
+ return now - cache.fetchedAt < CACHE_TTL_MS;
95
+ }
96
+ async function withCacheLock(cacheDir, fn) {
97
+ return withLockedDirectory(cacheDir, fn, { staleMs: 10_000 });
98
+ }
99
+ export async function readCatalogFromDisk(cacheDir, accountId) {
100
+ return withCacheLock(cacheDir, async () => {
101
+ const file = cachePath(cacheDir, accountId);
102
+ const parsed = await readJsonFileBestEffort(file);
103
+ if (!isRecord(parsed))
104
+ return undefined;
105
+ if (typeof parsed.fetchedAt !== "number")
106
+ return undefined;
107
+ const models = parseCatalogResponse({ models: parsed.models });
108
+ return {
109
+ fetchedAt: parsed.fetchedAt,
110
+ models
111
+ };
112
+ });
113
+ }
114
+ export async function readCatalogFromOpencodeCache(cacheDir) {
115
+ try {
116
+ const entries = await fs.readdir(cacheDir);
117
+ const candidates = entries.filter((name) => {
118
+ return isCodexModelsCacheFileName(name);
119
+ });
120
+ if (candidates.length === 0)
121
+ return undefined;
122
+ let best;
123
+ for (const fileName of candidates) {
124
+ const parsed = await readJsonFileBestEffort(path.join(cacheDir, fileName));
125
+ if (!isRecord(parsed))
126
+ continue;
127
+ const models = parseCatalogResponse({ models: parsed.models });
128
+ if (models.length === 0)
129
+ continue;
130
+ const fetchedAt = typeof parsed.fetchedAt === "number" ? parsed.fetchedAt : 0;
131
+ if (!best || fetchedAt > best.fetchedAt) {
132
+ best = {
133
+ fetchedAt,
134
+ models
135
+ };
136
+ }
137
+ }
138
+ return best;
139
+ }
140
+ catch (error) {
141
+ if (!isFsErrorCode(error, "ENOENT")) {
142
+ // Best effort fallback discovery.
143
+ }
144
+ return undefined;
145
+ }
146
+ }
147
+ export async function readCatalogFromCodexCliCache() {
148
+ const file = path.join(os.homedir(), ".codex", "models_cache.json");
149
+ const parsed = await readJsonFileBestEffort(file);
150
+ if (!isRecord(parsed))
151
+ return undefined;
152
+ const models = parseCatalogResponse({ models: parsed.models });
153
+ if (models.length === 0)
154
+ return undefined;
155
+ return {
156
+ fetchedAt: parseFetchedAtFromUnknown(parsed.fetched_at ?? parsed.fetchedAt),
157
+ models
158
+ };
159
+ }
160
+ export async function writeCatalogToDisk(cacheDir, accountId, cache) {
161
+ await withCacheLock(cacheDir, async () => {
162
+ const primaryFile = cachePath(cacheDir, accountId);
163
+ const compatFile = opencodeShardCachePath(cacheDir, accountId);
164
+ const files = compatFile ? [primaryFile, compatFile] : [primaryFile];
165
+ for (const file of files) {
166
+ await writeJsonFileBestEffort(file, cache);
167
+ }
168
+ }).catch((error) => {
169
+ if (error instanceof Error) {
170
+ // Best effort cache persistence.
171
+ }
172
+ // Best effort cache persistence.
173
+ });
174
+ }
175
+ export function emitEvent(input, event) {
176
+ try {
177
+ input.onEvent?.({
178
+ ...event,
179
+ scope: input.accountId?.trim() ? "account" : "shared"
180
+ });
181
+ }
182
+ catch (error) {
183
+ if (error instanceof Error) {
184
+ // Keep catalog path side-effect free even if observer callback throws.
185
+ }
186
+ // Keep catalog path side-effect free.
187
+ }
188
+ }
189
+ export function deriveReason(value) {
190
+ if (value instanceof Error) {
191
+ return value.name || "error";
192
+ }
193
+ return "error";
194
+ }
195
+ export function emitStaleCacheFallback(input, fallback) {
196
+ if (fallback.disk) {
197
+ emitEvent(input, { type: "stale_cache_used", reason: "network_fetch_failed" });
198
+ return fallback.disk.models;
199
+ }
200
+ if (fallback.opencode) {
201
+ emitEvent(input, { type: "stale_cache_used", reason: "opencode_cache_fallback" });
202
+ return fallback.opencode.models;
203
+ }
204
+ if (fallback.codexCli) {
205
+ emitEvent(input, { type: "stale_cache_used", reason: "codex_cli_cache_fallback" });
206
+ return fallback.codexCli.models;
207
+ }
208
+ return undefined;
209
+ }
210
+ //# sourceMappingURL=cache-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-helpers.js","sourceRoot":"","sources":["../../../lib/model-catalog/cache-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type CodexModelInfo, type GetCodexModelCatalogInput } from "./shared.js";
2
+ export declare function getCodexModelCatalog(input: GetCodexModelCatalogInput): Promise<CodexModelInfo[] | undefined>;
3
+ //# sourceMappingURL=catalog-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-fetch.d.ts","sourceRoot":"","sources":["../../../lib/model-catalog/catalog-fetch.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,cAAc,EAInB,KAAK,yBAAyB,EAG/B,MAAM,aAAa,CAAA;AAkBpB,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,EAAE,GAAG,SAAS,CAAC,CAqJlH"}
@@ -0,0 +1,159 @@
1
+ import { cacheKey, deriveReason, emitEvent, emitStaleCacheFallback, isFresh, readCatalogFromCodexCliCache, readCatalogFromDisk, readCatalogFromOpencodeCache, refreshSharedGitHubModelsCache, writeCatalogToDisk } from "./cache-helpers.js";
2
+ import { CODEX_MODELS_ENDPOINT, DEFAULT_CLIENT_VERSION, FETCH_TIMEOUT_MS, parseCatalogResponse, normalizeSemver } from "./shared.js";
3
+ import { resolveCodexCacheDir } from "../codex-cache-layout.js";
4
+ const inMemoryCatalog = new Map();
5
+ const inFlightCatalogFetches = new Map();
6
+ function normalizeClientVersion(value, fallback) {
7
+ const trimmed = value?.trim();
8
+ if (trimmed)
9
+ return trimmed;
10
+ const fallbackTrimmed = fallback?.trim();
11
+ return fallbackTrimmed || DEFAULT_CLIENT_VERSION;
12
+ }
13
+ function buildModelsEndpoint(clientVersion) {
14
+ const separator = CODEX_MODELS_ENDPOINT.includes("?") ? "&" : "?";
15
+ return `${CODEX_MODELS_ENDPOINT}${separator}client_version=${encodeURIComponent(clientVersion)}`;
16
+ }
17
+ export async function getCodexModelCatalog(input) {
18
+ const now = (input.now ?? Date.now)();
19
+ const cacheDir = resolveCodexCacheDir(input.cacheDir);
20
+ const key = cacheKey(cacheDir, input.accountId);
21
+ const fetchImpl = input.fetchImpl ?? fetch;
22
+ const accessToken = input.accessToken?.trim();
23
+ const targetClientVersion = normalizeSemver(input.clientVersion) ?? normalizeSemver(input.versionHeader);
24
+ const defaultGithubModelsRefresh = Boolean(accessToken) && input.fetchImpl === undefined && targetClientVersion !== undefined;
25
+ const shouldRefreshGithubModelsCache = input.refreshGithubModelsCache ?? defaultGithubModelsRefresh;
26
+ if (shouldRefreshGithubModelsCache) {
27
+ await refreshSharedGitHubModelsCache({
28
+ cacheDir,
29
+ targetClientVersion,
30
+ now,
31
+ fetchImpl
32
+ });
33
+ }
34
+ const memory = inMemoryCatalog.get(key);
35
+ const allowMemoryHit = !memory?.staleFallback || !accessToken;
36
+ if (memory && !input.forceRefresh && isFresh(memory, now) && allowMemoryHit) {
37
+ emitEvent(input, { type: "memory_cache_hit" });
38
+ return memory.models;
39
+ }
40
+ const disk = await readCatalogFromDisk(cacheDir, input.accountId);
41
+ const hasFreshDisk = !!disk && isFresh(disk, now);
42
+ if (hasFreshDisk && !input.forceRefresh) {
43
+ inMemoryCatalog.set(key, disk);
44
+ emitEvent(input, { type: "disk_cache_hit" });
45
+ return disk.models;
46
+ }
47
+ let opencodeCacheFallback;
48
+ let codexCliCacheFallback;
49
+ const ensureFallbackCaches = async () => {
50
+ if (opencodeCacheFallback !== undefined || codexCliCacheFallback !== undefined)
51
+ return;
52
+ opencodeCacheFallback = await readCatalogFromOpencodeCache(cacheDir);
53
+ codexCliCacheFallback = await readCatalogFromCodexCliCache();
54
+ };
55
+ if (!accessToken) {
56
+ await ensureFallbackCaches();
57
+ if (disk) {
58
+ emitEvent(input, { type: "stale_cache_used", reason: "missing_access_token" });
59
+ inMemoryCatalog.set(key, disk);
60
+ return disk.models;
61
+ }
62
+ const stale = emitStaleCacheFallback(input, {
63
+ opencode: opencodeCacheFallback,
64
+ codexCli: codexCliCacheFallback
65
+ });
66
+ if (stale) {
67
+ inMemoryCatalog.set(key, {
68
+ fetchedAt: now,
69
+ models: stale,
70
+ staleFallback: true
71
+ });
72
+ return stale;
73
+ }
74
+ emitEvent(input, { type: "catalog_unavailable", reason: "missing_access_token" });
75
+ return undefined;
76
+ }
77
+ const headers = {
78
+ authorization: `Bearer ${accessToken}`,
79
+ originator: input.originator?.trim() || "opencode"
80
+ };
81
+ const clientVersion = normalizeClientVersion(input.clientVersion, input.versionHeader);
82
+ const versionHeader = normalizeClientVersion(input.versionHeader, input.clientVersion);
83
+ if (versionHeader)
84
+ headers.version = versionHeader;
85
+ const userAgent = input.userAgent?.trim();
86
+ if (userAgent)
87
+ headers["user-agent"] = userAgent;
88
+ const betaValue = input.openaiBeta?.trim();
89
+ if (betaValue)
90
+ headers["openai-beta"] = betaValue;
91
+ const accountId = input.accountId?.trim() || undefined;
92
+ if (accountId) {
93
+ headers["chatgpt-account-id"] = accountId;
94
+ }
95
+ const existingInFlight = inFlightCatalogFetches.get(key);
96
+ if (existingInFlight) {
97
+ return existingInFlight;
98
+ }
99
+ const inFlight = (async () => {
100
+ try {
101
+ const controller = new AbortController();
102
+ const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
103
+ let response;
104
+ try {
105
+ const endpoint = buildModelsEndpoint(clientVersion);
106
+ response = await fetchImpl(endpoint, {
107
+ method: "GET",
108
+ headers,
109
+ signal: controller.signal
110
+ });
111
+ }
112
+ finally {
113
+ clearTimeout(timeout);
114
+ }
115
+ if (!response.ok) {
116
+ throw new Error(`codex models request failed with status ${response.status}`);
117
+ }
118
+ const payload = await response.json();
119
+ const models = parseCatalogResponse(payload);
120
+ if (models.length === 0) {
121
+ throw new Error("codex models response did not contain usable models");
122
+ }
123
+ const nextCache = {
124
+ fetchedAt: now,
125
+ models
126
+ };
127
+ inMemoryCatalog.set(key, nextCache);
128
+ await writeCatalogToDisk(cacheDir, accountId, nextCache);
129
+ emitEvent(input, { type: "network_fetch_success" });
130
+ return nextCache.models;
131
+ }
132
+ catch (error) {
133
+ emitEvent(input, { type: "network_fetch_failed", reason: deriveReason(error) });
134
+ await ensureFallbackCaches();
135
+ const stale = emitStaleCacheFallback(input, {
136
+ disk,
137
+ opencode: opencodeCacheFallback,
138
+ codexCli: codexCliCacheFallback
139
+ });
140
+ if (stale) {
141
+ inMemoryCatalog.set(key, {
142
+ fetchedAt: now,
143
+ models: stale,
144
+ staleFallback: true
145
+ });
146
+ return stale;
147
+ }
148
+ emitEvent(input, { type: "catalog_unavailable", reason: "network_fetch_failed" });
149
+ return undefined;
150
+ }
151
+ })();
152
+ inFlightCatalogFetches.set(key, inFlight);
153
+ return inFlight.finally(() => {
154
+ if (inFlightCatalogFetches.get(key) === inFlight) {
155
+ inFlightCatalogFetches.delete(key);
156
+ }
157
+ });
158
+ }
159
+ //# sourceMappingURL=catalog-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-fetch.js","sourceRoot":"","sources":["../../../lib/model-catalog/catalog-fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type ApplyCodexCatalogInput, type CodexModelInfo, type CodexModelRuntimeDefaults, type PersonalityOption } from "./shared.js";
2
+ export declare function resolveInstructionsForModel(model: CodexModelInfo, personality?: PersonalityOption): string | undefined;
3
+ export declare function getRuntimeDefaultsForModel(model: CodexModelInfo | undefined): CodexModelRuntimeDefaults | undefined;
4
+ export declare function getRuntimeDefaultsForSlug(slug: string, catalogModels: CodexModelInfo[] | undefined): CodexModelRuntimeDefaults | undefined;
5
+ export declare function applyCodexCatalogToProviderModels(input: ApplyCodexCatalogInput): void;
6
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../lib/model-catalog/provider.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAK9B,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAA;AAqGpB,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,cAAc,EACrB,WAAW,CAAC,EAAE,iBAAiB,GAC9B,MAAM,GAAG,SAAS,CAiBpB;AA4CD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,GAAG,yBAAyB,GAAG,SAAS,CA6CnH;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,cAAc,EAAE,GAAG,SAAS,GAC1C,yBAAyB,GAAG,SAAS,CAGvC;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAqErF"}
@@ -0,0 +1,254 @@
1
+ import { resolveCustomPersonalityDescription } from "../personalities.js";
2
+ import { compareModelSlugs, EFFORT_SUFFIX_REGEX, normalizeReasoningEffort, normalizeVerbosity } from "./shared.js";
3
+ const UNRESOLVED_TEMPLATE_MARKER_REGEX = /\{\{\s*[^}]+\s*\}\}/;
4
+ const STALE_BRIDGE_MARKERS = [
5
+ /multi_tool_use\.parallel/i,
6
+ /assistant\s+to=multi_tool_use\.parallel/i,
7
+ /functions\.(read|exec_command|write_stdin|apply_patch|edit|grep|glob|list)\b/i,
8
+ /recipient_name\s*[:=]/i
9
+ ];
10
+ function cloneModelTemplate(template, slug) {
11
+ const cloned = { ...template };
12
+ setModelIdentityFields(cloned, slug);
13
+ return cloned;
14
+ }
15
+ function formatModelDisplayNameFromSlug(slug) {
16
+ const tokens = slug
17
+ .trim()
18
+ .split("-")
19
+ .map((part) => part.trim())
20
+ .filter((part) => part.length > 0);
21
+ if (tokens.length === 0)
22
+ return slug;
23
+ const words = tokens.map((token) => {
24
+ if (token.toLowerCase() === "gpt")
25
+ return "GPT";
26
+ if (token.length === 1)
27
+ return token.toUpperCase();
28
+ return `${token.charAt(0).toUpperCase()}${token.slice(1).toLowerCase()}`;
29
+ });
30
+ if (words[0] === "GPT" && words.length > 1) {
31
+ return [`${words[0]}-${words[1]}`, ...words.slice(2)].join(" ");
32
+ }
33
+ return words.join(" ");
34
+ }
35
+ function setModelIdentityFields(model, slug) {
36
+ const display = formatModelDisplayNameFromSlug(slug);
37
+ for (const key of ["id", "slug", "model"]) {
38
+ model[key] = slug;
39
+ }
40
+ for (const key of ["name", "displayName", "display_name"]) {
41
+ model[key] = display;
42
+ }
43
+ }
44
+ function resolvePersonalityText(model, personality) {
45
+ const vars = model.model_messages?.instructions_variables;
46
+ const normalized = (personality ?? "none").trim().toLowerCase();
47
+ if (!normalized)
48
+ return undefined;
49
+ if (normalized !== "none") {
50
+ const fromFile = resolveCustomPersonalityDescription(normalized);
51
+ if (typeof fromFile === "string" && fromFile.trim()) {
52
+ return fromFile;
53
+ }
54
+ }
55
+ if (!vars)
56
+ return undefined;
57
+ if (vars.personalities && typeof vars.personalities === "object") {
58
+ const fromMap = vars.personalities[normalized] ?? vars.personalities.default;
59
+ if (typeof fromMap === "string" && fromMap.trim()) {
60
+ return fromMap;
61
+ }
62
+ }
63
+ if (normalized === "friendly" && typeof vars.personality_friendly === "string" && vars.personality_friendly.trim()) {
64
+ return vars.personality_friendly;
65
+ }
66
+ if (normalized === "pragmatic" &&
67
+ typeof vars.personality_pragmatic === "string" &&
68
+ vars.personality_pragmatic.trim()) {
69
+ return vars.personality_pragmatic;
70
+ }
71
+ if (typeof vars.personality_default === "string" && vars.personality_default.trim()) {
72
+ return vars.personality_default;
73
+ }
74
+ if (typeof vars.personality === "string" && vars.personality.trim()) {
75
+ return vars.personality;
76
+ }
77
+ return undefined;
78
+ }
79
+ function isCompatibleInstructionsText(value) {
80
+ if (UNRESOLVED_TEMPLATE_MARKER_REGEX.test(value))
81
+ return false;
82
+ return !STALE_BRIDGE_MARKERS.some((pattern) => pattern.test(value));
83
+ }
84
+ function normalizeSafeInstructions(value) {
85
+ if (!value)
86
+ return undefined;
87
+ const trimmed = value.trim();
88
+ if (!trimmed)
89
+ return undefined;
90
+ return isCompatibleInstructionsText(trimmed) ? trimmed : undefined;
91
+ }
92
+ export function resolveInstructionsForModel(model, personality) {
93
+ const template = model.model_messages?.instructions_template?.trim();
94
+ const base = model.base_instructions?.trim();
95
+ const safeBase = normalizeSafeInstructions(base);
96
+ if (!template)
97
+ return safeBase;
98
+ if (!template.includes("{{") && !template.includes("}}")) {
99
+ return normalizeSafeInstructions(template) ?? safeBase;
100
+ }
101
+ const personalityText = resolvePersonalityText(model, personality) ?? "";
102
+ const rendered = template
103
+ .replace(/\{\{\s*personality\s*\}\}/gi, personalityText)
104
+ .replace(/\n{3,}/g, "\n\n")
105
+ .trim();
106
+ return normalizeSafeInstructions(rendered) ?? safeBase;
107
+ }
108
+ function resolveAllowedSlugs(catalogModels, fallback) {
109
+ const preferred = (catalogModels ?? []).map((model) => model.slug).filter((slug) => slug.length > 0);
110
+ if (preferred.length > 0) {
111
+ return Array.from(new Set(preferred)).sort(compareModelSlugs);
112
+ }
113
+ return Array.from(new Set(fallback.map((slug) => slug.trim().toLowerCase()).filter(Boolean))).sort(compareModelSlugs);
114
+ }
115
+ function resolveTemplateSource(providerModels) {
116
+ for (const candidate of ["gpt-5.3-codex", "gpt-5.2-codex", "gpt-5.1-codex", "gpt-5.2"]) {
117
+ const found = providerModels[candidate];
118
+ if (found)
119
+ return found;
120
+ }
121
+ const first = Object.values(providerModels)[0];
122
+ return first;
123
+ }
124
+ function stripEffortSuffix(slug) {
125
+ return slug.replace(EFFORT_SUFFIX_REGEX, "");
126
+ }
127
+ function ensureModelOptions(model) {
128
+ const existing = model.options;
129
+ if (typeof existing === "object" && existing !== null && !Array.isArray(existing)) {
130
+ return existing;
131
+ }
132
+ const options = {};
133
+ model.options = options;
134
+ return options;
135
+ }
136
+ function findModelBySlug(catalogModels, slug) {
137
+ if (!catalogModels || catalogModels.length === 0)
138
+ return undefined;
139
+ const normalized = slug.trim().toLowerCase();
140
+ const exact = catalogModels.find((item) => item.slug === normalized);
141
+ if (exact)
142
+ return exact;
143
+ const base = stripEffortSuffix(normalized);
144
+ return catalogModels.find((item) => item.slug === base);
145
+ }
146
+ export function getRuntimeDefaultsForModel(model) {
147
+ if (!model)
148
+ return undefined;
149
+ const out = {};
150
+ if (typeof model.apply_patch_tool_type === "string") {
151
+ const next = model.apply_patch_tool_type.trim();
152
+ if (next)
153
+ out.applyPatchToolType = next;
154
+ }
155
+ const defaultReasoningEffort = normalizeReasoningEffort(model.default_reasoning_level);
156
+ if (defaultReasoningEffort) {
157
+ out.defaultReasoningEffort = defaultReasoningEffort;
158
+ }
159
+ const supportedReasoningEfforts = Array.from(new Set((model.supported_reasoning_levels ?? [])
160
+ .map((level) => normalizeReasoningEffort(level.effort))
161
+ .filter((value) => value !== undefined)));
162
+ if (supportedReasoningEfforts.length > 0) {
163
+ out.supportedReasoningEfforts = supportedReasoningEfforts;
164
+ }
165
+ if (typeof model.supports_reasoning_summaries === "boolean") {
166
+ out.supportsReasoningSummaries = model.supports_reasoning_summaries;
167
+ }
168
+ if (typeof model.reasoning_summary_format === "string") {
169
+ const next = model.reasoning_summary_format.trim();
170
+ if (next)
171
+ out.reasoningSummaryFormat = next;
172
+ }
173
+ if (typeof model.support_verbosity === "boolean") {
174
+ out.supportsVerbosity = model.support_verbosity;
175
+ }
176
+ const defaultVerbosity = normalizeVerbosity(model.default_verbosity);
177
+ if (defaultVerbosity) {
178
+ out.defaultVerbosity = defaultVerbosity;
179
+ }
180
+ return Object.keys(out).length > 0 ? out : undefined;
181
+ }
182
+ export function getRuntimeDefaultsForSlug(slug, catalogModels) {
183
+ const model = findModelBySlug(catalogModels, slug);
184
+ return getRuntimeDefaultsForModel(model);
185
+ }
186
+ export function applyCodexCatalogToProviderModels(input) {
187
+ const allowedSlugs = resolveAllowedSlugs(input.catalogModels, input.fallbackModels);
188
+ const allowed = new Set(allowedSlugs);
189
+ const bySlug = new Map((input.catalogModels ?? []).map((model) => [model.slug, model]));
190
+ const templateSource = resolveTemplateSource(input.providerModels);
191
+ for (const slug of allowedSlugs) {
192
+ if (!input.providerModels[slug]) {
193
+ if (templateSource) {
194
+ input.providerModels[slug] = cloneModelTemplate(templateSource, slug);
195
+ }
196
+ else {
197
+ input.providerModels[slug] = { id: slug, model: slug };
198
+ }
199
+ }
200
+ else {
201
+ setModelIdentityFields(input.providerModels[slug], slug);
202
+ }
203
+ const catalogModel = bySlug.get(slug);
204
+ const options = ensureModelOptions(input.providerModels[slug]);
205
+ if (catalogModel) {
206
+ const instructions = resolveInstructionsForModel(catalogModel, input.personality);
207
+ options.codexCatalogModel = catalogModel;
208
+ if (instructions) {
209
+ input.providerModels[slug].instructions = instructions;
210
+ options.codexInstructions = instructions;
211
+ }
212
+ else {
213
+ delete options.codexInstructions;
214
+ }
215
+ }
216
+ else {
217
+ delete options.codexCatalogModel;
218
+ }
219
+ const runtimeDefaults = getRuntimeDefaultsForSlug(slug, input.catalogModels);
220
+ if (runtimeDefaults) {
221
+ input.providerModels[slug].codexRuntimeDefaults = runtimeDefaults;
222
+ options.codexRuntimeDefaults = runtimeDefaults;
223
+ }
224
+ else {
225
+ delete input.providerModels[slug].codexRuntimeDefaults;
226
+ delete options.codexRuntimeDefaults;
227
+ }
228
+ }
229
+ for (const modelId of Object.keys(input.providerModels)) {
230
+ if (!allowed.has(modelId)) {
231
+ delete input.providerModels[modelId];
232
+ }
233
+ }
234
+ const orderedModelIds = Object.keys(input.providerModels).sort((a, b) => b.localeCompare(a));
235
+ if (orderedModelIds.length > 1) {
236
+ const orderedEntries = orderedModelIds.map((modelId) => [modelId, input.providerModels[modelId]]);
237
+ for (const modelId of Object.keys(input.providerModels)) {
238
+ delete input.providerModels[modelId];
239
+ }
240
+ for (const [modelId, model] of orderedEntries) {
241
+ if (model) {
242
+ input.providerModels[modelId] = model;
243
+ }
244
+ }
245
+ }
246
+ for (const model of Object.values(input.providerModels)) {
247
+ model.cost = {
248
+ input: 0,
249
+ output: 0,
250
+ cache: { read: 0, write: 0 }
251
+ };
252
+ }
253
+ }
254
+ //# sourceMappingURL=provider.js.map