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.
- package/.cursor/commands/mcp-only.md +1 -0
- package/.github/workflows/npm-publish.yml +33 -0
- package/.github/workflows/pages.yml +40 -0
- package/.github/workflows/release-please.yml +21 -0
- package/.release-please-manifest.json +3 -0
- package/CHANGELOG.md +8 -0
- package/DEVELOPMENT.md +31 -0
- package/LICENSE +21 -0
- package/README.md +87 -0
- package/api/index.ts +12 -0
- package/bun.lock +102 -0
- package/dist/auth/oauth-flow.d.ts +24 -0
- package/dist/auth/oauth-flow.d.ts.map +1 -0
- package/dist/auth/oauth-flow.js +184 -0
- package/dist/auth/oauth-flow.js.map +1 -0
- package/dist/auth/oauth-manager.d.ts +13 -0
- package/dist/auth/oauth-manager.d.ts.map +1 -0
- package/dist/auth/oauth-manager.js +25 -0
- package/dist/auth/oauth-manager.js.map +1 -0
- package/dist/auth/provider.d.ts +42 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +270 -0
- package/dist/auth/provider.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +91 -0
- package/dist/cli.js.map +1 -0
- package/dist/mcp/proxy.d.ts +16 -0
- package/dist/mcp/proxy.d.ts.map +1 -0
- package/dist/mcp/proxy.js +85 -0
- package/dist/mcp/proxy.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +50 -0
- package/dist/mcp.js.map +1 -0
- package/dist/routes/auth.d.ts +6 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +149 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/chat.d.ts +6 -0
- package/dist/routes/chat.d.ts.map +1 -0
- package/dist/routes/chat.js +808 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/tunnels.d.ts +7 -0
- package/dist/routes/tunnels.d.ts.map +1 -0
- package/dist/routes/tunnels.js +44 -0
- package/dist/routes/tunnels.js.map +1 -0
- package/dist/server.d.ts +25 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +157 -0
- package/dist/server.js.map +1 -0
- package/dist/tunnel/providers/cloudflare.d.ts +9 -0
- package/dist/tunnel/providers/cloudflare.d.ts.map +1 -0
- package/dist/tunnel/providers/cloudflare.js +47 -0
- package/dist/tunnel/providers/cloudflare.js.map +1 -0
- package/dist/tunnel/providers/index.d.ts +4 -0
- package/dist/tunnel/providers/index.d.ts.map +1 -0
- package/dist/tunnel/providers/index.js +13 -0
- package/dist/tunnel/providers/index.js.map +1 -0
- package/dist/tunnel/providers/ngrok.d.ts +10 -0
- package/dist/tunnel/providers/ngrok.d.ts.map +1 -0
- package/dist/tunnel/providers/ngrok.js +52 -0
- package/dist/tunnel/providers/ngrok.js.map +1 -0
- package/dist/tunnel/providers/tailscale.d.ts +10 -0
- package/dist/tunnel/providers/tailscale.d.ts.map +1 -0
- package/dist/tunnel/providers/tailscale.js +48 -0
- package/dist/tunnel/providers/tailscale.js.map +1 -0
- package/dist/tunnel/registry.d.ts +14 -0
- package/dist/tunnel/registry.d.ts.map +1 -0
- package/dist/tunnel/registry.js +86 -0
- package/dist/tunnel/registry.js.map +1 -0
- package/dist/tunnel/types.d.ts +26 -0
- package/dist/tunnel/types.d.ts.map +1 -0
- package/dist/tunnel/types.js +6 -0
- package/dist/tunnel/types.js.map +1 -0
- package/dist/tunnel/utils.d.ts +18 -0
- package/dist/tunnel/utils.d.ts.map +1 -0
- package/dist/tunnel/utils.js +57 -0
- package/dist/tunnel/utils.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/anthropic-to-openai-converter.d.ts +103 -0
- package/dist/utils/anthropic-to-openai-converter.d.ts.map +1 -0
- package/dist/utils/anthropic-to-openai-converter.js +376 -0
- package/dist/utils/anthropic-to-openai-converter.js.map +1 -0
- package/dist/utils/chat-to-responses.d.ts +59 -0
- package/dist/utils/chat-to-responses.d.ts.map +1 -0
- package/dist/utils/chat-to-responses.js +395 -0
- package/dist/utils/chat-to-responses.js.map +1 -0
- package/dist/utils/chatgpt-instructions.d.ts +3 -0
- package/dist/utils/chatgpt-instructions.d.ts.map +1 -0
- package/dist/utils/chatgpt-instructions.js +12 -0
- package/dist/utils/chatgpt-instructions.js.map +1 -0
- package/dist/utils/cli-args.d.ts +3 -0
- package/dist/utils/cli-args.d.ts.map +1 -0
- package/dist/utils/cli-args.js +10 -0
- package/dist/utils/cli-args.js.map +1 -0
- package/dist/utils/cors-bypass.d.ts +4 -0
- package/dist/utils/cors-bypass.d.ts.map +1 -0
- package/dist/utils/cors-bypass.js +30 -0
- package/dist/utils/cors-bypass.js.map +1 -0
- package/dist/utils/cursor-byok-bypass.d.ts +37 -0
- package/dist/utils/cursor-byok-bypass.d.ts.map +1 -0
- package/dist/utils/cursor-byok-bypass.js +53 -0
- package/dist/utils/cursor-byok-bypass.js.map +1 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +192 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/port.d.ts +27 -0
- package/dist/utils/port.d.ts.map +1 -0
- package/dist/utils/port.js +78 -0
- package/dist/utils/port.js.map +1 -0
- package/dist/utils/setup-instructions.d.ts +10 -0
- package/dist/utils/setup-instructions.d.ts.map +1 -0
- package/dist/utils/setup-instructions.js +49 -0
- package/dist/utils/setup-instructions.js.map +1 -0
- package/env.example +25 -0
- package/index.html +992 -0
- package/package.json +57 -0
- package/public/.nojekyll +0 -0
- package/public/assets/chat.png +0 -0
- package/public/assets/demo.gif +0 -0
- package/public/assets/demo.mp4 +0 -0
- package/public/assets/setup.png +0 -0
- package/public/assets/ui.png +0 -0
- package/public/index.html +292 -0
- package/release-please-config.json +10 -0
- package/src/auth/provider.ts +412 -0
- package/src/cli.ts +97 -0
- package/src/mcp/proxy.ts +64 -0
- package/src/mcp.ts +56 -0
- package/src/oauth/authorize.ts +270 -0
- package/src/oauth/crypto.ts +198 -0
- package/src/oauth/dcr.ts +129 -0
- package/src/oauth/metadata.ts +40 -0
- package/src/oauth/token.ts +173 -0
- package/src/routes/auth.ts +149 -0
- package/src/routes/chat.ts +983 -0
- package/src/routes/oauth.ts +220 -0
- package/src/routes/tunnels.ts +45 -0
- package/src/server.ts +204 -0
- package/src/tunnel/providers/cloudflare.ts +50 -0
- package/src/tunnel/providers/index.ts +7 -0
- package/src/tunnel/providers/ngrok.ts +56 -0
- package/src/tunnel/providers/tailscale.ts +50 -0
- package/src/tunnel/registry.ts +96 -0
- package/src/tunnel/types.ts +32 -0
- package/src/tunnel/utils.ts +59 -0
- package/src/types.ts +55 -0
- package/src/utils/anthropic-to-openai-converter.ts +578 -0
- package/src/utils/chat-to-responses.ts +512 -0
- package/src/utils/chatgpt-instructions.ts +7 -0
- package/src/utils/cli-args.ts +8 -0
- package/src/utils/cors-bypass.ts +39 -0
- package/src/utils/cursor-byok-bypass.ts +56 -0
- package/src/utils/logger.ts +174 -0
- package/src/utils/port.ts +99 -0
- package/src/utils/setup-instructions.ts +59 -0
- package/tsconfig.json +22 -0
- package/vercel.json +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-byok-bypass.js","sourceRoot":"","sources":["../../src/utils/cursor-byok-bypass.ts"],"names":[],"mappings":";;AAGA,gEAqCC;AAID,4CAWC;AArDD,wCAAwC;AACxC,SAAgB,0BAA0B;IACxC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,aAAa,EAAE,QAAQ;gBACvB,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE;oBACP,WAAW,EAAE,EAAE;oBACf,OAAO,EAAE,+CAA+C;oBACxD,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,WAAW;iBAClB;aACF;SACF;QACD,OAAO,EAAE,UAAU;QACnB,EAAE,EAAE,wCAAwC;QAC5C,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,iBAAiB;QACzB,YAAY,EAAE,SAAS;QACvB,kBAAkB,EAAE,eAAe;QACnC,KAAK,EAAE;YACL,iBAAiB,EAAE,EAAE;YACrB,yBAAyB,EAAE;gBACzB,0BAA0B,EAAE,CAAC;gBAC7B,YAAY,EAAE,CAAC;gBACf,gBAAgB,EAAE,CAAC;gBACnB,0BAA0B,EAAE,CAAC;aAC9B;YACD,aAAa,EAAE,EAAE;YACjB,qBAAqB,EAAE;gBACrB,YAAY,EAAE,CAAC;gBACf,aAAa,EAAE,CAAC;aACjB;YACD,YAAY,EAAE,EAAE;SACjB;KACF,CAAA;AACH,CAAC;AAED,oEAAoE;AACpE,wEAAwE;AACxE,SAAgB,gBAAgB,CAAC,IAA0B;IACzD,6DAA6D;IAC7D,OAAO,CACL,IAAI,CAAC,QAAQ;QACb,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,CAAC,CAAM,EAAE,EAAE,CACT,CAAC,CAAC,OAAO,KAAK,iCAAiC;YAC/C,CAAC,CAAC,OAAO,KAAK,0BAA0B;YACxC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAChF,CACF,IAAI,KAAK,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const log: (...args: Parameters<typeof console.error>) => void;
|
|
2
|
+
export declare function setVerbose(verbose: boolean): void;
|
|
3
|
+
export declare function isVerbose(): boolean;
|
|
4
|
+
export declare function truncate(str: string, maxLen: number): string;
|
|
5
|
+
export declare function logRequest(route: 'claude' | 'openai' | 'chatgpt' | 'bypass', model: string, data: {
|
|
6
|
+
system?: string;
|
|
7
|
+
messages?: any[];
|
|
8
|
+
tools?: any[];
|
|
9
|
+
tokens?: number;
|
|
10
|
+
}): void;
|
|
11
|
+
export declare function logResponse(status: number, tokens?: {
|
|
12
|
+
input?: number;
|
|
13
|
+
output?: number;
|
|
14
|
+
cached?: number;
|
|
15
|
+
}): void;
|
|
16
|
+
export declare function logError(message: string): void;
|
|
17
|
+
export declare function logHeaders(label: string, headers: Record<string, string>): void;
|
|
18
|
+
export declare function logStreamChunk(chunk: string): void;
|
|
19
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,UAAU,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,SAA2B,CAAA;AAIxF,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,QAE1C;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAID,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,EACjD,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAA;IAChB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,QAkGF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,QAcxG;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,QAIvC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAQxE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,QAS3C"}
|
|
@@ -0,0 +1,192 @@
|
|
|
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.log = void 0;
|
|
7
|
+
exports.setVerbose = setVerbose;
|
|
8
|
+
exports.isVerbose = isVerbose;
|
|
9
|
+
exports.truncate = truncate;
|
|
10
|
+
exports.logRequest = logRequest;
|
|
11
|
+
exports.logResponse = logResponse;
|
|
12
|
+
exports.logError = logError;
|
|
13
|
+
exports.logHeaders = logHeaders;
|
|
14
|
+
exports.logStreamChunk = logStreamChunk;
|
|
15
|
+
/**
|
|
16
|
+
* Logging utilities for request/response logging
|
|
17
|
+
*/
|
|
18
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
19
|
+
const log = (...args) => console.error(...args);
|
|
20
|
+
exports.log = log;
|
|
21
|
+
let verboseMode = false;
|
|
22
|
+
function setVerbose(verbose) {
|
|
23
|
+
verboseMode = verbose;
|
|
24
|
+
}
|
|
25
|
+
function isVerbose() {
|
|
26
|
+
return verboseMode;
|
|
27
|
+
}
|
|
28
|
+
let requestCounter = 0;
|
|
29
|
+
function truncate(str, maxLen) {
|
|
30
|
+
if (str.length <= maxLen)
|
|
31
|
+
return str;
|
|
32
|
+
return str.slice(0, maxLen - 3) + '...';
|
|
33
|
+
}
|
|
34
|
+
function logRequest(route, model, data) {
|
|
35
|
+
requestCounter++;
|
|
36
|
+
const routeColors = { claude: chalk_1.default.cyan, openai: chalk_1.default.yellow, chatgpt: chalk_1.default.green, bypass: chalk_1.default.gray };
|
|
37
|
+
const routeLabels = { claude: 'Claude', openai: 'OpenAI', chatgpt: 'ChatGPT', bypass: 'Bypass' };
|
|
38
|
+
const roleColors = {
|
|
39
|
+
user: chalk_1.default.blue, assistant: chalk_1.default.green, system: chalk_1.default.magenta, tool: chalk_1.default.yellow
|
|
40
|
+
};
|
|
41
|
+
(0, exports.log)();
|
|
42
|
+
const tokenInfo = data.tokens ? ` ${chalk_1.default.dim(`(~${data.tokens.toLocaleString()} tokens)`)}` : '';
|
|
43
|
+
(0, exports.log)(`${routeColors[route]('⏺')} ${chalk_1.default.bold(routeLabels[route])} ${chalk_1.default.dim(`#${requestCounter}`)} ${chalk_1.default.dim('·')} ${model}${tokenInfo}`);
|
|
44
|
+
if (data.tools?.length) {
|
|
45
|
+
(0, exports.log)();
|
|
46
|
+
(0, exports.log)(` ${chalk_1.default.green('⏺')} ${chalk_1.default.green('Tools')} ${chalk_1.default.dim(`(${data.tools.length})`)}`);
|
|
47
|
+
const toolNames = data.tools.map((t) => t.name || t.function?.name || '?');
|
|
48
|
+
if (verboseMode) {
|
|
49
|
+
for (const name of toolNames)
|
|
50
|
+
(0, exports.log)(` ${chalk_1.default.dim(name)}`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const shown = toolNames.slice(0, 8);
|
|
54
|
+
(0, exports.log)(` ${chalk_1.default.dim(shown.join(', '))}${toolNames.length > 8 ? chalk_1.default.dim(` ... +${toolNames.length - 8} more`) : ''}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (data.system) {
|
|
58
|
+
(0, exports.log)();
|
|
59
|
+
(0, exports.log)(` ${chalk_1.default.magenta('⏺')} ${chalk_1.default.magenta('System')}`);
|
|
60
|
+
if (verboseMode) {
|
|
61
|
+
for (const line of data.system.split('\n'))
|
|
62
|
+
(0, exports.log)(` ${chalk_1.default.dim(line)}`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const preview = data.system.replace(/\n/g, ' ').slice(0, 200);
|
|
66
|
+
(0, exports.log)(` ${chalk_1.default.dim(preview)}${data.system.length > 200 ? '...' : ''}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (data.messages?.length) {
|
|
70
|
+
(0, exports.log)();
|
|
71
|
+
const messagesToShow = verboseMode ? data.messages : data.messages.slice(-5);
|
|
72
|
+
if (!verboseMode && data.messages.length > 5) {
|
|
73
|
+
(0, exports.log)(` ${chalk_1.default.dim('⏺')} ${chalk_1.default.dim(`... ${data.messages.length - 5} earlier messages`)}`);
|
|
74
|
+
(0, exports.log)();
|
|
75
|
+
}
|
|
76
|
+
for (const msg of messagesToShow) {
|
|
77
|
+
let role = msg.role;
|
|
78
|
+
if (!role) {
|
|
79
|
+
if (msg.type === 'human')
|
|
80
|
+
role = 'user';
|
|
81
|
+
else if (msg.type === 'ai')
|
|
82
|
+
role = 'assistant';
|
|
83
|
+
else if (msg.type === 'function' || msg.type === 'tool')
|
|
84
|
+
role = 'tool';
|
|
85
|
+
else if (msg.type === 'system')
|
|
86
|
+
role = 'system';
|
|
87
|
+
else if (msg.type === 'function_call')
|
|
88
|
+
role = 'tool';
|
|
89
|
+
else if (msg.type === 'function_call_output')
|
|
90
|
+
role = 'tool';
|
|
91
|
+
}
|
|
92
|
+
let content = '';
|
|
93
|
+
// Handle Responses API function_call type
|
|
94
|
+
if (msg.type === 'function_call') {
|
|
95
|
+
const argsPreview = verboseMode ? msg.arguments : truncate(msg.arguments || '', 50);
|
|
96
|
+
content = `[call: ${msg.name}(${argsPreview})]`;
|
|
97
|
+
}
|
|
98
|
+
// Handle Responses API function_call_output type
|
|
99
|
+
else if (msg.type === 'function_call_output') {
|
|
100
|
+
const outputPreview = verboseMode ? String(msg.output || '') : truncate(String(msg.output || ''), 50);
|
|
101
|
+
content = `[result: ${outputPreview}]`;
|
|
102
|
+
}
|
|
103
|
+
// Handle regular message content
|
|
104
|
+
else if (typeof msg.content === 'string') {
|
|
105
|
+
content = msg.content;
|
|
106
|
+
}
|
|
107
|
+
else if (Array.isArray(msg.content)) {
|
|
108
|
+
const parts = [];
|
|
109
|
+
for (const block of msg.content) {
|
|
110
|
+
if ((block.type === 'text' || block.type === 'input_text' || block.type === 'output_text') && block.text) {
|
|
111
|
+
parts.push(block.text);
|
|
112
|
+
}
|
|
113
|
+
else if (block.type === 'tool_use')
|
|
114
|
+
parts.push(`[tool: ${block.name}]`);
|
|
115
|
+
else if (block.type === 'tool_result') {
|
|
116
|
+
const resultContent = verboseMode ? String(block.content || '') : truncate(String(block.content || ''), 50);
|
|
117
|
+
parts.push(`[result: ${resultContent}]`);
|
|
118
|
+
}
|
|
119
|
+
else if (block.type === 'image' || block.type === 'image_url' || block.type === 'input_image')
|
|
120
|
+
parts.push('[image]');
|
|
121
|
+
else
|
|
122
|
+
parts.push(`[${block.type || '?'}]`);
|
|
123
|
+
}
|
|
124
|
+
content = parts.join(' ');
|
|
125
|
+
}
|
|
126
|
+
if (msg.tool_calls?.length) {
|
|
127
|
+
const toolNames = msg.tool_calls.map((tc) => tc.function?.name || tc.name || '?');
|
|
128
|
+
content = content ? `${content} → [tools: ${toolNames.join(', ')}]` : `[tools: ${toolNames.join(', ')}]`;
|
|
129
|
+
}
|
|
130
|
+
if (!role && !content)
|
|
131
|
+
continue;
|
|
132
|
+
if (!role)
|
|
133
|
+
role = 'unknown';
|
|
134
|
+
const color = roleColors[role] || chalk_1.default.gray;
|
|
135
|
+
(0, exports.log)(` ${color('⏺')} ${color(role)}`);
|
|
136
|
+
if (verboseMode) {
|
|
137
|
+
for (const line of content.split('\n'))
|
|
138
|
+
(0, exports.log)(` ${chalk_1.default.dim(line)}`);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const preview = content.replace(/\n/g, ' ').slice(0, 150);
|
|
142
|
+
(0, exports.log)(` ${chalk_1.default.dim(preview)}${content.length > 150 ? '...' : ''}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function logResponse(status, tokens) {
|
|
148
|
+
const statusColor = status < 400 ? chalk_1.default.green : chalk_1.default.red;
|
|
149
|
+
const statusText = status < 400 ? 'OK' : 'Error';
|
|
150
|
+
let tokenInfo = '';
|
|
151
|
+
if (tokens?.input || tokens?.output) {
|
|
152
|
+
const parts = [];
|
|
153
|
+
if (tokens.input)
|
|
154
|
+
parts.push(`${tokens.input} in`);
|
|
155
|
+
if (tokens.output)
|
|
156
|
+
parts.push(`${tokens.output} out`);
|
|
157
|
+
if (tokens.cached)
|
|
158
|
+
parts.push(chalk_1.default.cyan(`${tokens.cached} cached`));
|
|
159
|
+
tokenInfo = ` ${chalk_1.default.dim('·')} ${parts.join(' → ')}`;
|
|
160
|
+
}
|
|
161
|
+
(0, exports.log)();
|
|
162
|
+
(0, exports.log)(` ${statusColor('⏺')} ${statusColor(statusText)} ${chalk_1.default.dim(status)}${tokenInfo}`);
|
|
163
|
+
(0, exports.log)();
|
|
164
|
+
}
|
|
165
|
+
function logError(message) {
|
|
166
|
+
(0, exports.log)();
|
|
167
|
+
(0, exports.log)(` ${chalk_1.default.red('⏺')} ${chalk_1.default.red('Error')}: ${message}`);
|
|
168
|
+
(0, exports.log)();
|
|
169
|
+
}
|
|
170
|
+
function logHeaders(label, headers) {
|
|
171
|
+
if (!verboseMode)
|
|
172
|
+
return;
|
|
173
|
+
(0, exports.log)();
|
|
174
|
+
(0, exports.log)(` ${chalk_1.default.cyan('⏺')} ${chalk_1.default.cyan(label)}`);
|
|
175
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
176
|
+
const displayValue = key.toLowerCase().includes('auth') ? truncate(value, 20) : value;
|
|
177
|
+
(0, exports.log)(` ${chalk_1.default.dim(key)}: ${chalk_1.default.dim(displayValue)}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function logStreamChunk(chunk) {
|
|
181
|
+
if (!verboseMode)
|
|
182
|
+
return;
|
|
183
|
+
(0, exports.log)(` ${chalk_1.default.gray('⏺')} ${chalk_1.default.gray('Stream chunk')} ${chalk_1.default.dim(`(${chunk.length} bytes)`)}`);
|
|
184
|
+
for (const line of chunk.split('\n').slice(0, 5)) {
|
|
185
|
+
if (line)
|
|
186
|
+
(0, exports.log)(` ${chalk_1.default.dim(truncate(line, 100))}`);
|
|
187
|
+
}
|
|
188
|
+
if (chunk.split('\n').length > 5) {
|
|
189
|
+
(0, exports.log)(` ${chalk_1.default.dim('...')}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port discovery utilities for MCP and HTTP server coordination.
|
|
3
|
+
* Both use the same algorithm to find each other naturally.
|
|
4
|
+
*/
|
|
5
|
+
declare const SERVICE_IDENTIFIER = "sub-bridge";
|
|
6
|
+
declare const DEFAULT_PORT = 8787;
|
|
7
|
+
export interface PortDiscoveryResult {
|
|
8
|
+
port: number;
|
|
9
|
+
hasServer: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface HealthResponse {
|
|
12
|
+
status: string;
|
|
13
|
+
service: string;
|
|
14
|
+
port: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Find a port where our server is running, or find a free port.
|
|
18
|
+
* Used by MCP to discover existing server or decide where to start one.
|
|
19
|
+
*/
|
|
20
|
+
export declare function findPort(startPort?: number): Promise<PortDiscoveryResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Find a free port to bind to.
|
|
23
|
+
* Used by HTTP server when starting up.
|
|
24
|
+
*/
|
|
25
|
+
export declare function findFreePort(startPort?: number): Promise<number>;
|
|
26
|
+
export { SERVICE_IDENTIFIER, DEFAULT_PORT };
|
|
27
|
+
//# sourceMappingURL=port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/utils/port.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,QAAA,MAAM,kBAAkB,eAAe,CAAA;AACvC,QAAA,MAAM,YAAY,OAAO,CAAA;AAGzB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AA6BD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmB/E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBtE;AAED,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Port discovery utilities for MCP and HTTP server coordination.
|
|
4
|
+
* Both use the same algorithm to find each other naturally.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DEFAULT_PORT = exports.SERVICE_IDENTIFIER = void 0;
|
|
8
|
+
exports.findPort = findPort;
|
|
9
|
+
exports.findFreePort = findFreePort;
|
|
10
|
+
const SERVICE_IDENTIFIER = 'sub-bridge';
|
|
11
|
+
exports.SERVICE_IDENTIFIER = SERVICE_IDENTIFIER;
|
|
12
|
+
const DEFAULT_PORT = 8787;
|
|
13
|
+
exports.DEFAULT_PORT = DEFAULT_PORT;
|
|
14
|
+
const MAX_PORT_TRIES = 10;
|
|
15
|
+
/**
|
|
16
|
+
* Check if a port has our server running on it.
|
|
17
|
+
* Returns 'our-server' if sub-bridge is running, 'other-service' if something else,
|
|
18
|
+
* or 'free' if nothing is listening.
|
|
19
|
+
*/
|
|
20
|
+
async function checkPort(port) {
|
|
21
|
+
try {
|
|
22
|
+
const controller = new AbortController();
|
|
23
|
+
const timeout = setTimeout(() => controller.abort(), 1000);
|
|
24
|
+
const res = await fetch(`http://localhost:${port}/health`, {
|
|
25
|
+
signal: controller.signal,
|
|
26
|
+
});
|
|
27
|
+
clearTimeout(timeout);
|
|
28
|
+
if (!res.ok) {
|
|
29
|
+
return 'other-service';
|
|
30
|
+
}
|
|
31
|
+
const data = await res.json();
|
|
32
|
+
return data.service === SERVICE_IDENTIFIER ? 'our-server' : 'other-service';
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Connection refused or timeout = port is free
|
|
36
|
+
return 'free';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Find a port where our server is running, or find a free port.
|
|
41
|
+
* Used by MCP to discover existing server or decide where to start one.
|
|
42
|
+
*/
|
|
43
|
+
async function findPort(startPort) {
|
|
44
|
+
const envPort = parseInt(process.env.PORT || '', 10);
|
|
45
|
+
const port = startPort ?? (envPort || DEFAULT_PORT);
|
|
46
|
+
for (let p = port; p < port + MAX_PORT_TRIES; p++) {
|
|
47
|
+
const status = await checkPort(p);
|
|
48
|
+
if (status === 'our-server') {
|
|
49
|
+
return { port: p, hasServer: true };
|
|
50
|
+
}
|
|
51
|
+
if (status === 'free') {
|
|
52
|
+
return { port: p, hasServer: false };
|
|
53
|
+
}
|
|
54
|
+
// status === 'other-service', try next port
|
|
55
|
+
}
|
|
56
|
+
throw new Error(`No available port found in range ${port}-${port + MAX_PORT_TRIES - 1}`);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Find a free port to bind to.
|
|
60
|
+
* Used by HTTP server when starting up.
|
|
61
|
+
*/
|
|
62
|
+
async function findFreePort(startPort) {
|
|
63
|
+
const envPort = parseInt(process.env.PORT || '', 10);
|
|
64
|
+
const port = startPort ?? (envPort || DEFAULT_PORT);
|
|
65
|
+
for (let p = port; p < port + MAX_PORT_TRIES; p++) {
|
|
66
|
+
const status = await checkPort(p);
|
|
67
|
+
if (status === 'free') {
|
|
68
|
+
return p;
|
|
69
|
+
}
|
|
70
|
+
if (status === 'our-server') {
|
|
71
|
+
// Another instance is already running on this port
|
|
72
|
+
// Continue to find a free port for a new instance
|
|
73
|
+
}
|
|
74
|
+
// status === 'other-service', try next port
|
|
75
|
+
}
|
|
76
|
+
throw new Error(`No free port found in range ${port}-${port + MAX_PORT_TRIES - 1}`);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/utils/port.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type StatusTextMode = 'server' | 'proxy';
|
|
2
|
+
interface StatusTextOptions {
|
|
3
|
+
mode: StatusTextMode;
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
isLocalOnly?: boolean;
|
|
6
|
+
tunnelActive?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function buildStatusText(options: StatusTextOptions): string;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=setup-instructions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-instructions.d.ts","sourceRoot":"","sources":["../../src/utils/setup-instructions.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAA;AAExC,UAAU,iBAAiB;IACzB,IAAI,EAAE,cAAc,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAQD,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CA2ClE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildStatusText = buildStatusText;
|
|
4
|
+
const MODEL_MAPPING_LINES = [
|
|
5
|
+
'Model mapping: API key format is "o3=opus-4.5,o3-mini=sonnet-4.5:sk-ant-xxx"',
|
|
6
|
+
'- Cursor requests "o3" → routes to "claude-opus-4-5-20251101"',
|
|
7
|
+
'- Cursor requests "o3-mini" → routes to "claude-sonnet-4-5-20250514"',
|
|
8
|
+
];
|
|
9
|
+
function buildStatusText(options) {
|
|
10
|
+
const { mode, baseUrl } = options;
|
|
11
|
+
const baseUrlForV1 = baseUrl.replace(/\/$/, '');
|
|
12
|
+
if (mode === 'server') {
|
|
13
|
+
const lines = [
|
|
14
|
+
'Sub Bridge is running.',
|
|
15
|
+
'',
|
|
16
|
+
`Setup URL: ${baseUrl}`,
|
|
17
|
+
"Open this URL in your browser where you're logged into ChatGPT or Claude.",
|
|
18
|
+
'',
|
|
19
|
+
'To configure Cursor:',
|
|
20
|
+
'1. Authenticate with ChatGPT or Claude in the web UI',
|
|
21
|
+
'2. Copy the generated API key',
|
|
22
|
+
'3. In Cursor: Settings → Models → API Keys',
|
|
23
|
+
' - Paste the API key',
|
|
24
|
+
` - Set Base URL to: ${baseUrlForV1}/v1`,
|
|
25
|
+
'',
|
|
26
|
+
...MODEL_MAPPING_LINES,
|
|
27
|
+
];
|
|
28
|
+
if (options.isLocalOnly && !options.tunnelActive) {
|
|
29
|
+
lines.push('', 'Note: Using local URL. If Cursor needs a public URL, enable a tunnel in the web UI.');
|
|
30
|
+
}
|
|
31
|
+
lines.push('', `Setup screenshot: ${baseUrl}/assets/setup.png`);
|
|
32
|
+
return lines.join('\n');
|
|
33
|
+
}
|
|
34
|
+
return [
|
|
35
|
+
'Sub Bridge server not reachable.',
|
|
36
|
+
'',
|
|
37
|
+
'To set up:',
|
|
38
|
+
`1. Open ${baseUrl} in your browser where you're logged into ChatGPT or Claude`,
|
|
39
|
+
'2. Authenticate and copy the generated API key',
|
|
40
|
+
`3. In Cursor: Settings → Models → API Keys, paste the key and set Base URL to ${baseUrlForV1}/v1`,
|
|
41
|
+
'',
|
|
42
|
+
...MODEL_MAPPING_LINES,
|
|
43
|
+
'',
|
|
44
|
+
'If you need a public URL, enable a tunnel in the web UI.',
|
|
45
|
+
'',
|
|
46
|
+
`Setup screenshot: ${baseUrl}/assets/setup.png`,
|
|
47
|
+
].join('\n');
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=setup-instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-instructions.js","sourceRoot":"","sources":["../../src/utils/setup-instructions.ts"],"names":[],"mappings":";;AAeA,0CA2CC;AAjDD,MAAM,mBAAmB,GAAG;IAC1B,8EAA8E;IAC9E,+DAA+D;IAC/D,sEAAsE;CACvE,CAAA;AAED,SAAgB,eAAe,CAAC,OAA0B;IACxD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IACjC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAE/C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG;YACZ,wBAAwB;YACxB,EAAE;YACF,cAAc,OAAO,EAAE;YACvB,2EAA2E;YAC3E,EAAE;YACF,sBAAsB;YACtB,sDAAsD;YACtD,+BAA+B;YAC/B,4CAA4C;YAC5C,wBAAwB;YACxB,yBAAyB,YAAY,KAAK;YAC1C,EAAE;YACF,GAAG,mBAAmB;SACvB,CAAA;QAED,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,qFAAqF,CAAC,CAAA;QACvG,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,qBAAqB,OAAO,mBAAmB,CAAC,CAAA;QAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,OAAO;QACL,kCAAkC;QAClC,EAAE;QACF,YAAY;QACZ,WAAW,OAAO,6DAA6D;QAC/E,gDAAgD;QAChD,iFAAiF,YAAY,KAAK;QAClG,EAAE;QACF,GAAG,mBAAmB;QACtB,EAAE;QACF,0DAA0D;QAC1D,EAAE;QACF,qBAAqB,OAAO,mBAAmB;KAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
|
package/env.example
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Upstash Redis Configuration
|
|
2
|
+
# Get these values from your Upstash Redis dashboard (https://console.upstash.com/)
|
|
3
|
+
UPSTASH_REDIS_REST_URL=https://your-redis-instance.upstash.io
|
|
4
|
+
UPSTASH_REDIS_REST_TOKEN=your-redis-rest-token
|
|
5
|
+
|
|
6
|
+
API_KEY=custom-key
|
|
7
|
+
|
|
8
|
+
# Optional: Anthropic OAuth Client ID
|
|
9
|
+
# Defaults to the official Claude CLI ID if not provided
|
|
10
|
+
# ANTHROPIC_OAUTH_CLIENT_ID=9d1c250a-e61b-44d9-88ed-5944d1962f5e
|
|
11
|
+
|
|
12
|
+
# Optional: Server port
|
|
13
|
+
# Defaults to 9095 if not provided
|
|
14
|
+
PORT=8080
|
|
15
|
+
|
|
16
|
+
# Optional: Public tunnel URL (without protocol)
|
|
17
|
+
TUNNEL_URL=8080.buremba.com
|
|
18
|
+
|
|
19
|
+
# Optional: OpenAI OAuth scopes (device flow)
|
|
20
|
+
# Defaults to model.request if not provided
|
|
21
|
+
# OPENAI_OAUTH_SCOPE=model.request
|
|
22
|
+
|
|
23
|
+
# Optional: ChatGPT backend base URL
|
|
24
|
+
# Defaults to https://chatgpt.com/backend-api/codex
|
|
25
|
+
# CHATGPT_BASE_URL=https://chatgpt.com/backend-api/codex
|