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.
Files changed (81) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +99 -0
  3. package/assets/opencode-logo-ornate-dark.svg +18 -0
  4. package/assets/readme-hero.svg +31 -0
  5. package/config/README.md +103 -0
  6. package/config/minimal-opencode.json +12 -0
  7. package/config/opencode-legacy.json +571 -0
  8. package/config/opencode-modern.json +239 -0
  9. package/dist/index.d.ts +42 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +334 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/account-pool.d.ts +17 -0
  14. package/dist/lib/account-pool.d.ts.map +1 -0
  15. package/dist/lib/account-pool.js +243 -0
  16. package/dist/lib/account-pool.js.map +1 -0
  17. package/dist/lib/auth/auth.d.ts +43 -0
  18. package/dist/lib/auth/auth.d.ts.map +1 -0
  19. package/dist/lib/auth/auth.js +162 -0
  20. package/dist/lib/auth/auth.js.map +1 -0
  21. package/dist/lib/auth/browser.d.ts +17 -0
  22. package/dist/lib/auth/browser.d.ts.map +1 -0
  23. package/dist/lib/auth/browser.js +76 -0
  24. package/dist/lib/auth/browser.js.map +1 -0
  25. package/dist/lib/auth/server.d.ts +10 -0
  26. package/dist/lib/auth/server.d.ts.map +1 -0
  27. package/dist/lib/auth/server.js +78 -0
  28. package/dist/lib/auth/server.js.map +1 -0
  29. package/dist/lib/config.d.ts +17 -0
  30. package/dist/lib/config.d.ts.map +1 -0
  31. package/dist/lib/config.js +53 -0
  32. package/dist/lib/config.js.map +1 -0
  33. package/dist/lib/constants.d.ts +67 -0
  34. package/dist/lib/constants.d.ts.map +1 -0
  35. package/dist/lib/constants.js +67 -0
  36. package/dist/lib/constants.js.map +1 -0
  37. package/dist/lib/logger.d.ts +21 -0
  38. package/dist/lib/logger.d.ts.map +1 -0
  39. package/dist/lib/logger.js +77 -0
  40. package/dist/lib/logger.js.map +1 -0
  41. package/dist/lib/oauth-success.html +712 -0
  42. package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
  43. package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
  44. package/dist/lib/prompts/codex-opencode-bridge.js +152 -0
  45. package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
  46. package/dist/lib/prompts/codex.d.ts +27 -0
  47. package/dist/lib/prompts/codex.d.ts.map +1 -0
  48. package/dist/lib/prompts/codex.js +252 -0
  49. package/dist/lib/prompts/codex.js.map +1 -0
  50. package/dist/lib/prompts/opencode-codex.d.ts +21 -0
  51. package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
  52. package/dist/lib/prompts/opencode-codex.js +91 -0
  53. package/dist/lib/prompts/opencode-codex.js.map +1 -0
  54. package/dist/lib/request/fetch-helpers.d.ts +73 -0
  55. package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
  56. package/dist/lib/request/fetch-helpers.js +221 -0
  57. package/dist/lib/request/fetch-helpers.js.map +1 -0
  58. package/dist/lib/request/helpers/input-utils.d.ts +6 -0
  59. package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
  60. package/dist/lib/request/helpers/input-utils.js +174 -0
  61. package/dist/lib/request/helpers/input-utils.js.map +1 -0
  62. package/dist/lib/request/helpers/model-map.d.ts +28 -0
  63. package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
  64. package/dist/lib/request/helpers/model-map.js +126 -0
  65. package/dist/lib/request/helpers/model-map.js.map +1 -0
  66. package/dist/lib/request/request-transformer.d.ts +93 -0
  67. package/dist/lib/request/request-transformer.d.ts.map +1 -0
  68. package/dist/lib/request/request-transformer.js +418 -0
  69. package/dist/lib/request/request-transformer.js.map +1 -0
  70. package/dist/lib/request/response-handler.d.ts +14 -0
  71. package/dist/lib/request/response-handler.d.ts.map +1 -0
  72. package/dist/lib/request/response-handler.js +150 -0
  73. package/dist/lib/request/response-handler.js.map +1 -0
  74. package/dist/lib/types.d.ts +183 -0
  75. package/dist/lib/types.d.ts.map +1 -0
  76. package/dist/lib/types.js +2 -0
  77. package/dist/lib/types.js.map +1 -0
  78. package/package.json +74 -0
  79. package/scripts/install-opencode-codex-auth.js +433 -0
  80. package/scripts/test-all-models.sh +259 -0
  81. 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":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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
+ }