unbound-claude-code 0.2.0 → 0.2.2
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/dist/cli.d.ts +3 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +24 -34
- package/dist/cli.js.map +1 -1
- package/dist/interceptor.d.ts +2 -6
- package/dist/interceptor.d.ts.map +1 -1
- package/dist/interceptor.js +6 -358
- package/dist/interceptor.js.map +1 -1
- package/package.json +10 -3
package/dist/cli.d.ts
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Unbound Code CLI
|
|
4
4
|
*
|
|
5
|
-
* A Claude
|
|
5
|
+
* A Claude CLI wrapper that acts as a proxy to Unbound AI.
|
|
6
|
+
* It intercepts API calls to Anthropic and sends them to Unbound AI.
|
|
7
|
+
* It also provides a CLI interface for managing the Unbound AI API key and model.
|
|
6
8
|
*/
|
|
7
9
|
declare class UnboundCli {
|
|
8
10
|
private auth;
|
|
@@ -15,7 +17,6 @@ declare class UnboundCli {
|
|
|
15
17
|
private clearConfig;
|
|
16
18
|
private setModel;
|
|
17
19
|
private checkClaudeCode;
|
|
18
|
-
private getInterceptorPath;
|
|
19
20
|
private authenticateUser;
|
|
20
21
|
private launchClaudeCode;
|
|
21
22
|
run(args: string[]): Promise<void>;
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG;AAiBH,cAAM,UAAU;IACd,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,OAAO,CAAiB;;IAOhC,OAAO,CAAC,SAAS;IAoDjB,OAAO,CAAC,QAAQ;IAsChB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,UAAU;YAgBJ,WAAW;YAIX,QAAQ;YAyBR,eAAe;YASf,gBAAgB;YA2EhB,gBAAgB;IAuCjB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CA2ChD;AAQD,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* Unbound Code CLI
|
|
5
5
|
*
|
|
6
|
-
* A Claude
|
|
6
|
+
* A Claude CLI wrapper that acts as a proxy to Unbound AI.
|
|
7
|
+
* It intercepts API calls to Anthropic and sends them to Unbound AI.
|
|
8
|
+
* It also provides a CLI interface for managing the Unbound AI API key and model.
|
|
7
9
|
*/
|
|
8
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
11
|
exports.UnboundCli = void 0;
|
|
10
12
|
const child_process_1 = require("child_process");
|
|
11
|
-
const path_1 = require("path");
|
|
12
|
-
const fs_1 = require("fs");
|
|
13
13
|
const auth_1 = require("./auth");
|
|
14
14
|
const storage_1 = require("./storage");
|
|
15
15
|
class UnboundCli {
|
|
@@ -67,7 +67,7 @@ class UnboundCli {
|
|
|
67
67
|
}
|
|
68
68
|
showHelp() {
|
|
69
69
|
console.log(`
|
|
70
|
-
Unbound Code - Claude
|
|
70
|
+
Unbound Code - Claude with Unbound AI
|
|
71
71
|
|
|
72
72
|
USAGE:
|
|
73
73
|
unbound-claude-code [OPTIONS] [CLAUDE_ARGS...]
|
|
@@ -83,8 +83,8 @@ OPTIONS:
|
|
|
83
83
|
--set-model MODEL Set default model
|
|
84
84
|
|
|
85
85
|
EXAMPLES:
|
|
86
|
-
unbound-claude-code # Start Claude
|
|
87
|
-
unbound-claude-code chat # Start in chat mode
|
|
86
|
+
unbound-claude-code # Start Claude with Unbound AI
|
|
87
|
+
unbound-claude-code chat # Start Claude in chat mode
|
|
88
88
|
unbound-claude-code --debug # Start with debug logging
|
|
89
89
|
unbound-claude-code --api-key YOUR_KEY # Set and store API key securely
|
|
90
90
|
unbound-claude-code --show-config # Show stored configuration
|
|
@@ -98,8 +98,8 @@ ENVIRONMENT VARIABLES:
|
|
|
98
98
|
SECURITY:
|
|
99
99
|
API keys are stored securely in your system's keychain only.
|
|
100
100
|
|
|
101
|
-
Claude
|
|
102
|
-
|
|
101
|
+
Claude will be launched with ANTHROPIC_BASE_URL set to https://api.getunbound.ai
|
|
102
|
+
and ANTHROPIC_API_KEY set to your Unbound API key.
|
|
103
103
|
`);
|
|
104
104
|
}
|
|
105
105
|
showVersion() {
|
|
@@ -147,12 +147,13 @@ Claude Code is bundled with Unbound Code, so no separate installation is needed.
|
|
|
147
147
|
console.log(`✓ Default model set to: ${model}`);
|
|
148
148
|
}
|
|
149
149
|
async checkClaudeCode() {
|
|
150
|
-
//
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
150
|
+
// Check if claude command is available
|
|
151
|
+
try {
|
|
152
|
+
(0, child_process_1.execSync)('which claude', { stdio: 'ignore' });
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
throw new Error('Claude CLI not found. Please install Claude and make sure it\'s available in your PATH.');
|
|
156
|
+
}
|
|
156
157
|
}
|
|
157
158
|
async authenticateUser(options) {
|
|
158
159
|
if (options.skipAuth) {
|
|
@@ -220,38 +221,27 @@ Claude Code is bundled with Unbound Code, so no separate installation is needed.
|
|
|
220
221
|
return apiKey;
|
|
221
222
|
}
|
|
222
223
|
async launchClaudeCode(apiKey, claudeArgs, debug) {
|
|
223
|
-
|
|
224
|
-
if (!(0, fs_1.existsSync)(interceptorPath)) {
|
|
225
|
-
throw new Error(`Interceptor not found at: ${interceptorPath}`);
|
|
226
|
-
}
|
|
227
|
-
// Set environment variables
|
|
224
|
+
// Set environment variables to redirect Claude to Unbound gateway
|
|
228
225
|
const env = {
|
|
229
226
|
...process.env,
|
|
230
|
-
|
|
227
|
+
ANTHROPIC_BASE_URL: "https://api.getunbound.ai",
|
|
228
|
+
ANTHROPIC_API_KEY: apiKey,
|
|
231
229
|
UNBOUND_LOG_LEVEL: debug ? 'debug' : 'info',
|
|
232
|
-
// Don't set ANTHROPIC_API_KEY - let Claude Code handle its own auth flow
|
|
233
|
-
// Our interceptor will extract the API key from the request headers
|
|
234
230
|
};
|
|
235
|
-
console.log('Starting Claude
|
|
231
|
+
console.log('Starting Claude with Unbound AI gateway...');
|
|
236
232
|
console.log('');
|
|
237
|
-
//
|
|
238
|
-
const
|
|
239
|
-
'@anthropic-ai/claude-code',
|
|
240
|
-
...claudeArgs
|
|
241
|
-
];
|
|
242
|
-
const claudeProcess = (0, child_process_1.spawn)('npx', spawnArgs, {
|
|
233
|
+
// Launch claude directly
|
|
234
|
+
const claudeProcess = (0, child_process_1.spawn)('claude', claudeArgs, {
|
|
243
235
|
stdio: 'inherit',
|
|
244
|
-
env:
|
|
245
|
-
...env,
|
|
246
|
-
NODE_OPTIONS: `--require ${interceptorPath}`
|
|
247
|
-
}
|
|
236
|
+
env: env
|
|
248
237
|
});
|
|
249
238
|
// Handle process events
|
|
250
239
|
claudeProcess.on('close', (code) => {
|
|
251
240
|
process.exit(code || 0);
|
|
252
241
|
});
|
|
253
242
|
claudeProcess.on('error', (error) => {
|
|
254
|
-
console.error('Failed to start Claude
|
|
243
|
+
console.error('Failed to start Claude:', error);
|
|
244
|
+
console.error('Make sure Claude is installed and available in your PATH');
|
|
255
245
|
process.exit(1);
|
|
256
246
|
});
|
|
257
247
|
// Handle Ctrl+C gracefully
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAEA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/interceptor.d.ts
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unbound Code Interceptor
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* the Anthropic request format intact. Only the response is converted.
|
|
4
|
+
* No-op interceptor that just logs requests and headers for debugging.
|
|
5
|
+
* Uses environment variables to redirect Claude to Unbound gateway.
|
|
7
6
|
*/
|
|
8
7
|
import { UnboundConfig } from "./types";
|
|
9
8
|
export declare class UnboundInterceptor {
|
|
10
9
|
private config;
|
|
11
|
-
private apiKey;
|
|
12
10
|
constructor(config?: UnboundConfig);
|
|
13
11
|
setApiKey(apiKey: string): void;
|
|
14
|
-
private isAnthropicAPI;
|
|
15
|
-
private convertOpenAIToAnthropic;
|
|
16
12
|
instrumentFetch(): void;
|
|
17
13
|
instrumentAll(): void;
|
|
18
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,GAAE,aAAkB;IAQ/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,eAAe,IAAI,IAAI;IAsBvB,aAAa,IAAI,IAAI;CAG5B;AAKD,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,kBAAkB,CASvF;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,GAAG,IAAI,CAEjE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAIrD"}
|
package/dist/interceptor.js
CHANGED
|
@@ -2,21 +2,16 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Unbound Code Interceptor
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* the Anthropic request format intact. Only the response is converted.
|
|
5
|
+
* No-op interceptor that just logs requests and headers for debugging.
|
|
6
|
+
* Uses environment variables to redirect Claude to Unbound gateway.
|
|
8
7
|
*/
|
|
9
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
9
|
exports.UnboundInterceptor = void 0;
|
|
11
10
|
exports.initializeUnboundInterceptor = initializeUnboundInterceptor;
|
|
12
11
|
exports.getUnboundInterceptor = getUnboundInterceptor;
|
|
13
12
|
exports.setUnboundApiKey = setUnboundApiKey;
|
|
14
|
-
const DEFAULT_HEADERS = {
|
|
15
|
-
"X-Unbound-Metadata": JSON.stringify({ labels: [{ key: "app", value: "unbound-claude-code" }] }),
|
|
16
|
-
};
|
|
17
13
|
class UnboundInterceptor {
|
|
18
14
|
constructor(config = {}) {
|
|
19
|
-
this.apiKey = null;
|
|
20
15
|
this.config = {
|
|
21
16
|
baseUrl: "https://api.getunbound.ai/v1",
|
|
22
17
|
logLevel: "info",
|
|
@@ -24,46 +19,8 @@ class UnboundInterceptor {
|
|
|
24
19
|
};
|
|
25
20
|
}
|
|
26
21
|
setApiKey(apiKey) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
isAnthropicAPI(url) {
|
|
30
|
-
const urlString = typeof url === "string" ? url : url.toString();
|
|
31
|
-
return urlString.includes("api.anthropic.com") && urlString.includes("/v1/messages");
|
|
32
|
-
}
|
|
33
|
-
convertOpenAIToAnthropic(openAIResponse) {
|
|
34
|
-
// Convert OpenAI response format to Anthropic format
|
|
35
|
-
const content = [];
|
|
36
|
-
// Handle tool calls first
|
|
37
|
-
if (openAIResponse.choices?.[0]?.message?.tool_calls) {
|
|
38
|
-
for (const toolCall of openAIResponse.choices[0].message.tool_calls) {
|
|
39
|
-
content.push({
|
|
40
|
-
type: "tool_use",
|
|
41
|
-
id: toolCall.id,
|
|
42
|
-
name: toolCall.function?.name || "unknown",
|
|
43
|
-
input: JSON.parse(toolCall.function?.arguments || "{}")
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
// Handle text content
|
|
48
|
-
if (openAIResponse.choices?.[0]?.message?.content) {
|
|
49
|
-
content.push({
|
|
50
|
-
type: "text",
|
|
51
|
-
text: openAIResponse.choices?.[0]?.message?.content,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
return {
|
|
55
|
-
id: openAIResponse.id || `msg_${Date.now()}`,
|
|
56
|
-
type: "message",
|
|
57
|
-
role: "assistant",
|
|
58
|
-
content: content,
|
|
59
|
-
model: openAIResponse.model || "claude-sonnet-4-20250514",
|
|
60
|
-
stop_reason: openAIResponse.choices?.[0]?.finish_reason === "tool_calls" ? "tool_use" : "end_turn",
|
|
61
|
-
stop_sequence: null,
|
|
62
|
-
usage: {
|
|
63
|
-
input_tokens: openAIResponse.usage?.prompt_tokens || 0,
|
|
64
|
-
output_tokens: openAIResponse.usage?.completion_tokens || 0,
|
|
65
|
-
},
|
|
66
|
-
};
|
|
22
|
+
// No-op: API key is now handled via environment variables
|
|
23
|
+
console.log("API key set via environment variables");
|
|
67
24
|
}
|
|
68
25
|
instrumentFetch() {
|
|
69
26
|
if (!global.fetch) {
|
|
@@ -76,317 +33,8 @@ class UnboundInterceptor {
|
|
|
76
33
|
const originalFetch = global.fetch;
|
|
77
34
|
const interceptor = this;
|
|
78
35
|
global.fetch = async function (input, init = {}) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (!interceptor.isAnthropicAPI(url)) {
|
|
82
|
-
return originalFetch(input, init);
|
|
83
|
-
}
|
|
84
|
-
if (!interceptor.apiKey) {
|
|
85
|
-
throw new Error("Unbound API key not set. Please set your API key first.");
|
|
86
|
-
}
|
|
87
|
-
try {
|
|
88
|
-
// Extract Claude API key from original request headers
|
|
89
|
-
let claudeApiKey = null;
|
|
90
|
-
if (init.headers) {
|
|
91
|
-
if (init.headers instanceof Headers) {
|
|
92
|
-
claudeApiKey = init.headers.get('authorization')?.replace('Bearer ', '') || null;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
const headers = init.headers;
|
|
96
|
-
claudeApiKey = headers['authorization']?.replace('Bearer ', '') || null;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// Parse original request body (keep in Anthropic format)
|
|
100
|
-
let requestBody = {};
|
|
101
|
-
if (init.body) {
|
|
102
|
-
try {
|
|
103
|
-
requestBody = JSON.parse(init.body);
|
|
104
|
-
}
|
|
105
|
-
catch (e) {
|
|
106
|
-
return originalFetch(input, init);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// Prepare new request to Unbound API v1/messages endpoint
|
|
110
|
-
const unboundUrl = `${interceptor.config.baseUrl}/messages`;
|
|
111
|
-
// Start with original headers
|
|
112
|
-
const unboundHeaders = {};
|
|
113
|
-
// Copy original headers
|
|
114
|
-
if (init.headers) {
|
|
115
|
-
if (init.headers instanceof Headers) {
|
|
116
|
-
// Convert Headers object to plain object with lowercase keys
|
|
117
|
-
init.headers.forEach((value, key) => {
|
|
118
|
-
unboundHeaders[key.toLowerCase()] = value;
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
// Copy from plain object
|
|
123
|
-
Object.entries(init.headers).forEach(([key, value]) => {
|
|
124
|
-
// Handle both string and array of strings
|
|
125
|
-
const headerValue = Array.isArray(value) ? value.join(', ') : String(value);
|
|
126
|
-
unboundHeaders[key.toLowerCase()] = headerValue;
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// Replace Authorization with Unbound API key and add default headers
|
|
131
|
-
unboundHeaders["authorization"] = `Bearer ${interceptor.apiKey}`;
|
|
132
|
-
Object.assign(unboundHeaders, DEFAULT_HEADERS);
|
|
133
|
-
if (claudeApiKey) {
|
|
134
|
-
unboundHeaders["claude-code-key"] = claudeApiKey;
|
|
135
|
-
}
|
|
136
|
-
const newInit = {
|
|
137
|
-
...init,
|
|
138
|
-
method: "POST",
|
|
139
|
-
headers: unboundHeaders,
|
|
140
|
-
body: JSON.stringify(requestBody), // Send Anthropic format as-is
|
|
141
|
-
};
|
|
142
|
-
// Make request to Unbound API
|
|
143
|
-
const response = await originalFetch(unboundUrl, newInit);
|
|
144
|
-
if (!response.ok) {
|
|
145
|
-
const errorText = await response.text();
|
|
146
|
-
throw new Error(`Unbound API error: ${response.status} ${response.statusText} - ${errorText}`);
|
|
147
|
-
}
|
|
148
|
-
// Handle streaming response
|
|
149
|
-
if (requestBody.stream) {
|
|
150
|
-
const reader = response.body?.getReader();
|
|
151
|
-
if (!reader) {
|
|
152
|
-
throw new Error("No readable stream in response");
|
|
153
|
-
}
|
|
154
|
-
// Create a new ReadableStream that converts OpenAI chunks to Anthropic format
|
|
155
|
-
const transformedStream = new ReadableStream({
|
|
156
|
-
async start(controller) {
|
|
157
|
-
const decoder = new TextDecoder();
|
|
158
|
-
const encoder = new TextEncoder();
|
|
159
|
-
let buffer = "";
|
|
160
|
-
let hasStartedContent = false;
|
|
161
|
-
let hasStartedToolUse = false;
|
|
162
|
-
let currentToolUseIndex = 0;
|
|
163
|
-
let currentToolCall = null;
|
|
164
|
-
let messageId = `msg_${Date.now()}`;
|
|
165
|
-
let finalInputTokens = 0;
|
|
166
|
-
let finalOutputTokens = 0;
|
|
167
|
-
let pingInterval;
|
|
168
|
-
try {
|
|
169
|
-
// Send initial message_start event with proper SSE format
|
|
170
|
-
const messageStart = {
|
|
171
|
-
type: "message_start",
|
|
172
|
-
message: {
|
|
173
|
-
id: messageId,
|
|
174
|
-
type: "message",
|
|
175
|
-
role: "assistant",
|
|
176
|
-
content: [],
|
|
177
|
-
model: "claude-sonnet-4-20250514",
|
|
178
|
-
stop_reason: null,
|
|
179
|
-
stop_sequence: null,
|
|
180
|
-
usage: { input_tokens: 0, output_tokens: 0 }
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
controller.enqueue(encoder.encode(`event: message_start\ndata: ${JSON.stringify(messageStart)}\n\n`));
|
|
184
|
-
// Start periodic ping events (every 15 seconds)
|
|
185
|
-
pingInterval = setInterval(() => {
|
|
186
|
-
try {
|
|
187
|
-
const pingEvent = { type: "ping" };
|
|
188
|
-
controller.enqueue(encoder.encode(`event: ping\ndata: ${JSON.stringify(pingEvent)}\n\n`));
|
|
189
|
-
}
|
|
190
|
-
catch (error) {
|
|
191
|
-
// If enqueue fails, clear the interval to prevent memory leak
|
|
192
|
-
if (pingInterval) {
|
|
193
|
-
clearInterval(pingInterval);
|
|
194
|
-
pingInterval = undefined;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}, 15000);
|
|
198
|
-
while (true) {
|
|
199
|
-
const { done, value } = await reader.read();
|
|
200
|
-
if (done) {
|
|
201
|
-
// Clear ping interval
|
|
202
|
-
if (pingInterval) {
|
|
203
|
-
clearInterval(pingInterval);
|
|
204
|
-
}
|
|
205
|
-
// Send content_block_stop for any open tool use
|
|
206
|
-
if (hasStartedToolUse) {
|
|
207
|
-
const toolUseStop = {
|
|
208
|
-
type: "content_block_stop",
|
|
209
|
-
index: currentToolUseIndex
|
|
210
|
-
};
|
|
211
|
-
controller.enqueue(encoder.encode(`event: content_block_stop\ndata: ${JSON.stringify(toolUseStop)}\n\n`));
|
|
212
|
-
}
|
|
213
|
-
// Send content_block_stop if we started content
|
|
214
|
-
if (hasStartedContent) {
|
|
215
|
-
const contentStop = {
|
|
216
|
-
type: "content_block_stop",
|
|
217
|
-
index: currentToolUseIndex
|
|
218
|
-
};
|
|
219
|
-
controller.enqueue(encoder.encode(`event: content_block_stop\ndata: ${JSON.stringify(contentStop)}\n\n`));
|
|
220
|
-
}
|
|
221
|
-
// Send message_delta with final usage
|
|
222
|
-
const messageDelta = {
|
|
223
|
-
type: "message_delta",
|
|
224
|
-
delta: {
|
|
225
|
-
stop_reason: "end_turn",
|
|
226
|
-
stop_sequence: null
|
|
227
|
-
},
|
|
228
|
-
usage: {
|
|
229
|
-
input_tokens: finalInputTokens,
|
|
230
|
-
output_tokens: finalOutputTokens
|
|
231
|
-
}
|
|
232
|
-
};
|
|
233
|
-
controller.enqueue(encoder.encode(`event: message_delta\ndata: ${JSON.stringify(messageDelta)}\n\n`));
|
|
234
|
-
// Send message_stop
|
|
235
|
-
const messageStop = {
|
|
236
|
-
type: "message_stop"
|
|
237
|
-
};
|
|
238
|
-
controller.enqueue(encoder.encode(`event: message_stop\ndata: ${JSON.stringify(messageStop)}\n\n`));
|
|
239
|
-
break;
|
|
240
|
-
}
|
|
241
|
-
buffer += decoder.decode(value, { stream: true });
|
|
242
|
-
const lines = buffer.split("\n");
|
|
243
|
-
buffer = lines.pop() || "";
|
|
244
|
-
for (const line of lines) {
|
|
245
|
-
if (line.trim().startsWith("data: ")) {
|
|
246
|
-
const jsonPart = line.substring(6).trim();
|
|
247
|
-
if (jsonPart === "[DONE]")
|
|
248
|
-
continue;
|
|
249
|
-
try {
|
|
250
|
-
const openAIChunk = JSON.parse(jsonPart);
|
|
251
|
-
// Extract final token usage from the complete response (usually in the last chunk)
|
|
252
|
-
if (openAIChunk.usage) {
|
|
253
|
-
finalInputTokens = openAIChunk.usage.prompt_tokens || finalInputTokens;
|
|
254
|
-
finalOutputTokens = openAIChunk.usage.completion_tokens || finalOutputTokens;
|
|
255
|
-
}
|
|
256
|
-
// Handle tool calls first (they come before content)
|
|
257
|
-
if (openAIChunk.choices?.[0]?.delta?.tool_calls) {
|
|
258
|
-
const toolCall = openAIChunk.choices[0]?.delta?.tool_calls[0];
|
|
259
|
-
if (toolCall && toolCall.id && !hasStartedToolUse) {
|
|
260
|
-
// Start new tool use block - use exact ID from gateway
|
|
261
|
-
const toolId = toolCall.id;
|
|
262
|
-
currentToolCall = {
|
|
263
|
-
id: toolId,
|
|
264
|
-
name: toolCall.function?.name || "unknown",
|
|
265
|
-
input: ""
|
|
266
|
-
};
|
|
267
|
-
const toolUseStart = {
|
|
268
|
-
type: "content_block_start",
|
|
269
|
-
index: currentToolUseIndex,
|
|
270
|
-
content_block: {
|
|
271
|
-
type: "tool_use",
|
|
272
|
-
id: toolId,
|
|
273
|
-
name: currentToolCall.name,
|
|
274
|
-
input: {}
|
|
275
|
-
}
|
|
276
|
-
};
|
|
277
|
-
controller.enqueue(encoder.encode(`event: content_block_start\ndata: ${JSON.stringify(toolUseStart)}\n\n`));
|
|
278
|
-
hasStartedToolUse = true;
|
|
279
|
-
}
|
|
280
|
-
// Stream tool arguments
|
|
281
|
-
if (toolCall?.function?.arguments && currentToolCall) {
|
|
282
|
-
const argumentDelta = {
|
|
283
|
-
type: "content_block_delta",
|
|
284
|
-
index: currentToolUseIndex,
|
|
285
|
-
delta: {
|
|
286
|
-
type: "input_json_delta",
|
|
287
|
-
partial_json: toolCall.function.arguments
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
controller.enqueue(encoder.encode(`event: content_block_delta\ndata: ${JSON.stringify(argumentDelta)}\n\n`));
|
|
291
|
-
currentToolCall.input += toolCall.function.arguments;
|
|
292
|
-
}
|
|
293
|
-
// Complete tool use if done
|
|
294
|
-
if (openAIChunk.choices[0]?.finish_reason === "tool_calls" && hasStartedToolUse) {
|
|
295
|
-
const toolUseStop = {
|
|
296
|
-
type: "content_block_stop",
|
|
297
|
-
index: currentToolUseIndex
|
|
298
|
-
};
|
|
299
|
-
controller.enqueue(encoder.encode(`event: content_block_stop\ndata: ${JSON.stringify(toolUseStop)}\n\n`));
|
|
300
|
-
currentToolUseIndex++;
|
|
301
|
-
hasStartedToolUse = false;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
// Handle text content (comes after tool calls)
|
|
305
|
-
if (openAIChunk.choices?.[0]?.delta?.content) {
|
|
306
|
-
// Send content_block_start if this is the first content
|
|
307
|
-
if (!hasStartedContent) {
|
|
308
|
-
const contentStart = {
|
|
309
|
-
type: "content_block_start",
|
|
310
|
-
index: currentToolUseIndex,
|
|
311
|
-
content_block: {
|
|
312
|
-
type: "text",
|
|
313
|
-
text: ""
|
|
314
|
-
}
|
|
315
|
-
};
|
|
316
|
-
controller.enqueue(encoder.encode(`event: content_block_start\ndata: ${JSON.stringify(contentStart)}\n\n`));
|
|
317
|
-
hasStartedContent = true;
|
|
318
|
-
}
|
|
319
|
-
// Send content delta
|
|
320
|
-
const contentDelta = {
|
|
321
|
-
type: "content_block_delta",
|
|
322
|
-
index: currentToolUseIndex,
|
|
323
|
-
delta: {
|
|
324
|
-
type: "text_delta",
|
|
325
|
-
text: openAIChunk.choices[0]?.delta?.content
|
|
326
|
-
}
|
|
327
|
-
};
|
|
328
|
-
controller.enqueue(encoder.encode(`event: content_block_delta\ndata: ${JSON.stringify(contentDelta)}\n\n`));
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
catch (e) {
|
|
332
|
-
console.error("Error processing chunk:", e);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
catch (error) {
|
|
339
|
-
// Clear ping interval on error
|
|
340
|
-
if (pingInterval) {
|
|
341
|
-
clearInterval(pingInterval);
|
|
342
|
-
}
|
|
343
|
-
controller.error(error);
|
|
344
|
-
}
|
|
345
|
-
finally {
|
|
346
|
-
// Ensure ping interval is cleared
|
|
347
|
-
if (pingInterval) {
|
|
348
|
-
clearInterval(pingInterval);
|
|
349
|
-
}
|
|
350
|
-
controller.close();
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
return new Response(transformedStream, {
|
|
355
|
-
status: response.status,
|
|
356
|
-
statusText: response.statusText,
|
|
357
|
-
headers: {
|
|
358
|
-
...Object.fromEntries(response.headers.entries()),
|
|
359
|
-
"Content-Type": "text/event-stream",
|
|
360
|
-
},
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
else {
|
|
364
|
-
// Non-streaming response
|
|
365
|
-
const responseText = await response.text();
|
|
366
|
-
let unboundResponse;
|
|
367
|
-
try {
|
|
368
|
-
unboundResponse = JSON.parse(responseText);
|
|
369
|
-
}
|
|
370
|
-
catch (error) {
|
|
371
|
-
throw new Error(`Failed to parse Unbound API response: ${error instanceof Error ? error.message : 'Invalid JSON'}`);
|
|
372
|
-
}
|
|
373
|
-
// Convert OpenAI response to Anthropic format
|
|
374
|
-
const anthropicResponse = interceptor.convertOpenAIToAnthropic(unboundResponse);
|
|
375
|
-
// Return the response directly in JSON format
|
|
376
|
-
return new Response(JSON.stringify(anthropicResponse), {
|
|
377
|
-
status: response.status,
|
|
378
|
-
statusText: response.statusText,
|
|
379
|
-
headers: {
|
|
380
|
-
...Object.fromEntries(response.headers.entries()),
|
|
381
|
-
"Content-Type": "application/json",
|
|
382
|
-
},
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
catch (error) {
|
|
387
|
-
console.error("Unbound interceptor error:", error);
|
|
388
|
-
throw error;
|
|
389
|
-
}
|
|
36
|
+
// Just pass through to original fetch - no interception
|
|
37
|
+
return originalFetch(input, init);
|
|
390
38
|
};
|
|
391
39
|
// Mark fetch as instrumented
|
|
392
40
|
global.fetch.__unboundIntercepted = true;
|
package/dist/interceptor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAkDH,oEASC;AAED,sDAEC;AAED,4CAIC;AAjED,MAAa,kBAAkB;IAG9B,YAAY,SAAwB,EAAE;QACrC,IAAI,CAAC,MAAM,GAAG;YACb,OAAO,EAAE,8BAA8B;YACvC,QAAQ,EAAE,MAAM;YAChB,GAAG,MAAM;SACT,CAAC;IACH,CAAC;IAEM,SAAS,CAAC,MAAc;QAC9B,0DAA0D;QAC1D,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACtD,CAAC;IAEM,eAAe;QACrB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO;QACR,CAAC;QAED,gCAAgC;QAChC,IAAK,MAAM,CAAC,KAAa,CAAC,oBAAoB,EAAE,CAAC;YAChD,OAAO;QACR,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC;QAEzB,MAAM,CAAC,KAAK,GAAG,KAAK,WAAW,KAA6B,EAAE,OAAoB,EAAE;YACnF,wDAAwD;YACxD,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,6BAA6B;QAC5B,MAAM,CAAC,KAAa,CAAC,oBAAoB,GAAG,IAAI,CAAC;IACnD,CAAC;IAEM,aAAa;QACnB,IAAI,CAAC,eAAe,EAAE,CAAC;IACxB,CAAC;CACD;AAzCD,gDAyCC;AAED,8BAA8B;AAC9B,IAAI,iBAAiB,GAA8B,IAAI,CAAC;AAExD,SAAgB,4BAA4B,CAAC,MAAsB;IAClE,IAAI,iBAAiB,EAAE,CAAC;QACvB,OAAO,iBAAiB,CAAC;IAC1B,CAAC;IAED,iBAAiB,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,CAAC,aAAa,EAAE,CAAC;IAElC,OAAO,iBAAiB,CAAC;AAC1B,CAAC;AAED,SAAgB,qBAAqB;IACpC,OAAO,iBAAiB,CAAC;AAC1B,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAc;IAC9C,IAAI,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unbound-claude-code",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Claude Code with Unbound integration - Drop-in replacement for Claude Code with multi-provider routing and cost optimization",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
"dev": "tsc --watch --preserveWatchOutput",
|
|
12
12
|
"clean": "rm -rf dist",
|
|
13
13
|
"typecheck": "tsc --noEmit",
|
|
14
|
+
"test": "jest",
|
|
15
|
+
"test:watch": "jest --watch",
|
|
16
|
+
"test:coverage": "jest --coverage",
|
|
14
17
|
"prepare": "npm run build",
|
|
15
18
|
"prepublishOnly": "npm run clean && npm run build && npm run typecheck"
|
|
16
19
|
},
|
|
@@ -46,13 +49,17 @@
|
|
|
46
49
|
"win32"
|
|
47
50
|
],
|
|
48
51
|
"devDependencies": {
|
|
49
|
-
"@types/
|
|
52
|
+
"@types/jest": "^30.0.0",
|
|
50
53
|
"@types/node": "^20.0.0",
|
|
54
|
+
"electron-rebuild": "^3.2.9",
|
|
55
|
+
"jest": "^30.0.2",
|
|
56
|
+
"ts-jest": "^29.4.0",
|
|
51
57
|
"typescript": "^5.0.0"
|
|
52
58
|
},
|
|
53
59
|
"dependencies": {
|
|
54
60
|
"@anthropic-ai/claude-code": ">=0.1.0",
|
|
55
|
-
"keytar": "^7.9.0"
|
|
61
|
+
"keytar": "^7.9.0",
|
|
62
|
+
"rebuild": "^0.1.2"
|
|
56
63
|
},
|
|
57
64
|
"peerDependencies": {
|
|
58
65
|
"@anthropic-ai/claude-code": ">=0.1.0"
|