@tokensrc/codex 1.12.1
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.md +74 -0
- package/assets/codex-shortcut-icon.icns +0 -0
- package/assets/codex-shortcut-icon.ico +0 -0
- package/dist/account-display.d.ts +16 -0
- package/dist/account-display.js +35 -0
- package/dist/account-display.js.map +1 -0
- package/dist/bin-app.d.ts +2 -0
- package/dist/bin-app.js +12 -0
- package/dist/bin-app.js.map +1 -0
- package/dist/bin-run.d.ts +2 -0
- package/dist/bin-run.js +12 -0
- package/dist/bin-run.js.map +1 -0
- package/dist/branding.d.ts +2 -0
- package/dist/branding.js +8 -0
- package/dist/branding.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +69 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +27 -0
- package/dist/client.js +177 -0
- package/dist/client.js.map +1 -0
- package/dist/command-directory.d.ts +15 -0
- package/dist/command-directory.js +28 -0
- package/dist/command-directory.js.map +1 -0
- package/dist/commands.d.ts +25 -0
- package/dist/commands.js +507 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.js +272 -0
- package/dist/config.js.map +1 -0
- package/dist/console-status.d.ts +58 -0
- package/dist/console-status.js +84 -0
- package/dist/console-status.js.map +1 -0
- package/dist/credentials.d.ts +52 -0
- package/dist/credentials.js +130 -0
- package/dist/credentials.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/legacy-cleanup.d.ts +5 -0
- package/dist/legacy-cleanup.js +36 -0
- package/dist/legacy-cleanup.js.map +1 -0
- package/dist/oidc.d.ts +26 -0
- package/dist/oidc.js +154 -0
- package/dist/oidc.js.map +1 -0
- package/dist/private-file.d.ts +3 -0
- package/dist/private-file.js +30 -0
- package/dist/private-file.js.map +1 -0
- package/dist/profile.d.ts +29 -0
- package/dist/profile.js +253 -0
- package/dist/profile.js.map +1 -0
- package/dist/protocol.d.ts +752 -0
- package/dist/protocol.js +235 -0
- package/dist/protocol.js.map +1 -0
- package/dist/quota-cache.d.ts +18 -0
- package/dist/quota-cache.js +66 -0
- package/dist/quota-cache.js.map +1 -0
- package/dist/runtime.d.ts +16 -0
- package/dist/runtime.js +144 -0
- package/dist/runtime.js.map +1 -0
- package/dist/selection.d.ts +18 -0
- package/dist/selection.js +42 -0
- package/dist/selection.js.map +1 -0
- package/dist/shortcuts.d.ts +30 -0
- package/dist/shortcuts.js +122 -0
- package/dist/shortcuts.js.map +1 -0
- package/dist/tui.d.ts +29 -0
- package/dist/tui.js +278 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +104 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +92 -0
package/dist/profile.js
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { CodexError } from "./errors.js";
|
|
6
|
+
import { PACKAGE_VERSION } from "./branding.js";
|
|
7
|
+
import { readJsonIfExists, writePrivateJson } from "./private-file.js";
|
|
8
|
+
const AuthoritySchema = z.object({
|
|
9
|
+
issuer: z.string().url(),
|
|
10
|
+
discoveryUrl: z.string().url(),
|
|
11
|
+
clientId: z.string().min(1),
|
|
12
|
+
scopes: z.array(z.string().min(1)).min(1)
|
|
13
|
+
});
|
|
14
|
+
const ServiceSchema = z.object({
|
|
15
|
+
baseUrl: z.string().url(),
|
|
16
|
+
resource: z.string().url(),
|
|
17
|
+
authority: z.string().min(1),
|
|
18
|
+
audience: z.string().min(1),
|
|
19
|
+
roleClientId: z.string().min(1),
|
|
20
|
+
apiVersion: z.string().min(1)
|
|
21
|
+
});
|
|
22
|
+
const ProfileSchema = z.object({
|
|
23
|
+
schemaVersion: z.literal(1),
|
|
24
|
+
profileId: z.string().min(1),
|
|
25
|
+
revision: z.number().int().positive(),
|
|
26
|
+
environment: z.string().min(1),
|
|
27
|
+
tenant: z.object({ id: z.string().min(1), headerName: z.string().min(1) }),
|
|
28
|
+
authorities: z.record(z.string(), AuthoritySchema),
|
|
29
|
+
services: z.object({ codex: ServiceSchema.optional() }).catchall(z.unknown()),
|
|
30
|
+
cache: z.object({ maxAgeSeconds: z.number().int().positive().max(86_400) }).optional(),
|
|
31
|
+
minimumClientVersions: z.record(z.string(), z.string()).optional()
|
|
32
|
+
});
|
|
33
|
+
const ProtectedResourceSchema = z.object({
|
|
34
|
+
resource: z.string().url(),
|
|
35
|
+
authorization_servers: z.array(z.string().url()).min(1),
|
|
36
|
+
resource_documentation: z.string().url().optional()
|
|
37
|
+
});
|
|
38
|
+
const DiscoverySchema = z.object({
|
|
39
|
+
issuer: z.string().url(),
|
|
40
|
+
authorization_endpoint: z.string().url(),
|
|
41
|
+
token_endpoint: z.string().url(),
|
|
42
|
+
jwks_uri: z.string().url()
|
|
43
|
+
});
|
|
44
|
+
const MAX_STALE_MS = 24 * 60 * 60_000;
|
|
45
|
+
export async function resolveCodexProfile(options) {
|
|
46
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
47
|
+
const tenantId = options.tenantId?.trim();
|
|
48
|
+
let resourceMetadata;
|
|
49
|
+
let metadataFailure;
|
|
50
|
+
let profileUrl = options.profileUrl?.trim();
|
|
51
|
+
if (!profileUrl) {
|
|
52
|
+
if (!options.serverUrl || !tenantId) {
|
|
53
|
+
throw new CodexError("profileUrl, or both serverUrl and tenantId, are required.", "invalid_configuration");
|
|
54
|
+
}
|
|
55
|
+
const origin = serviceOrigin(options.serverUrl);
|
|
56
|
+
const metadataUrl = `${origin}/.well-known/oauth-protected-resource/tenants/${encodeURIComponent(tenantId)}`;
|
|
57
|
+
let metadataRaw;
|
|
58
|
+
try {
|
|
59
|
+
metadataRaw = await fetchJson(fetchImpl, metadataUrl);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
metadataFailure = error;
|
|
63
|
+
profileUrl = `${origin}/public/v1/tenants/${encodeURIComponent(tenantId)}/client-configuration`;
|
|
64
|
+
}
|
|
65
|
+
if (metadataRaw !== undefined) {
|
|
66
|
+
const parsedMetadata = ProtectedResourceSchema.safeParse(metadataRaw);
|
|
67
|
+
if (!parsedMetadata.success) {
|
|
68
|
+
throw new CodexError("Protected-resource metadata is invalid.", "invalid_profile");
|
|
69
|
+
}
|
|
70
|
+
resourceMetadata = parsedMetadata.data;
|
|
71
|
+
const expectedResource = `${origin}/tenants/${tenantId}`;
|
|
72
|
+
if (stripTrailingSlash(resourceMetadata.resource) !== stripTrailingSlash(expectedResource)) {
|
|
73
|
+
throw new CodexError("Protected-resource metadata returned an unexpected resource.", "invalid_profile");
|
|
74
|
+
}
|
|
75
|
+
profileUrl = resourceMetadata.resource_documentation
|
|
76
|
+
?? `${origin}/public/v1/tenants/${encodeURIComponent(tenantId)}/client-configuration`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const resolvedProfileUrl = profileUrl;
|
|
80
|
+
if (!resolvedProfileUrl) {
|
|
81
|
+
throw new CodexError("Unable to determine the Codex profile URL.", "invalid_configuration");
|
|
82
|
+
}
|
|
83
|
+
validateRemoteUrl(resolvedProfileUrl);
|
|
84
|
+
const cacheDirectory = options.configDirectory ?? defaultProfileDirectory();
|
|
85
|
+
const cacheFile = join(cacheDirectory, `profile-${createHash("sha256").update(resolvedProfileUrl).digest("hex").slice(0, 24)}.json`);
|
|
86
|
+
const cached = await readProfileCache(cacheFile, resolvedProfileUrl);
|
|
87
|
+
const now = (options.now ?? Date.now)();
|
|
88
|
+
let raw;
|
|
89
|
+
let etag;
|
|
90
|
+
let stale = false;
|
|
91
|
+
let pendingCache;
|
|
92
|
+
const cachedProfile = cached ? ProfileSchema.safeParse(cached.profile) : undefined;
|
|
93
|
+
const cacheMaxAgeMs = cachedProfile?.success
|
|
94
|
+
? (cachedProfile.data.cache?.maxAgeSeconds ?? 300) * 1_000
|
|
95
|
+
: 0;
|
|
96
|
+
if (metadataFailure) {
|
|
97
|
+
if (!cached || !cachedProfile?.success || now - cached.fetchedAt > MAX_STALE_MS) {
|
|
98
|
+
throw new CodexError(`Unable to resolve protected-resource metadata: ${metadataFailure instanceof Error ? metadataFailure.message : String(metadataFailure)}`, "profile_unavailable");
|
|
99
|
+
}
|
|
100
|
+
raw = cached.profile;
|
|
101
|
+
stale = true;
|
|
102
|
+
options.onWarning?.("Protected-resource metadata is temporarily unavailable; using a previously validated profile snapshot.");
|
|
103
|
+
}
|
|
104
|
+
else
|
|
105
|
+
try {
|
|
106
|
+
if (cached && now - cached.fetchedAt < cacheMaxAgeMs) {
|
|
107
|
+
raw = cached.profile;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const response = await fetchImpl(resolvedProfileUrl, {
|
|
111
|
+
headers: {
|
|
112
|
+
Accept: "application/json",
|
|
113
|
+
...(cached?.etag ? { "If-None-Match": cached.etag } : {})
|
|
114
|
+
},
|
|
115
|
+
signal: AbortSignal.timeout(5_000)
|
|
116
|
+
});
|
|
117
|
+
if (response.status === 304 && cached) {
|
|
118
|
+
raw = cached.profile;
|
|
119
|
+
etag = cached.etag;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
if (!response.ok)
|
|
123
|
+
throw new Error(`HTTP ${response.status}`);
|
|
124
|
+
raw = await response.json();
|
|
125
|
+
etag = response.headers.get("etag") ?? undefined;
|
|
126
|
+
const next = ProfileSchema.safeParse(raw);
|
|
127
|
+
if (!next.success) {
|
|
128
|
+
throw new CodexError("Client configuration does not match schema v1.", "invalid_profile");
|
|
129
|
+
}
|
|
130
|
+
const previous = cached ? ProfileSchema.safeParse(cached.profile) : undefined;
|
|
131
|
+
if (previous?.success && next.data.profileId === previous.data.profileId
|
|
132
|
+
&& next.data.revision < previous.data.revision) {
|
|
133
|
+
throw new CodexError("Client configuration revision is older than the cached snapshot.", "invalid_profile");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
pendingCache = {
|
|
137
|
+
schemaVersion: 1, sourceUrl: resolvedProfileUrl, fetchedAt: now, ...(etag ? { etag } : {}), profile: raw
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
if (!cached || !cachedProfile?.success || now - cached.fetchedAt > MAX_STALE_MS) {
|
|
143
|
+
if (error instanceof CodexError)
|
|
144
|
+
throw error;
|
|
145
|
+
throw new CodexError(`Unable to resolve Codex profile: ${error instanceof Error ? error.message : String(error)}`, "profile_unavailable");
|
|
146
|
+
}
|
|
147
|
+
raw = cached.profile;
|
|
148
|
+
stale = true;
|
|
149
|
+
options.onWarning?.("Codex profile is temporarily unavailable; using a cached snapshot less than 24 hours old.");
|
|
150
|
+
}
|
|
151
|
+
const profile = ProfileSchema.safeParse(raw);
|
|
152
|
+
if (!profile.success)
|
|
153
|
+
throw new CodexError("Client configuration does not match schema v1.", "invalid_profile");
|
|
154
|
+
const minimumVersion = profile.data.minimumClientVersions?.tokensrcCodex;
|
|
155
|
+
if (minimumVersion && compareVersions(PACKAGE_VERSION, minimumVersion) < 0) {
|
|
156
|
+
throw new CodexError(`@tokensrc/codex ${minimumVersion} or newer is required by this profile.`, "client_upgrade_required");
|
|
157
|
+
}
|
|
158
|
+
if (tenantId && profile.data.tenant.id !== tenantId) {
|
|
159
|
+
throw new CodexError("Client configuration tenant does not match the selected tenant.", "invalid_profile");
|
|
160
|
+
}
|
|
161
|
+
const codex = profile.data.services.codex;
|
|
162
|
+
if (!codex)
|
|
163
|
+
throw new CodexError("Codex is not available in the selected profile.", "module_unavailable");
|
|
164
|
+
const authority = profile.data.authorities[codex.authority];
|
|
165
|
+
if (!authority)
|
|
166
|
+
throw new CodexError("Codex references an unknown authority.", "invalid_profile");
|
|
167
|
+
if (resourceMetadata) {
|
|
168
|
+
if (stripTrailingSlash(codex.resource) !== stripTrailingSlash(resourceMetadata.resource)
|
|
169
|
+
|| !resourceMetadata.authorization_servers.map(stripTrailingSlash).includes(stripTrailingSlash(authority.issuer))) {
|
|
170
|
+
throw new CodexError("Codex profile is inconsistent with protected-resource metadata.", "invalid_profile");
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (!stale) {
|
|
174
|
+
const discovery = DiscoverySchema.safeParse(await fetchJson(fetchImpl, authority.discoveryUrl));
|
|
175
|
+
if (!discovery.success || stripTrailingSlash(discovery.data.issuer) !== stripTrailingSlash(authority.issuer)) {
|
|
176
|
+
throw new CodexError("OIDC discovery is inconsistent with the selected authority.", "invalid_profile");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (pendingCache)
|
|
180
|
+
await writePrivateJson(cacheFile, pendingCache);
|
|
181
|
+
return {
|
|
182
|
+
sourceUrl: resolvedProfileUrl,
|
|
183
|
+
profileId: profile.data.profileId,
|
|
184
|
+
revision: profile.data.revision,
|
|
185
|
+
environment: profile.data.environment,
|
|
186
|
+
tenantId: profile.data.tenant.id,
|
|
187
|
+
tenantHeaderName: profile.data.tenant.headerName,
|
|
188
|
+
serverUrl: stripTrailingSlash(codex.baseUrl),
|
|
189
|
+
resource: stripTrailingSlash(codex.resource),
|
|
190
|
+
audience: codex.audience,
|
|
191
|
+
roleClientId: codex.roleClientId,
|
|
192
|
+
authority: {
|
|
193
|
+
issuer: stripTrailingSlash(authority.issuer),
|
|
194
|
+
discoveryUrl: authority.discoveryUrl,
|
|
195
|
+
clientId: authority.clientId,
|
|
196
|
+
scope: authority.scopes.join(" ")
|
|
197
|
+
},
|
|
198
|
+
stale
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function defaultProfileDirectory() {
|
|
202
|
+
const configured = process.env.TOKENSRC_CODEX_CONFIG_DIR?.trim();
|
|
203
|
+
if (configured)
|
|
204
|
+
return configured;
|
|
205
|
+
if (process.platform === "win32") {
|
|
206
|
+
return join(process.env.APPDATA ?? join(homedir(), "AppData", "Roaming"), "tokensrc-codex");
|
|
207
|
+
}
|
|
208
|
+
return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"), "tokensrc-codex");
|
|
209
|
+
}
|
|
210
|
+
async function fetchJson(fetchImpl, url) {
|
|
211
|
+
validateRemoteUrl(url);
|
|
212
|
+
const response = await fetchImpl(url, {
|
|
213
|
+
headers: { Accept: "application/json" }, signal: AbortSignal.timeout(5_000)
|
|
214
|
+
});
|
|
215
|
+
if (!response.ok)
|
|
216
|
+
throw new CodexError(`Profile discovery failed with HTTP ${response.status}.`, "profile_unavailable");
|
|
217
|
+
return response.json();
|
|
218
|
+
}
|
|
219
|
+
async function readProfileCache(path, sourceUrl) {
|
|
220
|
+
const raw = await readJsonIfExists(path);
|
|
221
|
+
if (!raw || typeof raw !== "object")
|
|
222
|
+
return undefined;
|
|
223
|
+
const value = raw;
|
|
224
|
+
return value.schemaVersion === 1 && value.sourceUrl === sourceUrl
|
|
225
|
+
&& typeof value.fetchedAt === "number" && "profile" in value
|
|
226
|
+
? value
|
|
227
|
+
: undefined;
|
|
228
|
+
}
|
|
229
|
+
function serviceOrigin(value) {
|
|
230
|
+
validateRemoteUrl(value);
|
|
231
|
+
return new URL(value).origin;
|
|
232
|
+
}
|
|
233
|
+
function validateRemoteUrl(value) {
|
|
234
|
+
const url = new URL(value);
|
|
235
|
+
const loopback = ["localhost", "127.0.0.1", "::1", "[::1]"].includes(url.hostname);
|
|
236
|
+
if (url.username || url.password || (url.protocol !== "https:" && !(url.protocol === "http:" && loopback))) {
|
|
237
|
+
throw new CodexError("Profile URLs must use HTTPS without embedded credentials.", "invalid_profile");
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function stripTrailingSlash(value) {
|
|
241
|
+
return value.replace(/\/+$/u, "");
|
|
242
|
+
}
|
|
243
|
+
function compareVersions(left, right) {
|
|
244
|
+
const parts = (value) => value.split(".").slice(0, 3).map((item) => Number.parseInt(item, 10) || 0);
|
|
245
|
+
const a = parts(left);
|
|
246
|
+
const b = parts(right);
|
|
247
|
+
for (let index = 0; index < 3; index++) {
|
|
248
|
+
if (a[index] !== b[index])
|
|
249
|
+
return a[index] - b[index];
|
|
250
|
+
}
|
|
251
|
+
return 0;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
|