opencode-openai-codex-multi-auth 4.4.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.
- package/LICENSE +37 -0
- package/README.md +89 -0
- package/assets/openai-codex-auth-config.schema.json +63 -0
- package/assets/opencode-logo-ornate-dark.svg +18 -0
- package/assets/readme-hero.svg +31 -0
- package/config/README.md +103 -0
- package/config/minimal-opencode.json +12 -0
- package/config/opencode-legacy.json +571 -0
- package/config/opencode-modern.json +239 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +564 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/accounts.d.ts +58 -0
- package/dist/lib/accounts.d.ts.map +1 -0
- package/dist/lib/accounts.js +405 -0
- package/dist/lib/accounts.js.map +1 -0
- package/dist/lib/auth/auth.d.ts +43 -0
- package/dist/lib/auth/auth.d.ts.map +1 -0
- package/dist/lib/auth/auth.js +163 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/browser.d.ts +17 -0
- package/dist/lib/auth/browser.d.ts.map +1 -0
- package/dist/lib/auth/browser.js +76 -0
- package/dist/lib/auth/browser.js.map +1 -0
- package/dist/lib/auth/server.d.ts +10 -0
- package/dist/lib/auth/server.d.ts.map +1 -0
- package/dist/lib/auth/server.js +78 -0
- package/dist/lib/auth/server.js.map +1 -0
- package/dist/lib/cli.d.ts +8 -0
- package/dist/lib/cli.d.ts.map +1 -0
- package/dist/lib/cli.js +36 -0
- package/dist/lib/cli.js.map +1 -0
- package/dist/lib/config.d.ts +25 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +112 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +67 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +67 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/logger.d.ts +21 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +77 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/oauth-success.html +712 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.js +152 -0
- package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
- package/dist/lib/prompts/codex.d.ts +28 -0
- package/dist/lib/prompts/codex.d.ts.map +1 -0
- package/dist/lib/prompts/codex.js +248 -0
- package/dist/lib/prompts/codex.js.map +1 -0
- package/dist/lib/prompts/opencode-codex.d.ts +21 -0
- package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
- package/dist/lib/prompts/opencode-codex.js +91 -0
- package/dist/lib/prompts/opencode-codex.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +73 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
- package/dist/lib/request/fetch-helpers.js +221 -0
- package/dist/lib/request/fetch-helpers.js.map +1 -0
- package/dist/lib/request/helpers/input-utils.d.ts +6 -0
- package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/input-utils.js +174 -0
- package/dist/lib/request/helpers/input-utils.js.map +1 -0
- package/dist/lib/request/helpers/model-map.d.ts +28 -0
- package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
- package/dist/lib/request/helpers/model-map.js +109 -0
- package/dist/lib/request/helpers/model-map.js.map +1 -0
- package/dist/lib/request/request-transformer.d.ts +93 -0
- package/dist/lib/request/request-transformer.d.ts.map +1 -0
- package/dist/lib/request/request-transformer.js +403 -0
- package/dist/lib/request/request-transformer.js.map +1 -0
- package/dist/lib/request/response-handler.d.ts +14 -0
- package/dist/lib/request/response-handler.d.ts.map +1 -0
- package/dist/lib/request/response-handler.js +88 -0
- package/dist/lib/request/response-handler.js.map +1 -0
- package/dist/lib/storage.d.ts +5 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +46 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/lib/types.d.ts +236 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/package.json +77 -0
- package/scripts/install-opencode-codex-auth.js +450 -0
- package/scripts/test-all-models.sh +259 -0
- package/scripts/validate-model-map.sh +97 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { generatePKCE } from "@openauthjs/openauth/pkce";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
// OAuth constants (from openai/codex)
|
|
4
|
+
export const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
5
|
+
export const AUTHORIZE_URL = "https://auth.openai.com/oauth/authorize";
|
|
6
|
+
export const TOKEN_URL = "https://auth.openai.com/oauth/token";
|
|
7
|
+
export const REDIRECT_URI = "http://localhost:1455/auth/callback";
|
|
8
|
+
export const SCOPE = "openid profile email offline_access";
|
|
9
|
+
/**
|
|
10
|
+
* Generate a random state value for OAuth flow
|
|
11
|
+
* @returns Random hex string
|
|
12
|
+
*/
|
|
13
|
+
export function createState() {
|
|
14
|
+
return randomBytes(16).toString("hex");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parse authorization code and state from user input
|
|
18
|
+
* @param input - User input (URL, code#state, or just code)
|
|
19
|
+
* @returns Parsed authorization data
|
|
20
|
+
*/
|
|
21
|
+
export function parseAuthorizationInput(input) {
|
|
22
|
+
const value = (input || "").trim();
|
|
23
|
+
if (!value)
|
|
24
|
+
return {};
|
|
25
|
+
try {
|
|
26
|
+
const url = new URL(value);
|
|
27
|
+
return {
|
|
28
|
+
code: url.searchParams.get("code") ?? undefined,
|
|
29
|
+
state: url.searchParams.get("state") ?? undefined,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch { }
|
|
33
|
+
if (value.includes("#")) {
|
|
34
|
+
const [code, state] = value.split("#", 2);
|
|
35
|
+
return { code, state };
|
|
36
|
+
}
|
|
37
|
+
if (value.includes("code=")) {
|
|
38
|
+
const params = new URLSearchParams(value);
|
|
39
|
+
return {
|
|
40
|
+
code: params.get("code") ?? undefined,
|
|
41
|
+
state: params.get("state") ?? undefined,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return { code: value };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Exchange authorization code for access and refresh tokens
|
|
48
|
+
* @param code - Authorization code from OAuth flow
|
|
49
|
+
* @param verifier - PKCE verifier
|
|
50
|
+
* @param redirectUri - OAuth redirect URI
|
|
51
|
+
* @returns Token result
|
|
52
|
+
*/
|
|
53
|
+
export async function exchangeAuthorizationCode(code, verifier, redirectUri = REDIRECT_URI) {
|
|
54
|
+
const res = await fetch(TOKEN_URL, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
57
|
+
body: new URLSearchParams({
|
|
58
|
+
grant_type: "authorization_code",
|
|
59
|
+
client_id: CLIENT_ID,
|
|
60
|
+
code,
|
|
61
|
+
code_verifier: verifier,
|
|
62
|
+
redirect_uri: redirectUri,
|
|
63
|
+
}),
|
|
64
|
+
});
|
|
65
|
+
if (!res.ok) {
|
|
66
|
+
const text = await res.text().catch(() => "");
|
|
67
|
+
console.error("[openai-codex-plugin] code->token failed:", res.status, text);
|
|
68
|
+
return { type: "failed" };
|
|
69
|
+
}
|
|
70
|
+
const json = (await res.json());
|
|
71
|
+
if (!json?.access_token ||
|
|
72
|
+
!json?.refresh_token ||
|
|
73
|
+
typeof json?.expires_in !== "number") {
|
|
74
|
+
console.error("[openai-codex-plugin] token response missing fields:", json);
|
|
75
|
+
return { type: "failed" };
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
type: "success",
|
|
79
|
+
access: json.access_token,
|
|
80
|
+
refresh: json.refresh_token,
|
|
81
|
+
expires: Date.now() + json.expires_in * 1000,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Decode a JWT token to extract payload
|
|
86
|
+
* @param token - JWT token to decode
|
|
87
|
+
* @returns Decoded payload or null if invalid
|
|
88
|
+
*/
|
|
89
|
+
export function decodeJWT(token) {
|
|
90
|
+
try {
|
|
91
|
+
const parts = token.split(".");
|
|
92
|
+
if (parts.length !== 3)
|
|
93
|
+
return null;
|
|
94
|
+
const payload = parts[1];
|
|
95
|
+
const decoded = Buffer.from(payload, "base64").toString("utf-8");
|
|
96
|
+
return JSON.parse(decoded);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Refresh access token using refresh token
|
|
104
|
+
* @param refreshToken - Refresh token
|
|
105
|
+
* @returns Token result
|
|
106
|
+
*/
|
|
107
|
+
export async function refreshAccessToken(refreshToken) {
|
|
108
|
+
try {
|
|
109
|
+
const response = await fetch(TOKEN_URL, {
|
|
110
|
+
method: "POST",
|
|
111
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
112
|
+
body: new URLSearchParams({
|
|
113
|
+
grant_type: "refresh_token",
|
|
114
|
+
refresh_token: refreshToken,
|
|
115
|
+
client_id: CLIENT_ID,
|
|
116
|
+
}),
|
|
117
|
+
});
|
|
118
|
+
if (!response.ok) {
|
|
119
|
+
const text = await response.text().catch(() => "");
|
|
120
|
+
console.error("[openai-codex-plugin] Token refresh failed:", response.status, text);
|
|
121
|
+
return { type: "failed" };
|
|
122
|
+
}
|
|
123
|
+
const json = (await response.json());
|
|
124
|
+
if (!json?.access_token ||
|
|
125
|
+
!json?.refresh_token ||
|
|
126
|
+
typeof json?.expires_in !== "number") {
|
|
127
|
+
console.error("[openai-codex-plugin] Token refresh response missing fields:", json);
|
|
128
|
+
return { type: "failed" };
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
type: "success",
|
|
132
|
+
access: json.access_token,
|
|
133
|
+
refresh: json.refresh_token,
|
|
134
|
+
expires: Date.now() + json.expires_in * 1000,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
const err = error;
|
|
139
|
+
console.error("[openai-codex-plugin] Token refresh error:", err);
|
|
140
|
+
return { type: "failed" };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Create OAuth authorization flow
|
|
145
|
+
* @returns Authorization flow details
|
|
146
|
+
*/
|
|
147
|
+
export async function createAuthorizationFlow() {
|
|
148
|
+
const pkce = (await generatePKCE());
|
|
149
|
+
const state = createState();
|
|
150
|
+
const url = new URL(AUTHORIZE_URL);
|
|
151
|
+
url.searchParams.set("response_type", "code");
|
|
152
|
+
url.searchParams.set("client_id", CLIENT_ID);
|
|
153
|
+
url.searchParams.set("redirect_uri", REDIRECT_URI);
|
|
154
|
+
url.searchParams.set("scope", SCOPE);
|
|
155
|
+
url.searchParams.set("code_challenge", pkce.challenge);
|
|
156
|
+
url.searchParams.set("code_challenge_method", "S256");
|
|
157
|
+
url.searchParams.set("state", state);
|
|
158
|
+
url.searchParams.set("id_token_add_organizations", "true");
|
|
159
|
+
url.searchParams.set("codex_cli_simplified_flow", "true");
|
|
160
|
+
url.searchParams.set("originator", "codex_cli_rs");
|
|
161
|
+
return { pkce, state, url: url.toString() };
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../lib/auth/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser utilities for OAuth flow
|
|
3
|
+
* Handles platform-specific browser opening
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Gets the platform-specific command to open a URL in the default browser
|
|
7
|
+
* @returns Browser opener command for the current platform
|
|
8
|
+
*/
|
|
9
|
+
export declare function getBrowserOpener(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Opens a URL in the default browser
|
|
12
|
+
* Silently fails if browser cannot be opened (user can copy URL manually)
|
|
13
|
+
* @param url - URL to open
|
|
14
|
+
* @returns True if a browser launch was attempted
|
|
15
|
+
*/
|
|
16
|
+
export declare function openBrowserUrl(url: string): boolean;
|
|
17
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../lib/auth/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAKzC;AAkCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBnD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser utilities for OAuth flow
|
|
3
|
+
* Handles platform-specific browser opening
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { PLATFORM_OPENERS } from "../constants.js";
|
|
9
|
+
/**
|
|
10
|
+
* Gets the platform-specific command to open a URL in the default browser
|
|
11
|
+
* @returns Browser opener command for the current platform
|
|
12
|
+
*/
|
|
13
|
+
export function getBrowserOpener() {
|
|
14
|
+
const platform = process.platform;
|
|
15
|
+
if (platform === "darwin")
|
|
16
|
+
return PLATFORM_OPENERS.darwin;
|
|
17
|
+
if (platform === "win32")
|
|
18
|
+
return PLATFORM_OPENERS.win32;
|
|
19
|
+
return PLATFORM_OPENERS.linux;
|
|
20
|
+
}
|
|
21
|
+
function commandExists(command) {
|
|
22
|
+
if (!command)
|
|
23
|
+
return false;
|
|
24
|
+
// "start" is a shell builtin on Windows; rely on shell execution
|
|
25
|
+
if (process.platform === "win32" && command.toLowerCase() === "start") {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
const pathValue = process.env.PATH || "";
|
|
29
|
+
const entries = pathValue.split(path.delimiter).filter(Boolean);
|
|
30
|
+
if (entries.length === 0)
|
|
31
|
+
return false;
|
|
32
|
+
if (process.platform === "win32") {
|
|
33
|
+
const pathext = (process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM")
|
|
34
|
+
.split(";")
|
|
35
|
+
.filter(Boolean);
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
for (const ext of pathext) {
|
|
38
|
+
const candidate = path.join(entry, `${command}${ext}`);
|
|
39
|
+
if (fs.existsSync(candidate))
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
const candidate = path.join(entry, command);
|
|
47
|
+
if (fs.existsSync(candidate))
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Opens a URL in the default browser
|
|
54
|
+
* Silently fails if browser cannot be opened (user can copy URL manually)
|
|
55
|
+
* @param url - URL to open
|
|
56
|
+
* @returns True if a browser launch was attempted
|
|
57
|
+
*/
|
|
58
|
+
export function openBrowserUrl(url) {
|
|
59
|
+
try {
|
|
60
|
+
const opener = getBrowserOpener();
|
|
61
|
+
if (!commandExists(opener)) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const child = spawn(opener, [url], {
|
|
65
|
+
stdio: "ignore",
|
|
66
|
+
shell: process.platform === "win32",
|
|
67
|
+
});
|
|
68
|
+
child.on("error", () => { });
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
// Silently fail - user can manually open the URL from instructions
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../lib/auth/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAC,MAAM,CAAC;IAC1D,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC;IACxD,OAAO,gBAAgB,CAAC,KAAK,CAAC;AAC/B,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACrC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,iEAAiE;IACjE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,qBAAqB,CAAC;aAC5D,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC;gBACvD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;oBAAE,OAAO,IAAI,CAAC;YAC3C,CAAC;QACF,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACzC,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE;YAClC,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACnC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,mEAAmE;QACnE,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OAuthServerInfo } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Start a small local HTTP server that waits for /auth/callback and returns the code
|
|
4
|
+
* @param options - OAuth state for validation
|
|
5
|
+
* @returns Promise that resolves to server info
|
|
6
|
+
*/
|
|
7
|
+
export declare function startLocalOAuthServer({ state }: {
|
|
8
|
+
state: string;
|
|
9
|
+
}): Promise<OAuthServerInfo>;
|
|
10
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../lib/auth/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAkE5F"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
// Resolve path to oauth-success.html (one level up from auth/ subfolder)
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const successHtml = fs.readFileSync(path.join(__dirname, "..", "oauth-success.html"), "utf-8");
|
|
8
|
+
/**
|
|
9
|
+
* Start a small local HTTP server that waits for /auth/callback and returns the code
|
|
10
|
+
* @param options - OAuth state for validation
|
|
11
|
+
* @returns Promise that resolves to server info
|
|
12
|
+
*/
|
|
13
|
+
export function startLocalOAuthServer({ state }) {
|
|
14
|
+
const server = http.createServer((req, res) => {
|
|
15
|
+
try {
|
|
16
|
+
const url = new URL(req.url || "", "http://localhost");
|
|
17
|
+
if (url.pathname !== "/auth/callback") {
|
|
18
|
+
res.statusCode = 404;
|
|
19
|
+
res.end("Not found");
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (url.searchParams.get("state") !== state) {
|
|
23
|
+
res.statusCode = 400;
|
|
24
|
+
res.end("State mismatch");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const code = url.searchParams.get("code");
|
|
28
|
+
if (!code) {
|
|
29
|
+
res.statusCode = 400;
|
|
30
|
+
res.end("Missing authorization code");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
res.statusCode = 200;
|
|
34
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
35
|
+
res.end(successHtml);
|
|
36
|
+
server._lastCode = code;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
res.statusCode = 500;
|
|
40
|
+
res.end("Internal error");
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
server
|
|
45
|
+
.listen(1455, "127.0.0.1", () => {
|
|
46
|
+
resolve({
|
|
47
|
+
port: 1455,
|
|
48
|
+
ready: true,
|
|
49
|
+
close: () => server.close(),
|
|
50
|
+
waitForCode: async () => {
|
|
51
|
+
const poll = () => new Promise((r) => setTimeout(r, 100));
|
|
52
|
+
for (let i = 0; i < 600; i++) {
|
|
53
|
+
const lastCode = server._lastCode;
|
|
54
|
+
if (lastCode)
|
|
55
|
+
return { code: lastCode };
|
|
56
|
+
await poll();
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
})
|
|
62
|
+
.on("error", (err) => {
|
|
63
|
+
console.error("[openai-codex-plugin] Failed to bind http://127.0.0.1:1455 (", err?.code, ") Falling back to manual paste.");
|
|
64
|
+
resolve({
|
|
65
|
+
port: 1455,
|
|
66
|
+
ready: false,
|
|
67
|
+
close: () => {
|
|
68
|
+
try {
|
|
69
|
+
server.close();
|
|
70
|
+
}
|
|
71
|
+
catch { }
|
|
72
|
+
},
|
|
73
|
+
waitForCode: async () => null,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../lib/auth/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ExistingAccountLabel {
|
|
2
|
+
index: number;
|
|
3
|
+
email?: string;
|
|
4
|
+
accountId?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function promptLoginMode(existing: ExistingAccountLabel[]): Promise<"add" | "fresh">;
|
|
7
|
+
export declare function promptAddAnotherAccount(currentCount: number, maxAccounts: number): Promise<boolean>;
|
|
8
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../lib/cli.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,eAAe,CACpC,QAAQ,EAAE,oBAAoB,EAAE,GAC9B,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,CAoB1B;AAED,wBAAsB,uBAAuB,CAC5C,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAWlB"}
|
package/dist/lib/cli.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { stdin, stdout } from "node:process";
|
|
3
|
+
export async function promptLoginMode(existing) {
|
|
4
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
5
|
+
try {
|
|
6
|
+
const lines = [];
|
|
7
|
+
lines.push("\nExisting accounts:\n");
|
|
8
|
+
for (const account of existing) {
|
|
9
|
+
const label = account.email ??
|
|
10
|
+
(account.accountId ? `id:${account.accountId}` : "(unknown)");
|
|
11
|
+
lines.push(` ${account.index + 1}. ${label}`);
|
|
12
|
+
}
|
|
13
|
+
lines.push("");
|
|
14
|
+
lines.push("(a)dd new account(s) or (f)resh start? [a/f]: ");
|
|
15
|
+
const answer = (await rl.question(lines.join("\n"))).trim().toLowerCase();
|
|
16
|
+
if (answer.startsWith("f"))
|
|
17
|
+
return "fresh";
|
|
18
|
+
return "add";
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
rl.close();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function promptAddAnotherAccount(currentCount, maxAccounts) {
|
|
25
|
+
if (currentCount >= maxAccounts)
|
|
26
|
+
return false;
|
|
27
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
28
|
+
try {
|
|
29
|
+
const answer = await rl.question(`\nYou have ${currentCount} account(s). Add another? [y/N]: `);
|
|
30
|
+
return answer.trim().toLowerCase().startsWith("y");
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
rl.close();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../lib/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQ7C,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,QAAgC;IAEhC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACJ,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,KAAK,GACV,OAAO,CAAC,KAAK;gBACb,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1E,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;QAC3C,OAAO,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACV,EAAE,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,YAAoB,EACpB,WAAmB;IAEnB,IAAI,YAAY,IAAI,WAAW;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC/B,cAAc,YAAY,mCAAmC,CAC7D,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;YAAS,CAAC;QACV,EAAE,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { PluginConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Load plugin configuration from ~/.opencode/openai-codex-auth-config.json
|
|
4
|
+
* Falls back to defaults if file doesn't exist or is invalid
|
|
5
|
+
*
|
|
6
|
+
* @returns Plugin configuration
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadPluginConfig(): PluginConfig;
|
|
9
|
+
/**
|
|
10
|
+
* Get the effective CODEX_MODE setting
|
|
11
|
+
* Priority: environment variable > config file > default (true)
|
|
12
|
+
*
|
|
13
|
+
* @param pluginConfig - Plugin configuration from file
|
|
14
|
+
* @returns True if CODEX_MODE should be enabled
|
|
15
|
+
*/
|
|
16
|
+
export declare function getCodexMode(pluginConfig: PluginConfig): boolean;
|
|
17
|
+
export declare function getAccountSelectionStrategy(pluginConfig: PluginConfig): "sticky" | "round-robin";
|
|
18
|
+
export declare function getPidOffsetEnabled(pluginConfig: PluginConfig): boolean;
|
|
19
|
+
export declare function getQuietMode(pluginConfig: PluginConfig): boolean;
|
|
20
|
+
export declare function getTokenRefreshSkewMs(pluginConfig: PluginConfig): number;
|
|
21
|
+
export declare function getRateLimitToastDebounceMs(pluginConfig: PluginConfig): number;
|
|
22
|
+
export declare function getRetryAllAccountsRateLimited(pluginConfig: PluginConfig): boolean;
|
|
23
|
+
export declare function getRetryAllAccountsMaxWaitMs(pluginConfig: PluginConfig): number;
|
|
24
|
+
export declare function getRetryAllAccountsMaxRetries(pluginConfig: PluginConfig): number;
|
|
25
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAoB/C;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAqB/C;AAuCD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAEhE;AAED,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,YAAY,GACnE,QAAQ,GACR,aAAa,CAIf;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAMvE;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAEhE;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,CAOxE;AAED,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,CAO9E;AAED,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAMlF;AAED,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,CAO/E;AAED,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,CAOhF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
const CONFIG_PATH = join(homedir(), ".opencode", "openai-codex-auth-config.json");
|
|
5
|
+
/**
|
|
6
|
+
* Default plugin configuration
|
|
7
|
+
* CODEX_MODE is enabled by default for better Codex CLI parity
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
codexMode: true,
|
|
11
|
+
accountSelectionStrategy: "sticky",
|
|
12
|
+
pidOffsetEnabled: true,
|
|
13
|
+
quietMode: false,
|
|
14
|
+
retryAllAccountsRateLimited: false,
|
|
15
|
+
retryAllAccountsMaxWaitMs: 30_000,
|
|
16
|
+
retryAllAccountsMaxRetries: 1,
|
|
17
|
+
tokenRefreshSkewMs: 60_000,
|
|
18
|
+
rateLimitToastDebounceMs: 60_000,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Load plugin configuration from ~/.opencode/openai-codex-auth-config.json
|
|
22
|
+
* Falls back to defaults if file doesn't exist or is invalid
|
|
23
|
+
*
|
|
24
|
+
* @returns Plugin configuration
|
|
25
|
+
*/
|
|
26
|
+
export function loadPluginConfig() {
|
|
27
|
+
try {
|
|
28
|
+
if (!existsSync(CONFIG_PATH)) {
|
|
29
|
+
return DEFAULT_CONFIG;
|
|
30
|
+
}
|
|
31
|
+
const fileContent = readFileSync(CONFIG_PATH, "utf-8");
|
|
32
|
+
const userConfig = JSON.parse(fileContent);
|
|
33
|
+
// Merge with defaults
|
|
34
|
+
return {
|
|
35
|
+
...DEFAULT_CONFIG,
|
|
36
|
+
...userConfig,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.warn(`[openai-codex-plugin] Failed to load config from ${CONFIG_PATH}:`, error.message);
|
|
41
|
+
return DEFAULT_CONFIG;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function parseBooleanEnv(value) {
|
|
45
|
+
if (value === undefined)
|
|
46
|
+
return undefined;
|
|
47
|
+
if (value === "1" || value === "true")
|
|
48
|
+
return true;
|
|
49
|
+
if (value === "0" || value === "false")
|
|
50
|
+
return false;
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
function parseNumberEnv(value) {
|
|
54
|
+
if (value === undefined)
|
|
55
|
+
return undefined;
|
|
56
|
+
const parsed = Number(value);
|
|
57
|
+
if (!Number.isFinite(parsed))
|
|
58
|
+
return undefined;
|
|
59
|
+
return parsed;
|
|
60
|
+
}
|
|
61
|
+
function resolveBooleanSetting(envName, configValue, defaultValue) {
|
|
62
|
+
const envValue = parseBooleanEnv(process.env[envName]);
|
|
63
|
+
if (envValue !== undefined)
|
|
64
|
+
return envValue;
|
|
65
|
+
return configValue ?? defaultValue;
|
|
66
|
+
}
|
|
67
|
+
function resolveNumberSetting(envName, configValue, defaultValue, options) {
|
|
68
|
+
const envValue = parseNumberEnv(process.env[envName]);
|
|
69
|
+
const candidate = envValue ?? configValue ?? defaultValue;
|
|
70
|
+
const min = options?.min;
|
|
71
|
+
if (min !== undefined)
|
|
72
|
+
return Math.max(min, candidate);
|
|
73
|
+
return candidate;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get the effective CODEX_MODE setting
|
|
77
|
+
* Priority: environment variable > config file > default (true)
|
|
78
|
+
*
|
|
79
|
+
* @param pluginConfig - Plugin configuration from file
|
|
80
|
+
* @returns True if CODEX_MODE should be enabled
|
|
81
|
+
*/
|
|
82
|
+
export function getCodexMode(pluginConfig) {
|
|
83
|
+
return resolveBooleanSetting("CODEX_MODE", pluginConfig.codexMode, true);
|
|
84
|
+
}
|
|
85
|
+
export function getAccountSelectionStrategy(pluginConfig) {
|
|
86
|
+
const env = process.env.CODEX_AUTH_ACCOUNT_SELECTION_STRATEGY;
|
|
87
|
+
if (env === "sticky" || env === "round-robin")
|
|
88
|
+
return env;
|
|
89
|
+
return pluginConfig.accountSelectionStrategy ?? "sticky";
|
|
90
|
+
}
|
|
91
|
+
export function getPidOffsetEnabled(pluginConfig) {
|
|
92
|
+
return resolveBooleanSetting("CODEX_AUTH_PID_OFFSET_ENABLED", pluginConfig.pidOffsetEnabled, true);
|
|
93
|
+
}
|
|
94
|
+
export function getQuietMode(pluginConfig) {
|
|
95
|
+
return resolveBooleanSetting("CODEX_AUTH_QUIET", pluginConfig.quietMode, false);
|
|
96
|
+
}
|
|
97
|
+
export function getTokenRefreshSkewMs(pluginConfig) {
|
|
98
|
+
return resolveNumberSetting("CODEX_AUTH_TOKEN_REFRESH_SKEW_MS", pluginConfig.tokenRefreshSkewMs, 60_000, { min: 0 });
|
|
99
|
+
}
|
|
100
|
+
export function getRateLimitToastDebounceMs(pluginConfig) {
|
|
101
|
+
return resolveNumberSetting("CODEX_AUTH_RATE_LIMIT_TOAST_DEBOUNCE_MS", pluginConfig.rateLimitToastDebounceMs, 60_000, { min: 0 });
|
|
102
|
+
}
|
|
103
|
+
export function getRetryAllAccountsRateLimited(pluginConfig) {
|
|
104
|
+
return resolveBooleanSetting("CODEX_AUTH_RETRY_ALL_RATE_LIMITED", pluginConfig.retryAllAccountsRateLimited, false);
|
|
105
|
+
}
|
|
106
|
+
export function getRetryAllAccountsMaxWaitMs(pluginConfig) {
|
|
107
|
+
return resolveNumberSetting("CODEX_AUTH_RETRY_ALL_MAX_WAIT_MS", pluginConfig.retryAllAccountsMaxWaitMs, 30_000, { min: 0 });
|
|
108
|
+
}
|
|
109
|
+
export function getRetryAllAccountsMaxRetries(pluginConfig) {
|
|
110
|
+
return resolveNumberSetting("CODEX_AUTH_RETRY_ALL_MAX_RETRIES", pluginConfig.retryAllAccountsMaxRetries, 1, { min: 0 });
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constants used throughout the plugin
|
|
3
|
+
* Centralized for easy maintenance and configuration
|
|
4
|
+
*/
|
|
5
|
+
/** Plugin identifier for logging and error messages */
|
|
6
|
+
export declare const PLUGIN_NAME = "openai-codex-plugin";
|
|
7
|
+
/** Base URL for ChatGPT backend API */
|
|
8
|
+
export declare const CODEX_BASE_URL = "https://chatgpt.com/backend-api";
|
|
9
|
+
/** Dummy API key used for OpenAI SDK (actual auth via OAuth) */
|
|
10
|
+
export declare const DUMMY_API_KEY = "chatgpt-oauth";
|
|
11
|
+
/** Provider ID for opencode configuration */
|
|
12
|
+
export declare const PROVIDER_ID = "openai";
|
|
13
|
+
/** HTTP Status Codes */
|
|
14
|
+
export declare const HTTP_STATUS: {
|
|
15
|
+
readonly OK: 200;
|
|
16
|
+
readonly UNAUTHORIZED: 401;
|
|
17
|
+
readonly NOT_FOUND: 404;
|
|
18
|
+
readonly TOO_MANY_REQUESTS: 429;
|
|
19
|
+
};
|
|
20
|
+
/** OpenAI-specific headers */
|
|
21
|
+
export declare const OPENAI_HEADERS: {
|
|
22
|
+
readonly BETA: "OpenAI-Beta";
|
|
23
|
+
readonly ACCOUNT_ID: "chatgpt-account-id";
|
|
24
|
+
readonly ORIGINATOR: "originator";
|
|
25
|
+
readonly SESSION_ID: "session_id";
|
|
26
|
+
readonly CONVERSATION_ID: "conversation_id";
|
|
27
|
+
};
|
|
28
|
+
/** OpenAI-specific header values */
|
|
29
|
+
export declare const OPENAI_HEADER_VALUES: {
|
|
30
|
+
readonly BETA_RESPONSES: "responses=experimental";
|
|
31
|
+
readonly ORIGINATOR_CODEX: "codex_cli_rs";
|
|
32
|
+
};
|
|
33
|
+
/** URL path segments */
|
|
34
|
+
export declare const URL_PATHS: {
|
|
35
|
+
readonly RESPONSES: "/responses";
|
|
36
|
+
readonly CODEX_RESPONSES: "/codex/responses";
|
|
37
|
+
};
|
|
38
|
+
/** JWT claim path for ChatGPT account ID */
|
|
39
|
+
export declare const JWT_CLAIM_PATH: "https://api.openai.com/auth";
|
|
40
|
+
/** Error messages */
|
|
41
|
+
export declare const ERROR_MESSAGES: {
|
|
42
|
+
readonly NO_ACCOUNT_ID: "Failed to extract accountId from token";
|
|
43
|
+
readonly TOKEN_REFRESH_FAILED: "Failed to refresh token, authentication required";
|
|
44
|
+
readonly REQUEST_PARSE_ERROR: "Error parsing request";
|
|
45
|
+
};
|
|
46
|
+
/** Log stages for request logging */
|
|
47
|
+
export declare const LOG_STAGES: {
|
|
48
|
+
readonly BEFORE_TRANSFORM: "before-transform";
|
|
49
|
+
readonly AFTER_TRANSFORM: "after-transform";
|
|
50
|
+
readonly RESPONSE: "response";
|
|
51
|
+
readonly ERROR_RESPONSE: "error-response";
|
|
52
|
+
};
|
|
53
|
+
/** Platform-specific browser opener commands */
|
|
54
|
+
export declare const PLATFORM_OPENERS: {
|
|
55
|
+
readonly darwin: "open";
|
|
56
|
+
readonly win32: "start";
|
|
57
|
+
readonly linux: "xdg-open";
|
|
58
|
+
};
|
|
59
|
+
/** OAuth authorization labels */
|
|
60
|
+
export declare const AUTH_LABELS: {
|
|
61
|
+
readonly OAUTH: "ChatGPT Plus/Pro (Codex Subscription)";
|
|
62
|
+
readonly OAUTH_MANUAL: "ChatGPT Plus/Pro (Manual URL Paste)";
|
|
63
|
+
readonly API_KEY: "Manually enter API Key";
|
|
64
|
+
readonly INSTRUCTIONS: "A browser window should open. If it doesn't, copy the URL and open it manually.";
|
|
65
|
+
readonly INSTRUCTIONS_MANUAL: "After logging in, copy the full redirect URL and paste it here.";
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../lib/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uDAAuD;AACvD,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAEjD,uCAAuC;AACvC,eAAO,MAAM,cAAc,oCAAoC,CAAC;AAEhE,gEAAgE;AAChE,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,6CAA6C;AAC7C,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC,wBAAwB;AACxB,eAAO,MAAM,WAAW;;;;;CAKd,CAAC;AAEX,8BAA8B;AAC9B,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAEX,oCAAoC;AACpC,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AAEX,wBAAwB;AACxB,eAAO,MAAM,SAAS;;;CAGZ,CAAC;AAEX,4CAA4C;AAC5C,eAAO,MAAM,cAAc,EAAG,6BAAsC,CAAC;AAErE,qBAAqB;AACrB,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX,qCAAqC;AACrC,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX,gDAAgD;AAChD,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,iCAAiC;AACjC,eAAO,MAAM,WAAW;;;;;;CAQd,CAAC"}
|