better-opencode-openai-codex-auth 0.1.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 +99 -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 +334 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/account-pool.d.ts +17 -0
- package/dist/lib/account-pool.d.ts.map +1 -0
- package/dist/lib/account-pool.js +243 -0
- package/dist/lib/account-pool.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 +162 -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/config.d.ts +17 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +53 -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 +27 -0
- package/dist/lib/prompts/codex.d.ts.map +1 -0
- package/dist/lib/prompts/codex.js +252 -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 +126 -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 +418 -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 +150 -0
- package/dist/lib/request/response-handler.js.map +1 -0
- package/dist/lib/types.d.ts +183 -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 +74 -0
- package/scripts/install-opencode-codex-auth.js +433 -0
- package/scripts/test-all-models.sh +259 -0
- package/scripts/validate-model-map.sh +97 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { logRequest, LOGGING_ENABLED } from "../logger.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parse SSE stream to extract final response
|
|
4
|
+
* @param sseText - Complete SSE stream text
|
|
5
|
+
* @returns Final response object, last response-like, or last event
|
|
6
|
+
*/
|
|
7
|
+
function parseSseStream(sseText) {
|
|
8
|
+
const lines = sseText.split(/\r?\n/);
|
|
9
|
+
let pendingData = [];
|
|
10
|
+
let lastEvent;
|
|
11
|
+
let lastResponseLike;
|
|
12
|
+
let finalResponse;
|
|
13
|
+
/**
|
|
14
|
+
* Process a parsed event, updating tracking variables
|
|
15
|
+
*/
|
|
16
|
+
const processEvent = (parsed) => {
|
|
17
|
+
lastEvent = parsed;
|
|
18
|
+
const parsedAny = parsed;
|
|
19
|
+
if (parsedAny &&
|
|
20
|
+
typeof parsedAny === "object" &&
|
|
21
|
+
"response" in parsedAny) {
|
|
22
|
+
if (parsedAny.response !== undefined) {
|
|
23
|
+
lastResponseLike = parsedAny.response;
|
|
24
|
+
}
|
|
25
|
+
if (parsedAny.type === "response.done" ||
|
|
26
|
+
parsedAny.type === "response.completed") {
|
|
27
|
+
finalResponse = parsedAny.response;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Try to parse accumulated data. Returns true if successful.
|
|
33
|
+
*/
|
|
34
|
+
const tryFlush = () => {
|
|
35
|
+
if (pendingData.length === 0)
|
|
36
|
+
return false;
|
|
37
|
+
const data = pendingData.join("\n");
|
|
38
|
+
try {
|
|
39
|
+
const parsed = JSON.parse(data);
|
|
40
|
+
pendingData = [];
|
|
41
|
+
processEvent(parsed);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
for (const line of lines) {
|
|
49
|
+
// Empty line = SSE event delimiter, flush any pending data
|
|
50
|
+
if (line === "") {
|
|
51
|
+
tryFlush();
|
|
52
|
+
pendingData = []; // Clear any unparseable garbage
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Accept "data:" with or without a space after colon
|
|
56
|
+
if (line.startsWith("data:")) {
|
|
57
|
+
const content = line.replace(/^data:\s?/, "");
|
|
58
|
+
pendingData.push(content);
|
|
59
|
+
// Optimistic parse: try to parse immediately (common case: each line is complete JSON)
|
|
60
|
+
if (!tryFlush()) {
|
|
61
|
+
// If combined parse failed, try parsing just this line alone
|
|
62
|
+
// This handles the case where previous lines were garbage
|
|
63
|
+
try {
|
|
64
|
+
const parsed = JSON.parse(content);
|
|
65
|
+
pendingData = []; // Discard accumulated garbage
|
|
66
|
+
processEvent(parsed);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Keep accumulating - might be multiline JSON
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Final flush for any remaining data
|
|
76
|
+
tryFlush();
|
|
77
|
+
return { finalResponse, lastEvent, lastResponseLike };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Convert SSE stream response to JSON for generateText()
|
|
81
|
+
* @param response - Fetch response with SSE stream
|
|
82
|
+
* @param headers - Response headers
|
|
83
|
+
* @returns Response with JSON body
|
|
84
|
+
*/
|
|
85
|
+
export async function convertSseToJson(response, headers) {
|
|
86
|
+
if (!response.body) {
|
|
87
|
+
throw new Error('[openai-codex-plugin] Response has no body');
|
|
88
|
+
}
|
|
89
|
+
const reader = response.body.getReader();
|
|
90
|
+
const decoder = new TextDecoder();
|
|
91
|
+
let fullText = '';
|
|
92
|
+
try {
|
|
93
|
+
// Consume the entire stream
|
|
94
|
+
while (true) {
|
|
95
|
+
const { done, value } = await reader.read();
|
|
96
|
+
if (done)
|
|
97
|
+
break;
|
|
98
|
+
fullText += decoder.decode(value, { stream: true });
|
|
99
|
+
}
|
|
100
|
+
if (LOGGING_ENABLED) {
|
|
101
|
+
logRequest("stream-full", { fullContent: fullText });
|
|
102
|
+
}
|
|
103
|
+
// Parse SSE events to extract the final response
|
|
104
|
+
const parsed = parseSseStream(fullText);
|
|
105
|
+
const responsePayload = parsed.finalResponse ?? parsed.lastResponseLike ?? parsed.lastEvent;
|
|
106
|
+
if (!responsePayload) {
|
|
107
|
+
console.error("[openai-codex-plugin] Could not find JSON in SSE stream");
|
|
108
|
+
logRequest("stream-error", {
|
|
109
|
+
error: "No JSON events found in SSE stream",
|
|
110
|
+
});
|
|
111
|
+
// Return original stream if we can't parse anything
|
|
112
|
+
return new Response(fullText, {
|
|
113
|
+
status: response.status,
|
|
114
|
+
statusText: response.statusText,
|
|
115
|
+
headers: headers,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// Return as plain JSON (not SSE)
|
|
119
|
+
const jsonHeaders = new Headers(headers);
|
|
120
|
+
jsonHeaders.set("content-type", "application/json; charset=utf-8");
|
|
121
|
+
if (!parsed.finalResponse) {
|
|
122
|
+
logRequest("stream-warning", {
|
|
123
|
+
warning: "No final response event; using last JSON event",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return new Response(JSON.stringify(responsePayload), {
|
|
127
|
+
status: response.status,
|
|
128
|
+
statusText: response.statusText,
|
|
129
|
+
headers: jsonHeaders,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error('[openai-codex-plugin] Error converting stream:', error);
|
|
134
|
+
logRequest("stream-error", { error: String(error) });
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Ensure response has content-type header
|
|
140
|
+
* @param headers - Response headers
|
|
141
|
+
* @returns Headers with content-type set
|
|
142
|
+
*/
|
|
143
|
+
export function ensureContentType(headers) {
|
|
144
|
+
const responseHeaders = new Headers(headers);
|
|
145
|
+
if (!responseHeaders.has('content-type')) {
|
|
146
|
+
responseHeaders.set('content-type', 'text/event-stream; charset=utf-8');
|
|
147
|
+
}
|
|
148
|
+
return responseHeaders;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=response-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-handler.js","sourceRoot":"","sources":["../../../lib/request/response-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG3D;;;;GAIG;AACH,SAAS,cAAc,CAAC,OAAe;IAKtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,WAAW,GAAa,EAAE,CAAC;IAC/B,IAAI,SAAkB,CAAC;IACvB,IAAI,gBAAyB,CAAC;IAC9B,IAAI,aAAsB,CAAC;IAE3B;;OAEG;IACH,MAAM,YAAY,GAAG,CAAC,MAAoB,EAAE,EAAE;QAC7C,SAAS,GAAG,MAAM,CAAC;QACnB,MAAM,SAAS,GAAG,MAGjB,CAAC;QACF,IACC,SAAS;YACT,OAAO,SAAS,KAAK,QAAQ;YAC7B,UAAU,IAAI,SAAS,EACtB,CAAC;YACF,IAAI,SAAS,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACtC,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAAC;YACvC,CAAC;YACD,IACC,SAAS,CAAC,IAAI,KAAK,eAAe;gBAClC,SAAS,CAAC,IAAI,KAAK,oBAAoB,EACtC,CAAC;gBACF,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC;YACpC,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,QAAQ,GAAG,GAAY,EAAE;QAC9B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;YAChD,WAAW,GAAG,EAAE,CAAC;YACjB,YAAY,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,2DAA2D;QAC3D,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YACjB,QAAQ,EAAE,CAAC;YACX,WAAW,GAAG,EAAE,CAAC,CAAC,gCAAgC;YAClD,SAAS;QACV,CAAC;QAED,qDAAqD;QACrD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC9C,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1B,uFAAuF;YACvF,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACjB,6DAA6D;gBAC7D,0DAA0D;gBAC1D,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;oBACnD,WAAW,GAAG,EAAE,CAAC,CAAC,8BAA8B;oBAChD,YAAY,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACR,8CAA8C;gBAC/C,CAAC;YACF,CAAC;YACD,SAAS;QACV,CAAC;IACF,CAAC;IAED,qCAAqC;IACrC,QAAQ,EAAE,CAAC;IAEX,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAkB,EAAE,OAAgB;IAC1E,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,IAAI,CAAC;QACJ,4BAA4B;QAC5B,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACrB,UAAU,CAAC,aAAa,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,iDAAiD;QACjD,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,eAAe,GACpB,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,SAAS,CAAC;QAErE,IAAI,CAAC,eAAe,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACzE,UAAU,CAAC,cAAc,EAAE;gBAC1B,KAAK,EAAE,oCAAoC;aAC3C,CAAC,CAAC;YAEH,oDAAoD;YACpD,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE;gBAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,OAAO;aAChB,CAAC,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC3B,UAAU,CAAC,gBAAgB,EAAE;gBAC5B,OAAO,EAAE,gDAAgD;aACzD,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE;YACpD,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,WAAW;SACpB,CAAC,CAAC;IAEJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;QACvE,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IACjD,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1C,eAAe,CAAC,GAAG,CAAC,cAAc,EAAE,kCAAkC,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,eAAe,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import type { Auth, Provider, Model } from "@opencode-ai/sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Plugin configuration from ~/.opencode/openai-codex-auth-config.json
|
|
4
|
+
*/
|
|
5
|
+
export interface PluginConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Enable CODEX_MODE (Codex-OpenCode bridge prompt instead of tool remap)
|
|
8
|
+
* @default true
|
|
9
|
+
*/
|
|
10
|
+
codexMode?: boolean;
|
|
11
|
+
accountSelectionStrategy?: "sticky" | "round-robin";
|
|
12
|
+
rateLimitCooldownMs?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface AccountPoolEntry {
|
|
15
|
+
accountId: string;
|
|
16
|
+
refresh: string;
|
|
17
|
+
access: string;
|
|
18
|
+
expires: number;
|
|
19
|
+
email?: string;
|
|
20
|
+
lastUsed?: number;
|
|
21
|
+
rateLimitedUntil?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface AccountPoolStorage {
|
|
24
|
+
version: 1;
|
|
25
|
+
activeIndex: number;
|
|
26
|
+
accounts: AccountPoolEntry[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* User configuration structure from opencode.json
|
|
30
|
+
*/
|
|
31
|
+
export interface UserConfig {
|
|
32
|
+
global: ConfigOptions;
|
|
33
|
+
models: {
|
|
34
|
+
[modelName: string]: {
|
|
35
|
+
options?: ConfigOptions;
|
|
36
|
+
variants?: Record<string, (ConfigOptions & {
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
}) | undefined>;
|
|
39
|
+
[key: string]: unknown;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Configuration options for reasoning and text settings
|
|
45
|
+
*/
|
|
46
|
+
export interface ConfigOptions {
|
|
47
|
+
reasoningEffort?: "none" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
48
|
+
reasoningSummary?: "auto" | "concise" | "detailed" | "off" | "on";
|
|
49
|
+
textVerbosity?: "low" | "medium" | "high";
|
|
50
|
+
include?: string[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Reasoning configuration for requests
|
|
54
|
+
*/
|
|
55
|
+
export interface ReasoningConfig {
|
|
56
|
+
effort: "none" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
57
|
+
summary: "auto" | "concise" | "detailed" | "off" | "on";
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* OAuth server information
|
|
61
|
+
*/
|
|
62
|
+
export interface OAuthServerInfo {
|
|
63
|
+
port: number;
|
|
64
|
+
ready: boolean;
|
|
65
|
+
close: () => void;
|
|
66
|
+
waitForCode: (state: string) => Promise<{
|
|
67
|
+
code: string;
|
|
68
|
+
} | null>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* PKCE challenge and verifier
|
|
72
|
+
*/
|
|
73
|
+
export interface PKCEPair {
|
|
74
|
+
challenge: string;
|
|
75
|
+
verifier: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Authorization flow result
|
|
79
|
+
*/
|
|
80
|
+
export interface AuthorizationFlow {
|
|
81
|
+
pkce: PKCEPair;
|
|
82
|
+
state: string;
|
|
83
|
+
url: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Token exchange success result
|
|
87
|
+
*/
|
|
88
|
+
export interface TokenSuccess {
|
|
89
|
+
type: "success";
|
|
90
|
+
access: string;
|
|
91
|
+
refresh: string;
|
|
92
|
+
expires: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Token exchange failure result
|
|
96
|
+
*/
|
|
97
|
+
export interface TokenFailure {
|
|
98
|
+
type: "failed";
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Token exchange result
|
|
102
|
+
*/
|
|
103
|
+
export type TokenResult = TokenSuccess | TokenFailure;
|
|
104
|
+
/**
|
|
105
|
+
* Parsed authorization input
|
|
106
|
+
*/
|
|
107
|
+
export interface ParsedAuthInput {
|
|
108
|
+
code?: string;
|
|
109
|
+
state?: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* JWT payload with ChatGPT account info
|
|
113
|
+
*/
|
|
114
|
+
export interface JWTPayload {
|
|
115
|
+
"https://api.openai.com/auth"?: {
|
|
116
|
+
chatgpt_account_id?: string;
|
|
117
|
+
};
|
|
118
|
+
[key: string]: unknown;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Message input item
|
|
122
|
+
*/
|
|
123
|
+
export interface InputItem {
|
|
124
|
+
id?: string;
|
|
125
|
+
type: string;
|
|
126
|
+
role: string;
|
|
127
|
+
content?: unknown;
|
|
128
|
+
[key: string]: unknown;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Request body structure
|
|
132
|
+
*/
|
|
133
|
+
export interface RequestBody {
|
|
134
|
+
model: string;
|
|
135
|
+
store?: boolean;
|
|
136
|
+
stream?: boolean;
|
|
137
|
+
instructions?: string;
|
|
138
|
+
input?: InputItem[];
|
|
139
|
+
tools?: unknown;
|
|
140
|
+
reasoning?: Partial<ReasoningConfig>;
|
|
141
|
+
text?: {
|
|
142
|
+
verbosity?: "low" | "medium" | "high";
|
|
143
|
+
};
|
|
144
|
+
include?: string[];
|
|
145
|
+
providerOptions?: {
|
|
146
|
+
openai?: Partial<ConfigOptions> & {
|
|
147
|
+
store?: boolean;
|
|
148
|
+
include?: string[];
|
|
149
|
+
};
|
|
150
|
+
[key: string]: unknown;
|
|
151
|
+
};
|
|
152
|
+
/** Stable key to enable prompt-token caching on Codex backend */
|
|
153
|
+
prompt_cache_key?: string;
|
|
154
|
+
max_output_tokens?: number;
|
|
155
|
+
max_completion_tokens?: number;
|
|
156
|
+
[key: string]: unknown;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* SSE event data structure
|
|
160
|
+
*/
|
|
161
|
+
export interface SSEEventData {
|
|
162
|
+
type: string;
|
|
163
|
+
response?: unknown;
|
|
164
|
+
[key: string]: unknown;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Cache metadata for Codex instructions
|
|
168
|
+
*/
|
|
169
|
+
export interface CacheMetadata {
|
|
170
|
+
etag: string | null;
|
|
171
|
+
tag: string;
|
|
172
|
+
lastChecked: number;
|
|
173
|
+
url: string;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* GitHub release data
|
|
177
|
+
*/
|
|
178
|
+
export interface GitHubRelease {
|
|
179
|
+
tag_name: string;
|
|
180
|
+
[key: string]: unknown;
|
|
181
|
+
}
|
|
182
|
+
export type { Auth, Provider, Model };
|
|
183
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "better-opencode-openai-codex-auth",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "OpenAI ChatGPT (Codex backend) OAuth auth plugin for opencode - use your ChatGPT Plus/Pro subscription instead of API credits",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"author": "ShivamB25",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/ShivamB25/better-opencode-openai-codex-auth.git"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"opencode",
|
|
16
|
+
"openai",
|
|
17
|
+
"codex",
|
|
18
|
+
"chatgpt",
|
|
19
|
+
"oauth",
|
|
20
|
+
"gpt-5",
|
|
21
|
+
"plugin",
|
|
22
|
+
"auth",
|
|
23
|
+
"chatgpt-plus",
|
|
24
|
+
"chatgpt-pro"
|
|
25
|
+
],
|
|
26
|
+
"homepage": "https://github.com/ShivamB25/better-opencode-openai-codex-auth#readme",
|
|
27
|
+
"bugs": {
|
|
28
|
+
"url": "https://github.com/ShivamB25/better-opencode-openai-codex-auth/issues"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc && cp lib/oauth-success.html dist/lib/",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"test:ui": "vitest --ui",
|
|
36
|
+
"test:coverage": "vitest run --coverage"
|
|
37
|
+
},
|
|
38
|
+
"bin": {
|
|
39
|
+
"better-opencode-openai-codex-auth": "./scripts/install-opencode-codex-auth.js"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist/",
|
|
43
|
+
"assets/",
|
|
44
|
+
"config/",
|
|
45
|
+
"scripts/",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE"
|
|
48
|
+
],
|
|
49
|
+
"engines": {
|
|
50
|
+
"bun": ">=1.1.0",
|
|
51
|
+
"node": ">=20.0.0"
|
|
52
|
+
},
|
|
53
|
+
"packageManager": "bun@1.2.20",
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"@opencode-ai/plugin": "^1.0.150"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@opencode-ai/plugin": "^1.0.150",
|
|
59
|
+
"@opencode-ai/sdk": "^1.0.150",
|
|
60
|
+
"@types/node": "^25.3.3",
|
|
61
|
+
"@vitest/ui": "^4.0.18",
|
|
62
|
+
"typescript": "^5.9.3",
|
|
63
|
+
"vitest": "^4.0.18"
|
|
64
|
+
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"@openauthjs/openauth": "^0.4.3",
|
|
67
|
+
"hono": "^4.12.3",
|
|
68
|
+
"jsonc-parser": "^3.3.1"
|
|
69
|
+
},
|
|
70
|
+
"overrides": {
|
|
71
|
+
"hono": "^4.12.3",
|
|
72
|
+
"vite": "^7.1.12"
|
|
73
|
+
}
|
|
74
|
+
}
|