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,86 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // Tunnel Registry - Manages providers and active tunnel
4
+ // ============================================================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TunnelRegistry = void 0;
7
+ const providers_1 = require("./providers");
8
+ class TunnelRegistry {
9
+ providers = new Map();
10
+ activeTunnel = null;
11
+ startedAt = null;
12
+ lastError = null;
13
+ constructor() {
14
+ const allProviders = [
15
+ new providers_1.CloudflareTunnelProvider(),
16
+ new providers_1.NgrokTunnelProvider(),
17
+ new providers_1.TailscaleTunnelProvider(),
18
+ ];
19
+ for (const provider of allProviders) {
20
+ this.providers.set(provider.id, provider);
21
+ }
22
+ }
23
+ async getProviders() {
24
+ const results = [];
25
+ for (const [id, provider] of this.providers) {
26
+ results.push({
27
+ id,
28
+ name: provider.name,
29
+ available: await provider.isAvailable(),
30
+ supportsNamedTunnels: provider.supportsNamedTunnels,
31
+ });
32
+ }
33
+ return results;
34
+ }
35
+ getStatus() {
36
+ if (this.activeTunnel) {
37
+ return {
38
+ active: true,
39
+ providerId: this.activeTunnel.providerId,
40
+ publicUrl: this.activeTunnel.publicUrl,
41
+ startedAt: this.startedAt || undefined,
42
+ };
43
+ }
44
+ return {
45
+ active: false,
46
+ error: this.lastError || undefined,
47
+ };
48
+ }
49
+ async start(providerId, localPort, namedUrl) {
50
+ // Stop existing tunnel if any
51
+ if (this.activeTunnel) {
52
+ this.activeTunnel.stop();
53
+ this.activeTunnel = null;
54
+ }
55
+ const provider = this.providers.get(providerId);
56
+ if (!provider) {
57
+ throw new Error(`Unknown tunnel provider: ${providerId}`);
58
+ }
59
+ if (!await provider.isAvailable()) {
60
+ throw new Error(`Tunnel provider ${provider.name} is not available`);
61
+ }
62
+ try {
63
+ this.lastError = null;
64
+ this.activeTunnel = await provider.start(localPort, namedUrl);
65
+ this.startedAt = new Date().toISOString();
66
+ return this.getStatus();
67
+ }
68
+ catch (error) {
69
+ this.lastError = error instanceof Error ? error.message : String(error);
70
+ throw error;
71
+ }
72
+ }
73
+ stop() {
74
+ if (this.activeTunnel) {
75
+ this.activeTunnel.stop();
76
+ this.activeTunnel = null;
77
+ this.startedAt = null;
78
+ }
79
+ return this.getStatus();
80
+ }
81
+ getPublicUrl() {
82
+ return this.activeTunnel?.publicUrl || null;
83
+ }
84
+ }
85
+ exports.TunnelRegistry = TunnelRegistry;
86
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tunnel/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface TunnelProvider {
2
+ id: string;
3
+ name: string;
4
+ supportsNamedTunnels: boolean;
5
+ isAvailable(): Promise<boolean>;
6
+ start(localPort: number, namedUrl?: string): Promise<TunnelInstance>;
7
+ }
8
+ export interface TunnelInstance {
9
+ providerId: string;
10
+ publicUrl: string;
11
+ stop(): void;
12
+ }
13
+ export interface TunnelStatus {
14
+ active: boolean;
15
+ providerId?: string;
16
+ publicUrl?: string;
17
+ startedAt?: string;
18
+ error?: string;
19
+ }
20
+ export interface ProviderInfo {
21
+ id: string;
22
+ name: string;
23
+ available: boolean;
24
+ supportsNamedTunnels: boolean;
25
+ }
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tunnel/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,oBAAoB,EAAE,OAAO,CAAA;IAC7B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CACrE;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,IAAI,IAAI,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,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,EAAE,OAAO,CAAA;IAClB,oBAAoB,EAAE,OAAO,CAAA;CAC9B"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // Tunnel Types
4
+ // ============================================================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tunnel/types.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,eAAe;AACf,+EAA+E"}
@@ -0,0 +1,18 @@
1
+ import { ChildProcess } from 'child_process';
2
+ /**
3
+ * Check if a binary exists in PATH
4
+ */
5
+ export declare function binaryExists(binary: string): Promise<boolean>;
6
+ /**
7
+ * Spawn a tunnel process with standard configuration
8
+ */
9
+ export declare function spawnTunnelProcess(command: string, args: string[]): ChildProcess;
10
+ /**
11
+ * Poll a function until it returns a value or times out
12
+ */
13
+ export declare function pollUntil<T>(fn: () => Promise<T | null>, timeout?: number, interval?: number): Promise<T>;
14
+ /**
15
+ * Execute shell command and return parsed JSON output
16
+ */
17
+ export declare function execJson<T = any>(command: string): Promise<T>;
18
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tunnel/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,YAAY,EAAE,MAAM,eAAe,CAAA;AAKzD;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAEhF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,EAC3B,OAAO,GAAE,MAAc,EACvB,QAAQ,GAAE,MAAY,GACrB,OAAO,CAAC,CAAC,CAAC,CAcZ;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAGnE"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // Tunnel Utilities
4
+ // ============================================================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.binaryExists = binaryExists;
7
+ exports.spawnTunnelProcess = spawnTunnelProcess;
8
+ exports.pollUntil = pollUntil;
9
+ exports.execJson = execJson;
10
+ const child_process_1 = require("child_process");
11
+ const util_1 = require("util");
12
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
13
+ /**
14
+ * Check if a binary exists in PATH
15
+ */
16
+ async function binaryExists(binary) {
17
+ try {
18
+ const cmd = process.platform === 'win32' ? `where ${binary}` : `which ${binary}`;
19
+ await execAsync(cmd);
20
+ return true;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ /**
27
+ * Spawn a tunnel process with standard configuration
28
+ */
29
+ function spawnTunnelProcess(command, args) {
30
+ return (0, child_process_1.spawn)(command, args, { stdio: ['ignore', 'pipe', 'pipe'] });
31
+ }
32
+ /**
33
+ * Poll a function until it returns a value or times out
34
+ */
35
+ async function pollUntil(fn, timeout = 30000, interval = 500) {
36
+ const start = Date.now();
37
+ while (Date.now() - start < timeout) {
38
+ try {
39
+ const result = await fn();
40
+ if (result !== null)
41
+ return result;
42
+ }
43
+ catch {
44
+ // Continue polling on error
45
+ }
46
+ await new Promise(r => setTimeout(r, interval));
47
+ }
48
+ throw new Error('Polling timeout');
49
+ }
50
+ /**
51
+ * Execute shell command and return parsed JSON output
52
+ */
53
+ async function execJson(command) {
54
+ const { stdout } = await execAsync(command);
55
+ return JSON.parse(stdout);
56
+ }
57
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tunnel/utils.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;;AAU/E,oCAQC;AAKD,gDAEC;AAKD,8BAkBC;AAKD,4BAGC;AAtDD,iDAAyD;AACzD,+BAAgC;AAEhC,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAA;AAEjC;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,CAAA;QAChF,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,OAAe,EAAE,IAAc;IAChE,OAAO,IAAA,qBAAK,EAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;AACpE,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAC7B,EAA2B,EAC3B,UAAkB,KAAK,EACvB,WAAmB,GAAG;IAEtB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAExB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAA;YACzB,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAA;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;AACpC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,QAAQ,CAAU,OAAe;IACrD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAA;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,52 @@
1
+ export interface AnthropicRequestBody {
2
+ system?: Array<{
3
+ type: string;
4
+ text: string;
5
+ }>;
6
+ messages?: Array<any>;
7
+ metadata?: {
8
+ user_id?: string;
9
+ };
10
+ stream?: boolean;
11
+ model: string;
12
+ [key: string]: unknown;
13
+ }
14
+ export interface AnthropicResponse {
15
+ id?: string;
16
+ model?: string;
17
+ stop_reason?: string | null;
18
+ content?: Array<{
19
+ type: 'text' | 'tool_use';
20
+ text?: string;
21
+ id?: string;
22
+ name?: string;
23
+ input?: unknown;
24
+ }>;
25
+ usage?: {
26
+ input_tokens: number;
27
+ output_tokens: number;
28
+ cache_creation_input_tokens?: number;
29
+ cache_read_input_tokens?: number;
30
+ };
31
+ [key: string]: unknown;
32
+ }
33
+ export interface ErrorResponse {
34
+ error: string;
35
+ message?: string;
36
+ details?: string;
37
+ }
38
+ export interface SuccessResponse {
39
+ success: boolean;
40
+ message: string;
41
+ }
42
+ export interface ModelInfo {
43
+ id: string;
44
+ object: 'model';
45
+ created: number;
46
+ owned_by: string;
47
+ }
48
+ export interface ModelsListResponse {
49
+ object: 'list';
50
+ data: ModelInfo[];
51
+ }
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9C,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;IACrB,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;QACzB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,OAAO,CAAA;KAChB,CAAC,CAAA;IACF,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAA;QACpB,aAAa,EAAE,MAAM,CAAA;QACrB,2BAA2B,CAAC,EAAE,MAAM,CAAA;QACpC,uBAAuB,CAAC,EAAE,MAAM,CAAA;KACjC,CAAA;IACD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,SAAS,EAAE,CAAA;CAClB"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Shared type definitions
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,0BAA0B"}
@@ -0,0 +1,103 @@
1
+ import type { AnthropicResponse } from '../types';
2
+ interface AnthropicContentBlock {
3
+ type: 'text' | 'tool_use';
4
+ id?: string;
5
+ name?: string;
6
+ text?: string;
7
+ input?: unknown;
8
+ }
9
+ interface AnthropicFullResponse {
10
+ id: string;
11
+ model: string;
12
+ content: AnthropicContentBlock[];
13
+ stop_reason: string;
14
+ usage?: {
15
+ input_tokens: number;
16
+ output_tokens: number;
17
+ cache_creation_input_tokens?: number;
18
+ cache_read_input_tokens?: number;
19
+ };
20
+ }
21
+ interface OpenAIStreamChunk {
22
+ id: string;
23
+ object: 'chat.completion.chunk';
24
+ created: number;
25
+ model: string;
26
+ choices: Array<{
27
+ index: number;
28
+ delta: {
29
+ role?: string;
30
+ content?: string;
31
+ tool_calls?: Array<{
32
+ index: number;
33
+ id?: string;
34
+ type?: 'function';
35
+ function?: {
36
+ name?: string;
37
+ arguments?: string;
38
+ };
39
+ }>;
40
+ };
41
+ finish_reason: string | null;
42
+ }>;
43
+ usage?: {
44
+ prompt_tokens: number;
45
+ completion_tokens: number;
46
+ total_tokens: number;
47
+ };
48
+ }
49
+ interface OpenAIResponse {
50
+ id: string;
51
+ object: 'chat.completion';
52
+ created: number;
53
+ model: string;
54
+ choices: Array<{
55
+ index: number;
56
+ message: {
57
+ role: string;
58
+ content: string | null;
59
+ tool_calls: Array<{
60
+ id: string;
61
+ type: 'function';
62
+ function: {
63
+ name: string;
64
+ arguments: string;
65
+ };
66
+ }>;
67
+ };
68
+ finish_reason: string | null;
69
+ }>;
70
+ usage: {
71
+ prompt_tokens: number;
72
+ completion_tokens: number;
73
+ total_tokens: number;
74
+ };
75
+ }
76
+ interface ToolCallTracker {
77
+ id: string;
78
+ name: string;
79
+ arguments: string;
80
+ }
81
+ interface MetricsData {
82
+ model: string;
83
+ stop_reason: string | null;
84
+ input_tokens: number;
85
+ cache_creation_input_tokens: number;
86
+ cache_read_input_tokens: number;
87
+ output_tokens: number;
88
+ messageId: string | null;
89
+ openAIId: string | null;
90
+ }
91
+ interface ProcessResult {
92
+ type: 'chunk' | 'done';
93
+ data?: OpenAIStreamChunk;
94
+ }
95
+ export interface ConverterState {
96
+ toolCallsTracker: Map<number, ToolCallTracker>;
97
+ metricsData: MetricsData;
98
+ }
99
+ export declare function createConverterState(): ConverterState;
100
+ export declare function convertNonStreamingResponse(anthropicResponse: AnthropicResponse | AnthropicFullResponse): OpenAIResponse;
101
+ export declare function processChunk(state: ConverterState, chunk: string, enableLogging?: boolean): ProcessResult[];
102
+ export {};
103
+ //# sourceMappingURL=anthropic-to-openai-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-to-openai-converter.d.ts","sourceRoot":"","sources":["../../src/utils/anthropic-to-openai-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAejD,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;IACzB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAsBD,UAAU,qBAAqB;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,qBAAqB,EAAE,CAAA;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAA;QACpB,aAAa,EAAE,MAAM,CAAA;QACrB,2BAA2B,CAAC,EAAE,MAAM,CAAA;QACpC,uBAAuB,CAAC,EAAE,MAAM,CAAA;KACjC,CAAA;CACF;AAGD,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,uBAAuB,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE;YACL,IAAI,CAAC,EAAE,MAAM,CAAA;YACb,OAAO,CAAC,EAAE,MAAM,CAAA;YAChB,UAAU,CAAC,EAAE,KAAK,CAAC;gBACjB,KAAK,EAAE,MAAM,CAAA;gBACb,EAAE,CAAC,EAAE,MAAM,CAAA;gBACX,IAAI,CAAC,EAAE,UAAU,CAAA;gBACjB,QAAQ,CAAC,EAAE;oBACT,IAAI,CAAC,EAAE,MAAM,CAAA;oBACb,SAAS,CAAC,EAAE,MAAM,CAAA;iBACnB,CAAA;aACF,CAAC,CAAA;SACH,CAAA;QACD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAC7B,CAAC,CAAA;IACF,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAA;QACrB,iBAAiB,EAAE,MAAM,CAAA;QACzB,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;CACF;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,iBAAiB,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAA;YACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;YACtB,UAAU,EAAE,KAAK,CAAC;gBAChB,EAAE,EAAE,MAAM,CAAA;gBACV,IAAI,EAAE,UAAU,CAAA;gBAChB,QAAQ,EAAE;oBACR,IAAI,EAAE,MAAM,CAAA;oBACZ,SAAS,EAAE,MAAM,CAAA;iBAClB,CAAA;aACF,CAAC,CAAA;SACH,CAAA;QACD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAC7B,CAAC,CAAA;IACF,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAA;QACrB,iBAAiB,EAAE,MAAM,CAAA;QACzB,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;CACF;AAGD,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,2BAA2B,EAAE,MAAM,CAAA;IACnC,uBAAuB,EAAE,MAAM,CAAA;IAC/B,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,iBAAiB,CAAA;CACzB;AAGD,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IAC9C,WAAW,EAAE,WAAW,CAAA;CACzB;AAGD,wBAAgB,oBAAoB,IAAI,cAAc,CAcrD;AAGD,wBAAgB,2BAA2B,CACzC,iBAAiB,EAAE,iBAAiB,GAAG,qBAAqB,GAC3D,cAAc,CAwDhB;AAGD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,MAAM,EACb,aAAa,GAAE,OAAe,GAC7B,aAAa,EAAE,CAqEjB"}