sub-bridge 1.0.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 (163) hide show
  1. package/.cursor/commands/mcp-only.md +1 -0
  2. package/.github/workflows/npm-publish.yml +33 -0
  3. package/.github/workflows/pages.yml +40 -0
  4. package/.github/workflows/release-please.yml +21 -0
  5. package/.release-please-manifest.json +3 -0
  6. package/CHANGELOG.md +8 -0
  7. package/DEVELOPMENT.md +31 -0
  8. package/LICENSE +21 -0
  9. package/README.md +87 -0
  10. package/api/index.ts +12 -0
  11. package/bun.lock +102 -0
  12. package/dist/auth/oauth-flow.d.ts +24 -0
  13. package/dist/auth/oauth-flow.d.ts.map +1 -0
  14. package/dist/auth/oauth-flow.js +184 -0
  15. package/dist/auth/oauth-flow.js.map +1 -0
  16. package/dist/auth/oauth-manager.d.ts +13 -0
  17. package/dist/auth/oauth-manager.d.ts.map +1 -0
  18. package/dist/auth/oauth-manager.js +25 -0
  19. package/dist/auth/oauth-manager.js.map +1 -0
  20. package/dist/auth/provider.d.ts +42 -0
  21. package/dist/auth/provider.d.ts.map +1 -0
  22. package/dist/auth/provider.js +270 -0
  23. package/dist/auth/provider.js.map +1 -0
  24. package/dist/cli.d.ts +3 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +91 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/mcp/proxy.d.ts +16 -0
  29. package/dist/mcp/proxy.d.ts.map +1 -0
  30. package/dist/mcp/proxy.js +85 -0
  31. package/dist/mcp/proxy.js.map +1 -0
  32. package/dist/mcp.d.ts +3 -0
  33. package/dist/mcp.d.ts.map +1 -0
  34. package/dist/mcp.js +50 -0
  35. package/dist/mcp.js.map +1 -0
  36. package/dist/routes/auth.d.ts +6 -0
  37. package/dist/routes/auth.d.ts.map +1 -0
  38. package/dist/routes/auth.js +149 -0
  39. package/dist/routes/auth.js.map +1 -0
  40. package/dist/routes/chat.d.ts +6 -0
  41. package/dist/routes/chat.d.ts.map +1 -0
  42. package/dist/routes/chat.js +808 -0
  43. package/dist/routes/chat.js.map +1 -0
  44. package/dist/routes/tunnels.d.ts +7 -0
  45. package/dist/routes/tunnels.d.ts.map +1 -0
  46. package/dist/routes/tunnels.js +44 -0
  47. package/dist/routes/tunnels.js.map +1 -0
  48. package/dist/server.d.ts +25 -0
  49. package/dist/server.d.ts.map +1 -0
  50. package/dist/server.js +157 -0
  51. package/dist/server.js.map +1 -0
  52. package/dist/tunnel/providers/cloudflare.d.ts +9 -0
  53. package/dist/tunnel/providers/cloudflare.d.ts.map +1 -0
  54. package/dist/tunnel/providers/cloudflare.js +47 -0
  55. package/dist/tunnel/providers/cloudflare.js.map +1 -0
  56. package/dist/tunnel/providers/index.d.ts +4 -0
  57. package/dist/tunnel/providers/index.d.ts.map +1 -0
  58. package/dist/tunnel/providers/index.js +13 -0
  59. package/dist/tunnel/providers/index.js.map +1 -0
  60. package/dist/tunnel/providers/ngrok.d.ts +10 -0
  61. package/dist/tunnel/providers/ngrok.d.ts.map +1 -0
  62. package/dist/tunnel/providers/ngrok.js +52 -0
  63. package/dist/tunnel/providers/ngrok.js.map +1 -0
  64. package/dist/tunnel/providers/tailscale.d.ts +10 -0
  65. package/dist/tunnel/providers/tailscale.d.ts.map +1 -0
  66. package/dist/tunnel/providers/tailscale.js +48 -0
  67. package/dist/tunnel/providers/tailscale.js.map +1 -0
  68. package/dist/tunnel/registry.d.ts +14 -0
  69. package/dist/tunnel/registry.d.ts.map +1 -0
  70. package/dist/tunnel/registry.js +86 -0
  71. package/dist/tunnel/registry.js.map +1 -0
  72. package/dist/tunnel/types.d.ts +26 -0
  73. package/dist/tunnel/types.d.ts.map +1 -0
  74. package/dist/tunnel/types.js +6 -0
  75. package/dist/tunnel/types.js.map +1 -0
  76. package/dist/tunnel/utils.d.ts +18 -0
  77. package/dist/tunnel/utils.d.ts.map +1 -0
  78. package/dist/tunnel/utils.js +57 -0
  79. package/dist/tunnel/utils.js.map +1 -0
  80. package/dist/types.d.ts +52 -0
  81. package/dist/types.d.ts.map +1 -0
  82. package/dist/types.js +4 -0
  83. package/dist/types.js.map +1 -0
  84. package/dist/utils/anthropic-to-openai-converter.d.ts +103 -0
  85. package/dist/utils/anthropic-to-openai-converter.d.ts.map +1 -0
  86. package/dist/utils/anthropic-to-openai-converter.js +376 -0
  87. package/dist/utils/anthropic-to-openai-converter.js.map +1 -0
  88. package/dist/utils/chat-to-responses.d.ts +59 -0
  89. package/dist/utils/chat-to-responses.d.ts.map +1 -0
  90. package/dist/utils/chat-to-responses.js +395 -0
  91. package/dist/utils/chat-to-responses.js.map +1 -0
  92. package/dist/utils/chatgpt-instructions.d.ts +3 -0
  93. package/dist/utils/chatgpt-instructions.d.ts.map +1 -0
  94. package/dist/utils/chatgpt-instructions.js +12 -0
  95. package/dist/utils/chatgpt-instructions.js.map +1 -0
  96. package/dist/utils/cli-args.d.ts +3 -0
  97. package/dist/utils/cli-args.d.ts.map +1 -0
  98. package/dist/utils/cli-args.js +10 -0
  99. package/dist/utils/cli-args.js.map +1 -0
  100. package/dist/utils/cors-bypass.d.ts +4 -0
  101. package/dist/utils/cors-bypass.d.ts.map +1 -0
  102. package/dist/utils/cors-bypass.js +30 -0
  103. package/dist/utils/cors-bypass.js.map +1 -0
  104. package/dist/utils/cursor-byok-bypass.d.ts +37 -0
  105. package/dist/utils/cursor-byok-bypass.d.ts.map +1 -0
  106. package/dist/utils/cursor-byok-bypass.js +53 -0
  107. package/dist/utils/cursor-byok-bypass.js.map +1 -0
  108. package/dist/utils/logger.d.ts +19 -0
  109. package/dist/utils/logger.d.ts.map +1 -0
  110. package/dist/utils/logger.js +192 -0
  111. package/dist/utils/logger.js.map +1 -0
  112. package/dist/utils/port.d.ts +27 -0
  113. package/dist/utils/port.d.ts.map +1 -0
  114. package/dist/utils/port.js +78 -0
  115. package/dist/utils/port.js.map +1 -0
  116. package/dist/utils/setup-instructions.d.ts +10 -0
  117. package/dist/utils/setup-instructions.d.ts.map +1 -0
  118. package/dist/utils/setup-instructions.js +49 -0
  119. package/dist/utils/setup-instructions.js.map +1 -0
  120. package/env.example +25 -0
  121. package/index.html +992 -0
  122. package/package.json +57 -0
  123. package/public/.nojekyll +0 -0
  124. package/public/assets/chat.png +0 -0
  125. package/public/assets/demo.gif +0 -0
  126. package/public/assets/demo.mp4 +0 -0
  127. package/public/assets/setup.png +0 -0
  128. package/public/assets/ui.png +0 -0
  129. package/public/index.html +292 -0
  130. package/release-please-config.json +10 -0
  131. package/src/auth/provider.ts +412 -0
  132. package/src/cli.ts +97 -0
  133. package/src/mcp/proxy.ts +64 -0
  134. package/src/mcp.ts +56 -0
  135. package/src/oauth/authorize.ts +270 -0
  136. package/src/oauth/crypto.ts +198 -0
  137. package/src/oauth/dcr.ts +129 -0
  138. package/src/oauth/metadata.ts +40 -0
  139. package/src/oauth/token.ts +173 -0
  140. package/src/routes/auth.ts +149 -0
  141. package/src/routes/chat.ts +983 -0
  142. package/src/routes/oauth.ts +220 -0
  143. package/src/routes/tunnels.ts +45 -0
  144. package/src/server.ts +204 -0
  145. package/src/tunnel/providers/cloudflare.ts +50 -0
  146. package/src/tunnel/providers/index.ts +7 -0
  147. package/src/tunnel/providers/ngrok.ts +56 -0
  148. package/src/tunnel/providers/tailscale.ts +50 -0
  149. package/src/tunnel/registry.ts +96 -0
  150. package/src/tunnel/types.ts +32 -0
  151. package/src/tunnel/utils.ts +59 -0
  152. package/src/types.ts +55 -0
  153. package/src/utils/anthropic-to-openai-converter.ts +578 -0
  154. package/src/utils/chat-to-responses.ts +512 -0
  155. package/src/utils/chatgpt-instructions.ts +7 -0
  156. package/src/utils/cli-args.ts +8 -0
  157. package/src/utils/cors-bypass.ts +39 -0
  158. package/src/utils/cursor-byok-bypass.ts +56 -0
  159. package/src/utils/logger.ts +174 -0
  160. package/src/utils/port.ts +99 -0
  161. package/src/utils/setup-instructions.ts +59 -0
  162. package/tsconfig.json +22 -0
  163. package/vercel.json +20 -0
@@ -0,0 +1,42 @@
1
+ export interface AuthSession {
2
+ authUrl: string;
3
+ userCode?: string;
4
+ interval?: number;
5
+ sessionId: string;
6
+ expiresAt: number;
7
+ }
8
+ export interface TokenResult {
9
+ accessToken: string;
10
+ refreshToken?: string;
11
+ expiresIn?: number;
12
+ accountId?: string;
13
+ email?: string;
14
+ }
15
+ export interface AuthProvider {
16
+ id: string;
17
+ name: string;
18
+ startAuth(): Promise<AuthSession>;
19
+ completeAuth(input: string, sessionId: string): Promise<TokenResult>;
20
+ }
21
+ export declare class ClaudeProvider implements AuthProvider {
22
+ id: string;
23
+ name: string;
24
+ startAuth(): Promise<AuthSession>;
25
+ completeAuth(codeInput: string, sessionId: string): Promise<TokenResult>;
26
+ }
27
+ export declare class OpenAIProvider implements AuthProvider {
28
+ id: string;
29
+ name: string;
30
+ getAuthUrl(): string;
31
+ startAuth(): Promise<AuthSession>;
32
+ completeAuth(_input: string, sessionId: string): Promise<TokenResult>;
33
+ getSession(sessionId: string): {
34
+ deviceAuthId: string;
35
+ userCode: string;
36
+ interval: number;
37
+ createdAt: number;
38
+ } | undefined;
39
+ }
40
+ export declare const claudeProvider: ClaudeProvider;
41
+ export declare const openaiProvider: OpenAIProvider;
42
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/auth/provider.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;IACjC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;CACrE;AAWD,qBAAa,cAAe,YAAW,YAAY;IACjD,EAAE,SAAW;IACb,IAAI,SAAW;IAET,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IAqBjC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CA6C/E;AAwJD,qBAAa,cAAe,YAAW,YAAY;IACjD,EAAE,SAAW;IACb,IAAI,SAAY;IAEhB,UAAU,IAAI,MAAM;IAId,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IAmCjC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsE3E,UAAU,CAAC,SAAS,EAAE,MAAM;sBAxHZ,MAAM;kBACV,MAAM;kBACN,MAAM;mBACL,MAAM;;CAwHpB;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAA;AAClD,eAAO,MAAM,cAAc,gBAAuB,CAAA"}
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.openaiProvider = exports.claudeProvider = exports.OpenAIProvider = exports.ClaudeProvider = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const node_child_process_1 = require("node:child_process");
9
+ const node_util_1 = require("node:util");
10
+ // ============================================================================
11
+ // Claude Provider - OAuth + PKCE
12
+ // ============================================================================
13
+ const CLAUDE_CLIENT_ID = process.env.ANTHROPIC_OAUTH_CLIENT_ID || '9d1c250a-e61b-44d9-88ed-5944d1962f5e';
14
+ const CLAUDE_REDIRECT_URI = 'https://console.anthropic.com/oauth/code/callback';
15
+ const CLAUDE_TOKEN_URL = 'https://console.anthropic.com/v1/oauth/token';
16
+ class ClaudeProvider {
17
+ id = 'claude';
18
+ name = 'Claude';
19
+ async startAuth() {
20
+ const verifier = crypto_1.default.randomBytes(32).toString('base64url');
21
+ const challenge = crypto_1.default.createHash('sha256').update(verifier).digest('base64url');
22
+ const authUrl = new URL('https://claude.ai/oauth/authorize');
23
+ authUrl.searchParams.set('code', 'true');
24
+ authUrl.searchParams.set('client_id', CLAUDE_CLIENT_ID);
25
+ authUrl.searchParams.set('response_type', 'code');
26
+ authUrl.searchParams.set('redirect_uri', CLAUDE_REDIRECT_URI);
27
+ authUrl.searchParams.set('scope', 'org:create_api_key user:profile user:inference');
28
+ authUrl.searchParams.set('code_challenge', challenge);
29
+ authUrl.searchParams.set('code_challenge_method', 'S256');
30
+ authUrl.searchParams.set('state', verifier);
31
+ return {
32
+ authUrl: authUrl.toString(),
33
+ sessionId: verifier,
34
+ expiresAt: Date.now() + 15 * 60 * 1000,
35
+ };
36
+ }
37
+ async completeAuth(codeInput, sessionId) {
38
+ // Parse CODE#STATE format
39
+ const parts = codeInput.trim().split('#');
40
+ const code = parts[0];
41
+ const state = parts[1] || sessionId;
42
+ const response = await fetch(CLAUDE_TOKEN_URL, {
43
+ method: 'POST',
44
+ headers: { 'Content-Type': 'application/json' },
45
+ body: JSON.stringify({
46
+ code,
47
+ state,
48
+ grant_type: 'authorization_code',
49
+ client_id: CLAUDE_CLIENT_ID,
50
+ redirect_uri: CLAUDE_REDIRECT_URI,
51
+ code_verifier: sessionId,
52
+ }),
53
+ });
54
+ if (!response.ok) {
55
+ const error = await response.text();
56
+ throw new Error(`Claude token exchange failed: ${error}`);
57
+ }
58
+ const data = (await response.json());
59
+ return {
60
+ accessToken: data.access_token,
61
+ refreshToken: data.refresh_token,
62
+ expiresIn: data.expires_in,
63
+ email: data.account?.email_address,
64
+ };
65
+ }
66
+ }
67
+ exports.ClaudeProvider = ClaudeProvider;
68
+ // ============================================================================
69
+ // OpenAI Provider - Device Code Flow
70
+ // ============================================================================
71
+ const OPENAI_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
72
+ const OPENAI_AUTH_BASE_URL = 'https://auth.openai.com';
73
+ const OPENAI_DEVICE_AUTH_BASE_URL = `${OPENAI_AUTH_BASE_URL}/api/accounts`;
74
+ const OPENAI_DEVICE_CODE_URL = `${OPENAI_DEVICE_AUTH_BASE_URL}/deviceauth/usercode`;
75
+ const OPENAI_DEVICE_POLL_URL = `${OPENAI_DEVICE_AUTH_BASE_URL}/deviceauth/token`;
76
+ const OPENAI_DEVICE_REDIRECT_URI = `${OPENAI_AUTH_BASE_URL}/deviceauth/callback`;
77
+ const OPENAI_TOKEN_URL = `${OPENAI_AUTH_BASE_URL}/oauth/token`;
78
+ const OPENAI_USER_AUTH_URL = `${OPENAI_AUTH_BASE_URL}/codex/device`;
79
+ const OPENAI_OAUTH_SCOPE = process.env.OPENAI_OAUTH_SCOPE || 'model.request';
80
+ const OPENAI_DEVICE_HEADERS = {
81
+ 'Content-Type': 'application/json',
82
+ 'User-Agent': 'reqwest/0.12.24',
83
+ };
84
+ const OPENAI_TOKEN_HEADERS = {
85
+ 'Content-Type': 'application/x-www-form-urlencoded',
86
+ 'User-Agent': 'reqwest/0.12.24',
87
+ };
88
+ function parseJwtPayload(token) {
89
+ const parts = token.split('.');
90
+ if (parts.length < 2)
91
+ return null;
92
+ const payload = parts[1].replace(/-/g, '+').replace(/_/g, '/');
93
+ const padded = payload + '='.repeat((4 - (payload.length % 4)) % 4);
94
+ try {
95
+ const decoded = Buffer.from(padded, 'base64').toString('utf8');
96
+ return JSON.parse(decoded);
97
+ }
98
+ catch {
99
+ return null;
100
+ }
101
+ }
102
+ function extractChatGptAccountId(idToken, accessToken) {
103
+ const tokens = [idToken, accessToken].filter((value) => Boolean(value));
104
+ for (const token of tokens) {
105
+ const payload = parseJwtPayload(token);
106
+ if (!payload)
107
+ continue;
108
+ const direct = payload?.chatgpt_account_id;
109
+ if (typeof direct === 'string' && direct.trim())
110
+ return direct;
111
+ const authClaim = payload?.['https://api.openai.com/auth'];
112
+ const nested = authClaim?.chatgpt_account_id;
113
+ if (typeof nested === 'string' && nested.trim())
114
+ return nested;
115
+ }
116
+ return undefined;
117
+ }
118
+ function extractEmailFromIdToken(idToken) {
119
+ if (!idToken)
120
+ return undefined;
121
+ const payload = parseJwtPayload(idToken);
122
+ if (!payload)
123
+ return undefined;
124
+ const email = payload?.email;
125
+ if (typeof email === 'string' && email.trim())
126
+ return email;
127
+ return undefined;
128
+ }
129
+ const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
130
+ function parseCurlResult(stdout) {
131
+ const marker = '\n__STATUS__:';
132
+ const idx = stdout.lastIndexOf(marker);
133
+ if (idx === -1) {
134
+ return { status: 0, ok: false, text: stdout };
135
+ }
136
+ const body = stdout.slice(0, idx);
137
+ const statusText = stdout.slice(idx + marker.length).trim();
138
+ const status = parseInt(statusText, 10);
139
+ return { status, ok: status >= 200 && status < 300, text: body };
140
+ }
141
+ async function curlPost(url, contentType, body) {
142
+ const args = [
143
+ '-sS',
144
+ '-X',
145
+ 'POST',
146
+ url,
147
+ '-H',
148
+ `Content-Type: ${contentType}`,
149
+ '-H',
150
+ 'User-Agent: reqwest/0.12.24',
151
+ '-d',
152
+ body,
153
+ '-w',
154
+ '\n__STATUS__:%{http_code}',
155
+ ];
156
+ const { stdout } = await execFileAsync('curl', args, { maxBuffer: 5 * 1024 * 1024 });
157
+ return parseCurlResult(stdout);
158
+ }
159
+ async function postWithFallback(url, headers, body, contentType) {
160
+ const response = await fetch(url, { method: 'POST', headers, body });
161
+ const text = await response.text();
162
+ if (response.ok) {
163
+ return { status: response.status, ok: true, text };
164
+ }
165
+ if (text.includes('cdn-cgi/challenge-platform')) {
166
+ try {
167
+ return await curlPost(url, contentType, body);
168
+ }
169
+ catch {
170
+ return { status: response.status, ok: false, text };
171
+ }
172
+ }
173
+ return { status: response.status, ok: false, text };
174
+ }
175
+ function normalizeOpenAIError(status, body) {
176
+ const trimmed = body.trim();
177
+ if (!trimmed)
178
+ return `HTTP ${status}`;
179
+ if (trimmed.startsWith('<') || trimmed.includes('cdn-cgi/challenge-platform')) {
180
+ return `OpenAI auth endpoint returned a Cloudflare challenge (HTTP ${status}).`;
181
+ }
182
+ return trimmed;
183
+ }
184
+ // Store active device sessions for polling
185
+ const deviceSessions = new Map();
186
+ class OpenAIProvider {
187
+ id = 'openai';
188
+ name = 'ChatGPT';
189
+ getAuthUrl() {
190
+ return OPENAI_USER_AUTH_URL;
191
+ }
192
+ async startAuth() {
193
+ const body = JSON.stringify({ client_id: OPENAI_CLIENT_ID, scope: OPENAI_OAUTH_SCOPE });
194
+ const response = await postWithFallback(OPENAI_DEVICE_CODE_URL, OPENAI_DEVICE_HEADERS, body, 'application/json');
195
+ if (!response.ok) {
196
+ throw new Error(`Failed to get device code: ${normalizeOpenAIError(response.status, response.text)}`);
197
+ }
198
+ const data = JSON.parse(response.text);
199
+ const sessionId = data.device_auth_id;
200
+ const interval = typeof data.interval === 'string' ? parseInt(data.interval, 10) : data.interval;
201
+ const safeInterval = Number.isFinite(interval) && interval > 0 ? interval : 5;
202
+ // Store session for polling
203
+ deviceSessions.set(sessionId, {
204
+ deviceAuthId: data.device_auth_id,
205
+ userCode: data.user_code,
206
+ interval: safeInterval,
207
+ createdAt: Date.now(),
208
+ });
209
+ return {
210
+ authUrl: OPENAI_USER_AUTH_URL,
211
+ userCode: data.user_code,
212
+ interval: safeInterval,
213
+ sessionId,
214
+ expiresAt: Date.now() + 15 * 60 * 1000,
215
+ };
216
+ }
217
+ async completeAuth(_input, sessionId) {
218
+ const session = deviceSessions.get(sessionId);
219
+ if (!session) {
220
+ throw new Error('Session not found or expired');
221
+ }
222
+ // Poll for authorization
223
+ const pollBody = JSON.stringify({
224
+ device_auth_id: session.deviceAuthId,
225
+ user_code: session.userCode,
226
+ });
227
+ const pollResponse = await postWithFallback(OPENAI_DEVICE_POLL_URL, OPENAI_DEVICE_HEADERS, pollBody, 'application/json');
228
+ if (!pollResponse.ok) {
229
+ if (pollResponse.status === 403 || pollResponse.status === 404 || pollResponse.status === 429) {
230
+ throw new Error('PENDING'); // User hasn't authorized yet
231
+ }
232
+ throw new Error(`Poll failed: ${normalizeOpenAIError(pollResponse.status, pollResponse.text)}`);
233
+ }
234
+ const pollData = JSON.parse(pollResponse.text);
235
+ // Exchange authorization code for tokens
236
+ const tokenBody = new URLSearchParams({
237
+ grant_type: 'authorization_code',
238
+ client_id: OPENAI_CLIENT_ID,
239
+ code: pollData.authorization_code,
240
+ code_verifier: pollData.code_verifier,
241
+ redirect_uri: OPENAI_DEVICE_REDIRECT_URI,
242
+ scope: OPENAI_OAUTH_SCOPE,
243
+ }).toString();
244
+ const tokenResponse = await postWithFallback(OPENAI_TOKEN_URL, OPENAI_TOKEN_HEADERS, tokenBody, 'application/x-www-form-urlencoded');
245
+ if (!tokenResponse.ok) {
246
+ throw new Error(`Token exchange failed: ${normalizeOpenAIError(tokenResponse.status, tokenResponse.text)}`);
247
+ }
248
+ const tokenData = JSON.parse(tokenResponse.text);
249
+ const accountId = extractChatGptAccountId(tokenData.id_token, tokenData.access_token);
250
+ const email = extractEmailFromIdToken(tokenData.id_token);
251
+ // Clean up session
252
+ deviceSessions.delete(sessionId);
253
+ return {
254
+ accessToken: tokenData.access_token,
255
+ refreshToken: tokenData.refresh_token,
256
+ expiresIn: tokenData.expires_in,
257
+ accountId,
258
+ email,
259
+ };
260
+ }
261
+ // Get session info for polling UI
262
+ getSession(sessionId) {
263
+ return deviceSessions.get(sessionId);
264
+ }
265
+ }
266
+ exports.OpenAIProvider = OpenAIProvider;
267
+ // Export singleton instances
268
+ exports.claudeProvider = new ClaudeProvider();
269
+ exports.openaiProvider = new OpenAIProvider();
270
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/auth/provider.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ /**
8
+ * Sub Bridge CLI
9
+ *
10
+ * Main entry point that can run in different modes:
11
+ * - Default: Starts HTTP server + MCP server (original behavior)
12
+ * - --server-only: Just HTTP server
13
+ * - --mcp-only: Just MCP proxy (discovers/starts HTTP server)
14
+ *
15
+ * For development, use the separate entry points:
16
+ * - npm run dev:server - HTTP server with hot reload
17
+ * - npm run dev:mcp - MCP proxy (connects to existing server or starts inline)
18
+ */
19
+ const commander_1 = require("commander");
20
+ const chalk_1 = __importDefault(require("chalk"));
21
+ const server_1 = require("./server");
22
+ const port_1 = require("./utils/port");
23
+ const proxy_1 = require("./mcp/proxy");
24
+ const cli_args_1 = require("./utils/cli-args");
25
+ const log = (...args) => console.error(...args);
26
+ async function main() {
27
+ const prog = commander_1.program
28
+ .name('sub-bridge')
29
+ .description('MCP bridge for ChatGPT Pro, Claude Max, etc. in Cursor');
30
+ (0, cli_args_1.addSharedOptions)(prog)
31
+ .option('--server-only', 'Run HTTP server only (no MCP)')
32
+ .option('--mcp-only', 'Run MCP proxy only (discovers existing server)')
33
+ .parse();
34
+ const opts = commander_1.program.opts();
35
+ const config = {
36
+ port: opts.port ? parseInt(opts.port, 10) : undefined,
37
+ tunnelUrl: opts.tunnel,
38
+ verbose: opts.verbose || false,
39
+ };
40
+ // MCP-only mode: just run the thin proxy
41
+ if (opts.mcpOnly) {
42
+ const discovery = await (0, port_1.findPort)(config.port);
43
+ if (discovery.hasServer) {
44
+ log(`[sub-bridge] Found existing HTTP server on port ${discovery.port}`);
45
+ await (0, proxy_1.startMcpServer)(discovery.port, log);
46
+ }
47
+ else {
48
+ log(`[sub-bridge] No HTTP server found, starting inline on port ${discovery.port}`);
49
+ const server = await (0, server_1.startServer)({ ...config, port: discovery.port });
50
+ await (0, proxy_1.startMcpServer)(server.port, log);
51
+ }
52
+ return;
53
+ }
54
+ // Server-only mode: just run the HTTP server
55
+ if (opts.serverOnly) {
56
+ await (0, server_1.startServer)(config);
57
+ log(chalk_1.default.dim(' Press Ctrl+C to stop'));
58
+ return;
59
+ }
60
+ // Default mode: start HTTP server + MCP (original behavior)
61
+ const server = await (0, server_1.startServer)(config);
62
+ printSetupInstructions(server.publicUrl);
63
+ await (0, proxy_1.startMcpServer)(server.port, log);
64
+ }
65
+ function printSetupInstructions(publicUrl) {
66
+ log();
67
+ log(chalk_1.default.bold.yellow(' Setup in Cursor:'));
68
+ log(chalk_1.default.dim(' ─────────────────────────────────────'));
69
+ log();
70
+ log(chalk_1.default.dim(' 1. Command Palette (Cmd+Shift+P / Ctrl+Shift+P)'));
71
+ log(chalk_1.default.dim(' 2. Search "Cursor Settings" → Open'));
72
+ log(chalk_1.default.dim(' 3. Navigate: Models → API Keys (expand)'));
73
+ log(chalk_1.default.dim(' 4. Enable "OpenAI API Key" toggle'));
74
+ log(chalk_1.default.dim(' 5. Set API key with routing:'));
75
+ log(chalk_1.default.dim(' '), chalk_1.default.cyan('o3=opus-4.5,o3-mini=sonnet-4.5:sk-ant-xxx'));
76
+ log(chalk_1.default.dim(' 6. Enable "Override OpenAI Base URL" toggle'));
77
+ log(chalk_1.default.dim(' 7. Set Base URL:'), chalk_1.default.cyan.bold(`${publicUrl}/v1`));
78
+ log();
79
+ log(chalk_1.default.dim(' Getting API keys:'));
80
+ log(chalk_1.default.dim(' • Open'), chalk_1.default.cyan(publicUrl), chalk_1.default.dim('in your external browser and click Login buttons'));
81
+ log(chalk_1.default.dim(' • Or use Claude Code CLI:'), chalk_1.default.cyan('claude setup-token'));
82
+ log(chalk_1.default.dim(' • Or use Codex CLI:'), chalk_1.default.cyan('codex login'));
83
+ log();
84
+ log(chalk_1.default.dim(' Use MCP tool: "get_status" to get URL anytime'));
85
+ log();
86
+ }
87
+ main().catch((error) => {
88
+ log('[sub-bridge] Fatal error:', error);
89
+ process.exit(1);
90
+ });
91
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface McpToolResult {
2
+ [x: string]: unknown;
3
+ content: Array<{
4
+ type: 'text';
5
+ text: string;
6
+ }>;
7
+ }
8
+ /**
9
+ * Call a tool on the HTTP server
10
+ */
11
+ export declare function callTool(port: number, name: string, args?: Record<string, unknown>): Promise<McpToolResult>;
12
+ /**
13
+ * Start MCP server and register tools that forward to HTTP server
14
+ */
15
+ export declare function startMcpServer(serverPort: number, log: (...args: any[]) => void): Promise<void>;
16
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/mcp/proxy.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/C;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAwBrH;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,iBAqBrF"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.callTool = callTool;
37
+ exports.startMcpServer = startMcpServer;
38
+ /**
39
+ * Shared MCP proxy functionality
40
+ */
41
+ const setup_instructions_1 = require("../utils/setup-instructions");
42
+ /**
43
+ * Call a tool on the HTTP server
44
+ */
45
+ async function callTool(port, name, args = {}) {
46
+ const localUrl = `http://localhost:${port}`;
47
+ try {
48
+ const response = await fetch(`${localUrl}/mcp/tools/${name}`, {
49
+ method: 'POST',
50
+ headers: { 'content-type': 'application/json' },
51
+ body: JSON.stringify({ arguments: args }),
52
+ });
53
+ if (!response.ok) {
54
+ const error = await response.text();
55
+ return {
56
+ content: [{ type: 'text', text: `Error calling tool ${name}: ${error}` }],
57
+ };
58
+ }
59
+ return response.json();
60
+ }
61
+ catch {
62
+ // Server not reachable - return helpful setup instructions
63
+ return {
64
+ content: [{ type: 'text', text: (0, setup_instructions_1.buildStatusText)({ mode: 'proxy', baseUrl: localUrl }) }],
65
+ };
66
+ }
67
+ }
68
+ /**
69
+ * Start MCP server and register tools that forward to HTTP server
70
+ */
71
+ async function startMcpServer(serverPort, log) {
72
+ const { McpServer } = await Promise.resolve().then(() => __importStar(require('@modelcontextprotocol/sdk/server/mcp.js')));
73
+ const { StdioServerTransport } = await Promise.resolve().then(() => __importStar(require('@modelcontextprotocol/sdk/server/stdio.js')));
74
+ const server = new McpServer({
75
+ name: 'Sub Bridge',
76
+ version: '2.1.0',
77
+ });
78
+ // Register tools that forward to HTTP server
79
+ server.tool('get_status', 'Get Sub Bridge status and login URL for Claude/ChatGPT authentication', {}, async () => callTool(serverPort, 'get_status'));
80
+ // Start MCP transport
81
+ const transport = new StdioServerTransport();
82
+ await server.connect(transport);
83
+ log('[mcp] MCP server started, connected to HTTP server on port', serverPort);
84
+ }
85
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/mcp/proxy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,4BAwBC;AAKD,wCAqBC;AA/DD;;GAEG;AACH,oEAA6D;AAO7D;;GAEG;AACI,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAY,EAAE,OAAgC,EAAE;IAC3F,MAAM,QAAQ,GAAG,oBAAoB,IAAI,EAAE,CAAA;IAE3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,cAAc,IAAI,EAAE,EAAE;YAC5D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SAC1C,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YACnC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,sBAAsB,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;aACnF,CAAA;QACH,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAA4B,CAAA;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;QAC3D,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAA,oCAAe,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;SAClG,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,GAA6B;IACpF,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,yCAAyC,GAAC,CAAA;IAC7E,MAAM,EAAE,oBAAoB,EAAE,GAAG,wDAAa,2CAA2C,GAAC,CAAA;IAE1F,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,6CAA6C;IAC7C,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,uEAAuE,EACvE,EAAE,EACF,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAC/C,CAAA;IAED,sBAAsB;IACtB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,GAAG,CAAC,4DAA4D,EAAE,UAAU,CAAC,CAAA;AAC/E,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":""}
package/dist/mcp.js ADDED
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /**
5
+ * Thin MCP Proxy Entry Point
6
+ *
7
+ * This is the entry point for Cursor's MCP integration.
8
+ * It discovers or starts an HTTP server and forwards tool calls to it.
9
+ *
10
+ * Dev mode: Developer runs HTTP server separately with `tsx watch src/server.ts`
11
+ * Production: MCP proxy starts HTTP server inline if not found
12
+ */
13
+ const commander_1 = require("commander");
14
+ const port_1 = require("./utils/port");
15
+ const server_1 = require("./server");
16
+ const proxy_1 = require("./mcp/proxy");
17
+ const cli_args_1 = require("./utils/cli-args");
18
+ const log = (...args) => console.error(...args);
19
+ async function main() {
20
+ // Parse CLI arguments
21
+ (0, cli_args_1.addSharedOptions)(commander_1.program).parse();
22
+ const opts = commander_1.program.opts();
23
+ const cliPort = opts.port ? parseInt(opts.port, 10) : undefined;
24
+ const tunnelUrl = opts.tunnel || process.env.TUNNEL_URL;
25
+ const verbose = opts.verbose || process.env.VERBOSE === 'true';
26
+ // Discover existing server or find a free port
27
+ const discovery = await (0, port_1.findPort)(cliPort);
28
+ let serverPort = discovery.port;
29
+ if (discovery.hasServer) {
30
+ log(`[mcp] Found existing HTTP server on port ${serverPort}`);
31
+ }
32
+ else {
33
+ log(`[mcp] No HTTP server found, starting inline on port ${serverPort}`);
34
+ // Start HTTP server inline (production mode)
35
+ const config = {
36
+ port: serverPort,
37
+ tunnelUrl,
38
+ verbose,
39
+ };
40
+ const server = await (0, server_1.startServer)(config);
41
+ serverPort = server.port;
42
+ log(`[mcp] HTTP server started on port ${serverPort}`);
43
+ }
44
+ await (0, proxy_1.startMcpServer)(serverPort, log);
45
+ }
46
+ main().catch((error) => {
47
+ log('[mcp] Fatal error:', error);
48
+ process.exit(1);
49
+ });
50
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":";;;AACA;;;;;;;;GAQG;AACH,yCAAmC;AACnC,uCAAuC;AACvC,qCAAyD;AACzD,uCAA4C;AAC5C,+CAAmD;AAEnD,MAAM,GAAG,GAAG,CAAC,GAAG,IAAsC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAEjF,KAAK,UAAU,IAAI;IACjB,sBAAsB;IACtB,IAAA,2BAAgB,EAAC,mBAAO,CAAC,CAAC,KAAK,EAAE,CAAA;IACjC,MAAM,IAAI,GAAG,mBAAO,CAAC,IAAI,EAAE,CAAA;IAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,MAAM,CAAA;IAE9D,+CAA+C;IAC/C,MAAM,SAAS,GAAG,MAAM,IAAA,eAAQ,EAAC,OAAO,CAAC,CAAA;IAEzC,IAAI,UAAU,GAAG,SAAS,CAAC,IAAI,CAAA;IAE/B,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,GAAG,CAAC,4CAA4C,UAAU,EAAE,CAAC,CAAA;IAC/D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,uDAAuD,UAAU,EAAE,CAAC,CAAA;QAExE,6CAA6C;QAC7C,MAAM,MAAM,GAAiB;YAC3B,IAAI,EAAE,UAAU;YAChB,SAAS;YACT,OAAO;SACR,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAA;QACxC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,GAAG,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,MAAM,IAAA,sBAAc,EAAC,UAAU,EAAE,GAAG,CAAC,CAAA;AACvC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Authentication routes for Claude and OpenAI OAuth
3
+ */
4
+ import { Hono } from 'hono';
5
+ export declare function createAuthRoutes(): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
6
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AA2B3B,wBAAgB,gBAAgB,+EAsH/B"}