unbound-claude-code 0.2.1 → 0.2.3
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/auth.d.ts.map +1 -1
- package/dist/auth.js +9 -12
- package/dist/auth.js.map +1 -1
- package/dist/cli.d.ts +10 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +114 -62
- package/dist/cli.js.map +1 -1
- package/dist/interceptor.d.ts +2 -4
- package/dist/interceptor.d.ts.map +1 -1
- package/dist/interceptor.js +6 -51
- package/dist/interceptor.js.map +1 -1
- package/dist/storage.d.ts +1 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +4 -2
- package/dist/storage.js.map +1 -1
- package/package.json +1 -4
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGhD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,GAAE,MAAuC;IAK5D;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCpD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAgCtE;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAqCxC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAalC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAoBtC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CActC"}
|
package/dist/auth.js
CHANGED
|
@@ -5,9 +5,6 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.UnboundAuth = void 0;
|
|
7
7
|
const storage_1 = require("./storage");
|
|
8
|
-
const DEFAULT_HEADERS = {
|
|
9
|
-
"X-Unbound-Metadata": JSON.stringify({ labels: [{ key: "app", value: "unbound-claude-code" }] }),
|
|
10
|
-
};
|
|
11
8
|
class UnboundAuth {
|
|
12
9
|
constructor(baseUrl = "https://api.getunbound.ai/v1") {
|
|
13
10
|
this.baseUrl = baseUrl;
|
|
@@ -23,7 +20,6 @@ class UnboundAuth {
|
|
|
23
20
|
headers: {
|
|
24
21
|
"Authorization": `Bearer ${apiKey}`,
|
|
25
22
|
"Content-Type": "application/json",
|
|
26
|
-
...DEFAULT_HEADERS,
|
|
27
23
|
}
|
|
28
24
|
});
|
|
29
25
|
if (response.ok) {
|
|
@@ -57,7 +53,6 @@ class UnboundAuth {
|
|
|
57
53
|
headers: {
|
|
58
54
|
"Authorization": `Bearer ${apiKey}`,
|
|
59
55
|
"Content-Type": "application/json",
|
|
60
|
-
...DEFAULT_HEADERS,
|
|
61
56
|
}
|
|
62
57
|
});
|
|
63
58
|
if (response.ok) {
|
|
@@ -93,14 +88,21 @@ class UnboundAuth {
|
|
|
93
88
|
output: process.stdout
|
|
94
89
|
});
|
|
95
90
|
return new Promise((resolve, reject) => {
|
|
96
|
-
const askForKey = () => {
|
|
97
|
-
rl.question('Enter your Unbound API key: ', (apiKey) => {
|
|
91
|
+
const askForKey = async () => {
|
|
92
|
+
rl.question('Enter your Unbound API key: ', async (apiKey) => {
|
|
98
93
|
const trimmedKey = apiKey ? apiKey.trim() : '';
|
|
99
94
|
if (!trimmedKey || trimmedKey.length === 0) {
|
|
100
95
|
console.log('API key cannot be empty. Please try again.');
|
|
101
96
|
askForKey(); // Ask again
|
|
102
97
|
return;
|
|
103
98
|
}
|
|
99
|
+
// Validate the API key
|
|
100
|
+
const isValid = await this.verifyApiKey(trimmedKey);
|
|
101
|
+
if (!isValid) {
|
|
102
|
+
console.log('❌ Invalid API key. Please check your key and try again.');
|
|
103
|
+
askForKey(); // Ask again
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
104
106
|
rl.close();
|
|
105
107
|
resolve(trimmedKey);
|
|
106
108
|
});
|
|
@@ -129,21 +131,16 @@ class UnboundAuth {
|
|
|
129
131
|
// First try environment variable
|
|
130
132
|
const envApiKey = process.env.UNBOUND_API_KEY;
|
|
131
133
|
if (envApiKey && envApiKey.trim().length > 0) {
|
|
132
|
-
console.log('✓ Using Unbound API key from UNBOUND_API_KEY environment variable');
|
|
133
134
|
return envApiKey.trim();
|
|
134
135
|
}
|
|
135
136
|
// Then try stored API key
|
|
136
137
|
const storedApiKey = await this.storage.getApiKey();
|
|
137
138
|
if (storedApiKey) {
|
|
138
|
-
console.log('✓ Using stored Unbound API key');
|
|
139
139
|
return storedApiKey;
|
|
140
140
|
}
|
|
141
141
|
// If not found anywhere, prompt user
|
|
142
142
|
console.log('No stored API key found.');
|
|
143
143
|
const apiKey = await this.promptForApiKey();
|
|
144
|
-
// Store the API key for future use
|
|
145
|
-
await this.storage.setApiKey(apiKey);
|
|
146
|
-
console.log('✓ Unbound API key stored securely for future use');
|
|
147
144
|
return apiKey;
|
|
148
145
|
}
|
|
149
146
|
/**
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAGH,uCAA2C;AAE3C,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
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,13 @@ declare class UnboundCli {
|
|
|
15
17
|
private clearConfig;
|
|
16
18
|
private setModel;
|
|
17
19
|
private checkClaudeCode;
|
|
18
|
-
private
|
|
20
|
+
private checkAndInstallClaudeCode;
|
|
21
|
+
/**
|
|
22
|
+
* Sets up Claude configuration files to use Unbound API key
|
|
23
|
+
* Creates ~/.claude/settings.json with apiKeyHelper configuration
|
|
24
|
+
* Creates ~/.claude/anthropic_key.sh with the API key
|
|
25
|
+
*/
|
|
26
|
+
private setupClaudeConfig;
|
|
19
27
|
private authenticateUser;
|
|
20
28
|
private launchClaudeCode;
|
|
21
29
|
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;AAoBH,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;YAUf,yBAAyB;IAmBvC;;;;OAIG;YACW,iBAAiB;YAkDjB,gBAAgB;YA4DhB,gBAAgB;IAuCjB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CA8ChD;AAQD,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -3,13 +3,16 @@
|
|
|
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
13
|
const fs_1 = require("fs");
|
|
14
|
+
const path_1 = require("path");
|
|
15
|
+
const os_1 = require("os");
|
|
13
16
|
const auth_1 = require("./auth");
|
|
14
17
|
const storage_1 = require("./storage");
|
|
15
18
|
class UnboundCli {
|
|
@@ -67,7 +70,7 @@ class UnboundCli {
|
|
|
67
70
|
}
|
|
68
71
|
showHelp() {
|
|
69
72
|
console.log(`
|
|
70
|
-
Unbound Code - Claude
|
|
73
|
+
Unbound Code - Claude with Unbound AI
|
|
71
74
|
|
|
72
75
|
USAGE:
|
|
73
76
|
unbound-claude-code [OPTIONS] [CLAUDE_ARGS...]
|
|
@@ -83,8 +86,8 @@ OPTIONS:
|
|
|
83
86
|
--set-model MODEL Set default model
|
|
84
87
|
|
|
85
88
|
EXAMPLES:
|
|
86
|
-
unbound-claude-code # Start Claude
|
|
87
|
-
unbound-claude-code chat # Start in chat mode
|
|
89
|
+
unbound-claude-code # Start Claude with Unbound AI
|
|
90
|
+
unbound-claude-code chat # Start Claude in chat mode
|
|
88
91
|
unbound-claude-code --debug # Start with debug logging
|
|
89
92
|
unbound-claude-code --api-key YOUR_KEY # Set and store API key securely
|
|
90
93
|
unbound-claude-code --show-config # Show stored configuration
|
|
@@ -98,8 +101,8 @@ ENVIRONMENT VARIABLES:
|
|
|
98
101
|
SECURITY:
|
|
99
102
|
API keys are stored securely in your system's keychain only.
|
|
100
103
|
|
|
101
|
-
Claude
|
|
102
|
-
|
|
104
|
+
Claude will be launched with ANTHROPIC_BASE_URL set to https://api.getunbound.ai
|
|
105
|
+
and ANTHROPIC_API_KEY set to your Unbound API key.
|
|
103
106
|
`);
|
|
104
107
|
}
|
|
105
108
|
showVersion() {
|
|
@@ -147,12 +150,81 @@ Claude Code is bundled with Unbound Code, so no separate installation is needed.
|
|
|
147
150
|
console.log(`✓ Default model set to: ${model}`);
|
|
148
151
|
}
|
|
149
152
|
async checkClaudeCode() {
|
|
150
|
-
//
|
|
151
|
-
|
|
153
|
+
// Check if claude command is available
|
|
154
|
+
try {
|
|
155
|
+
(0, child_process_1.execSync)('which claude', { stdio: 'ignore' });
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
// Try to auto-install Claude CLI
|
|
159
|
+
await this.checkAndInstallClaudeCode();
|
|
160
|
+
}
|
|
152
161
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
162
|
+
async checkAndInstallClaudeCode() {
|
|
163
|
+
console.log('Claude CLI not found. Installing automatically...');
|
|
164
|
+
try {
|
|
165
|
+
// Attempt to install Claude CLI using npm
|
|
166
|
+
(0, child_process_1.execSync)('npm install -g @anthropic-ai/claude-code', { stdio: 'ignore' });
|
|
167
|
+
}
|
|
168
|
+
catch (installError) {
|
|
169
|
+
throw new Error('Failed to install Claude CLI automatically. Please install manually with: npm install -g @anthropic-ai/claude-code');
|
|
170
|
+
}
|
|
171
|
+
// Check if installation was successful
|
|
172
|
+
try {
|
|
173
|
+
(0, child_process_1.execSync)('which claude', { stdio: 'ignore' });
|
|
174
|
+
console.log('✓ Claude CLI installed successfully');
|
|
175
|
+
}
|
|
176
|
+
catch (checkError) {
|
|
177
|
+
throw new Error('Claude CLI installation completed but command still not found in PATH. Please restart your terminal or check your PATH configuration.');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Sets up Claude configuration files to use Unbound API key
|
|
182
|
+
* Creates ~/.claude/settings.json with apiKeyHelper configuration
|
|
183
|
+
* Creates ~/.claude/anthropic_key.sh with the API key
|
|
184
|
+
*/
|
|
185
|
+
async setupClaudeConfig(apiKey) {
|
|
186
|
+
const claudeDir = (0, path_1.join)((0, os_1.homedir)(), '.claude');
|
|
187
|
+
const settingsPath = (0, path_1.join)(claudeDir, 'settings.json');
|
|
188
|
+
const keyHelperPath = (0, path_1.join)(claudeDir, 'anthropic_key.sh');
|
|
189
|
+
try {
|
|
190
|
+
// Ensure ~/.claude directory exists
|
|
191
|
+
await fs_1.promises.mkdir(claudeDir, { recursive: true });
|
|
192
|
+
// Handle settings.json
|
|
193
|
+
let settings = {};
|
|
194
|
+
try {
|
|
195
|
+
// Check if settings.json exists
|
|
196
|
+
await fs_1.promises.access(settingsPath);
|
|
197
|
+
// File exists, read and parse it
|
|
198
|
+
const existingContent = await fs_1.promises.readFile(settingsPath, 'utf8');
|
|
199
|
+
try {
|
|
200
|
+
settings = JSON.parse(existingContent);
|
|
201
|
+
}
|
|
202
|
+
catch (parseError) {
|
|
203
|
+
// Invalid JSON, start with empty object
|
|
204
|
+
console.log('Warning: ~/.claude/settings.json contains invalid JSON, creating new configuration');
|
|
205
|
+
settings = {};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (accessError) {
|
|
209
|
+
// File doesn't exist, we'll create it with empty object
|
|
210
|
+
settings = {};
|
|
211
|
+
}
|
|
212
|
+
// Add/update apiKeyHelper configuration
|
|
213
|
+
settings.apiKeyHelper = '~/.claude/anthropic_key.sh';
|
|
214
|
+
// Write updated settings.json
|
|
215
|
+
await fs_1.promises.writeFile(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
|
|
216
|
+
// Create anthropic_key.sh with the API key
|
|
217
|
+
await fs_1.promises.writeFile(keyHelperPath, `echo ${apiKey}`, 'utf8');
|
|
218
|
+
// Make anthropic_key.sh executable (equivalent to chmod +x)
|
|
219
|
+
const stats = await fs_1.promises.stat(keyHelperPath);
|
|
220
|
+
await fs_1.promises.chmod(keyHelperPath, stats.mode | 0o111);
|
|
221
|
+
console.log('✓ Claude configuration updated successfully');
|
|
222
|
+
console.log(` - Settings: ${settingsPath}`);
|
|
223
|
+
console.log(` - API Key Helper: ${keyHelperPath}`);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
throw new Error(`Failed to setup Claude configuration: ${error.message}`);
|
|
227
|
+
}
|
|
156
228
|
}
|
|
157
229
|
async authenticateUser(options) {
|
|
158
230
|
if (options.skipAuth) {
|
|
@@ -169,28 +241,18 @@ Claude Code is bundled with Unbound Code, so no separate installation is needed.
|
|
|
169
241
|
if (!isValid) {
|
|
170
242
|
throw new Error('Provided API key is invalid');
|
|
171
243
|
}
|
|
172
|
-
console.log('✓ API key verified
|
|
173
|
-
// Store the API key for future use
|
|
174
|
-
await this.storage.setApiKey(options.apiKey);
|
|
244
|
+
console.log('✓ API key verified and stored securely');
|
|
245
|
+
// Store the API key for future use (suppress duplicate message)
|
|
246
|
+
await this.storage.setApiKey(options.apiKey, true);
|
|
175
247
|
return options.apiKey;
|
|
176
248
|
}
|
|
177
249
|
// Check if we have a stored API key first
|
|
178
250
|
const storedApiKey = await this.storage.getApiKey();
|
|
179
251
|
if (storedApiKey) {
|
|
180
252
|
console.log('Using stored API key...');
|
|
181
|
-
console.log('Verifying stored API key...');
|
|
182
253
|
const isValid = await this.auth.verifyApiKey(storedApiKey);
|
|
183
254
|
if (isValid) {
|
|
184
|
-
console.log('✓
|
|
185
|
-
// Show available models
|
|
186
|
-
const models = await this.auth.getModels(storedApiKey);
|
|
187
|
-
if (models && models.data && Array.isArray(models.data) && models.data.length > 0) {
|
|
188
|
-
const modelNames = models.data
|
|
189
|
-
.filter(m => m && m.id)
|
|
190
|
-
.slice(0, 5)
|
|
191
|
-
.map(m => m.id.includes('/') ? m.id.split('/').pop() : m.id)
|
|
192
|
-
.join(', ');
|
|
193
|
-
}
|
|
255
|
+
console.log('✓ API key verified successfully');
|
|
194
256
|
return storedApiKey;
|
|
195
257
|
}
|
|
196
258
|
else {
|
|
@@ -198,60 +260,48 @@ Claude Code is bundled with Unbound Code, so no separate installation is needed.
|
|
|
198
260
|
await this.storage.clearConfig();
|
|
199
261
|
}
|
|
200
262
|
}
|
|
201
|
-
// Get API key (from env or prompt)
|
|
263
|
+
// Get API key (from env or prompt) - verification happens during prompt if needed
|
|
202
264
|
const apiKey = await this.auth.getApiKeyOnly();
|
|
203
|
-
|
|
204
|
-
const
|
|
205
|
-
if (
|
|
206
|
-
|
|
265
|
+
// Only verify if key came from environment (prompt already verifies)
|
|
266
|
+
const envApiKey = process.env.UNBOUND_API_KEY;
|
|
267
|
+
if (envApiKey && envApiKey.trim() === apiKey) {
|
|
268
|
+
console.log('Using API key from UNBOUND_API_KEY environment variable...');
|
|
269
|
+
console.log('Verifying API key...');
|
|
270
|
+
const isValid = await this.auth.verifyApiKey(apiKey);
|
|
271
|
+
if (!isValid) {
|
|
272
|
+
throw new Error('Invalid API key. Please check your Unbound API key and try again.');
|
|
273
|
+
}
|
|
274
|
+
console.log('✓ API key verified and stored securely');
|
|
207
275
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
await this.storage.setApiKey(apiKey);
|
|
211
|
-
// Show available models
|
|
212
|
-
const models = await this.auth.getModels(apiKey);
|
|
213
|
-
if (models && models.data && Array.isArray(models.data) && models.data.length > 0) {
|
|
214
|
-
const modelNames = models.data
|
|
215
|
-
.filter(m => m && m.id)
|
|
216
|
-
.slice(0, 5)
|
|
217
|
-
.map(m => m.id.includes('/') ? m.id.split('/').pop() : m.id)
|
|
218
|
-
.join(', ');
|
|
276
|
+
else {
|
|
277
|
+
console.log('✓ API key verified and stored securely');
|
|
219
278
|
}
|
|
279
|
+
// Store the API key for future use (suppress duplicate message)
|
|
280
|
+
await this.storage.setApiKey(apiKey, true);
|
|
220
281
|
return apiKey;
|
|
221
282
|
}
|
|
222
283
|
async launchClaudeCode(apiKey, claudeArgs, debug) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
throw new Error(`Interceptor not found at: ${interceptorPath}`);
|
|
226
|
-
}
|
|
227
|
-
// Set environment variables
|
|
284
|
+
// Set environment variables to redirect Claude to Unbound gateway
|
|
285
|
+
// Don't set ANTHROPIC_API_KEY in env to avoid the confirmation prompt, api key is set in anthropic_key.sh
|
|
228
286
|
const env = {
|
|
229
287
|
...process.env,
|
|
230
|
-
|
|
288
|
+
ANTHROPIC_BASE_URL: "https://api.getunbound.ai",
|
|
231
289
|
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
290
|
};
|
|
235
|
-
console.log('Starting Claude
|
|
291
|
+
console.log('Starting Claude with Unbound AI gateway...');
|
|
236
292
|
console.log('');
|
|
237
|
-
//
|
|
238
|
-
const
|
|
239
|
-
'@anthropic-ai/claude-code',
|
|
240
|
-
...claudeArgs
|
|
241
|
-
];
|
|
242
|
-
const claudeProcess = (0, child_process_1.spawn)('npx', spawnArgs, {
|
|
293
|
+
// Launch claude directly - it will use the API key from the helper script we set up
|
|
294
|
+
const claudeProcess = (0, child_process_1.spawn)('claude', claudeArgs, {
|
|
243
295
|
stdio: 'inherit',
|
|
244
|
-
env:
|
|
245
|
-
...env,
|
|
246
|
-
NODE_OPTIONS: `--require ${interceptorPath}`
|
|
247
|
-
}
|
|
296
|
+
env: env
|
|
248
297
|
});
|
|
249
298
|
// Handle process events
|
|
250
299
|
claudeProcess.on('close', (code) => {
|
|
251
300
|
process.exit(code || 0);
|
|
252
301
|
});
|
|
253
302
|
claudeProcess.on('error', (error) => {
|
|
254
|
-
console.error('Failed to start Claude
|
|
303
|
+
console.error('Failed to start Claude:', error);
|
|
304
|
+
console.error('Make sure Claude is installed and available in your PATH');
|
|
255
305
|
process.exit(1);
|
|
256
306
|
});
|
|
257
307
|
// Handle Ctrl+C gracefully
|
|
@@ -289,6 +339,8 @@ Claude Code is bundled with Unbound Code, so no separate installation is needed.
|
|
|
289
339
|
await this.checkClaudeCode();
|
|
290
340
|
// Authenticate user
|
|
291
341
|
const apiKey = await this.authenticateUser(options);
|
|
342
|
+
// Setup Claude configuration files
|
|
343
|
+
await this.setupClaudeConfig(apiKey);
|
|
292
344
|
// Launch Claude Code with interceptor
|
|
293
345
|
await this.launchClaudeCode(apiKey, claudeArgs, options.debug || false);
|
|
294
346
|
}
|
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,16 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unbound Code Interceptor
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* No-op interceptor that just logs requests and headers for debugging.
|
|
5
|
+
* Uses environment variables to redirect Claude to Unbound gateway.
|
|
6
6
|
*/
|
|
7
7
|
import { UnboundConfig } from "./types";
|
|
8
8
|
export declare class UnboundInterceptor {
|
|
9
9
|
private config;
|
|
10
|
-
private apiKey;
|
|
11
10
|
constructor(config?: UnboundConfig);
|
|
12
11
|
setApiKey(apiKey: string): void;
|
|
13
|
-
private isAnthropicAPI;
|
|
14
12
|
instrumentFetch(): void;
|
|
15
13
|
instrumentAll(): void;
|
|
16
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
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,20 +2,16 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Unbound Code Interceptor
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* No-op interceptor that just logs requests and headers for debugging.
|
|
6
|
+
* Uses environment variables to redirect Claude to Unbound gateway.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.UnboundInterceptor = void 0;
|
|
10
10
|
exports.initializeUnboundInterceptor = initializeUnboundInterceptor;
|
|
11
11
|
exports.getUnboundInterceptor = getUnboundInterceptor;
|
|
12
12
|
exports.setUnboundApiKey = setUnboundApiKey;
|
|
13
|
-
const DEFAULT_HEADERS = {
|
|
14
|
-
"X-Unbound-Metadata": JSON.stringify({ labels: [{ key: "app", value: "unbound-claude-code" }] }),
|
|
15
|
-
};
|
|
16
13
|
class UnboundInterceptor {
|
|
17
14
|
constructor(config = {}) {
|
|
18
|
-
this.apiKey = null;
|
|
19
15
|
this.config = {
|
|
20
16
|
baseUrl: "https://api.getunbound.ai/v1",
|
|
21
17
|
logLevel: "info",
|
|
@@ -23,11 +19,8 @@ class UnboundInterceptor {
|
|
|
23
19
|
};
|
|
24
20
|
}
|
|
25
21
|
setApiKey(apiKey) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
isAnthropicAPI(url) {
|
|
29
|
-
const urlString = typeof url === "string" ? url : url.toString();
|
|
30
|
-
return urlString.includes("api.anthropic.com") && urlString.includes("/v1/messages");
|
|
22
|
+
// No-op: API key is now handled via environment variables
|
|
23
|
+
console.log("API key set via environment variables");
|
|
31
24
|
}
|
|
32
25
|
instrumentFetch() {
|
|
33
26
|
if (!global.fetch) {
|
|
@@ -40,46 +33,8 @@ class UnboundInterceptor {
|
|
|
40
33
|
const originalFetch = global.fetch;
|
|
41
34
|
const interceptor = this;
|
|
42
35
|
global.fetch = async function (input, init = {}) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (!interceptor.isAnthropicAPI(url)) {
|
|
46
|
-
return originalFetch(input, init);
|
|
47
|
-
}
|
|
48
|
-
if (!interceptor.apiKey) {
|
|
49
|
-
throw new Error("Unbound API key not set. Please set your API key first.");
|
|
50
|
-
}
|
|
51
|
-
try {
|
|
52
|
-
// Redirect URL to Unbound gateway
|
|
53
|
-
const unboundUrl = `${interceptor.config.baseUrl}/messages`;
|
|
54
|
-
// Copy all original headers
|
|
55
|
-
const unboundHeaders = {};
|
|
56
|
-
if (init.headers) {
|
|
57
|
-
if (init.headers instanceof Headers) {
|
|
58
|
-
init.headers.forEach((value, key) => {
|
|
59
|
-
unboundHeaders[key.toLowerCase()] = value;
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
Object.entries(init.headers).forEach(([key, value]) => {
|
|
64
|
-
const headerValue = Array.isArray(value) ? value.join(', ') : String(value);
|
|
65
|
-
unboundHeaders[key.toLowerCase()] = headerValue;
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
// Replace Authorization with Unbound API key and add metadata
|
|
70
|
-
unboundHeaders["authorization"] = `Bearer ${interceptor.apiKey}`;
|
|
71
|
-
Object.assign(unboundHeaders, DEFAULT_HEADERS);
|
|
72
|
-
const newInit = {
|
|
73
|
-
...init,
|
|
74
|
-
headers: unboundHeaders,
|
|
75
|
-
};
|
|
76
|
-
// Direct passthrough - gateway handles everything
|
|
77
|
-
return originalFetch(unboundUrl, newInit);
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
console.error("Unbound interceptor error:", error);
|
|
81
|
-
throw error;
|
|
82
|
-
}
|
|
36
|
+
// Just pass through to original fetch - no interception
|
|
37
|
+
return originalFetch(input, init);
|
|
83
38
|
};
|
|
84
39
|
// Mark fetch as instrumented
|
|
85
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":";AAAA;;;;;GAKG;;;
|
|
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/dist/storage.d.ts
CHANGED
package/dist/storage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAa;;IAM1C;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAa;;IAM1C;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAevE;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAezC;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B;;OAEG;IACH,aAAa,IAAI,aAAa;IAQ9B;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAKnD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBlC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAKnC;;OAEG;IACH,aAAa,IAAI,OAAO;CAKzB"}
|
package/dist/storage.js
CHANGED
|
@@ -24,13 +24,15 @@ class UnboundStorage {
|
|
|
24
24
|
/**
|
|
25
25
|
* Store API key in keychain only
|
|
26
26
|
*/
|
|
27
|
-
async setApiKey(apiKey) {
|
|
27
|
+
async setApiKey(apiKey, silent = false) {
|
|
28
28
|
if (!keytar) {
|
|
29
29
|
throw new Error('keytar not available. Cannot store API key securely.');
|
|
30
30
|
}
|
|
31
31
|
try {
|
|
32
32
|
await keytar.setPassword(this.SERVICE_NAME, this.ACCOUNT_NAME, apiKey);
|
|
33
|
-
|
|
33
|
+
if (!silent) {
|
|
34
|
+
console.log('✓ API key stored securely in system keychain');
|
|
35
|
+
}
|
|
34
36
|
}
|
|
35
37
|
catch (error) {
|
|
36
38
|
throw new Error(`Failed to store API key in keychain: ${error}`);
|
package/dist/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,yCAAyC;AACzC,IAAI,MAAM,GAAQ,IAAI,CAAC;AACvB,IAAI,CAAC;IACH,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,uBAAuB;IACvB,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;AACtE,CAAC;AASD,MAAa,cAAc;IAIzB;QAHiB,iBAAY,GAAG,qBAAqB,CAAC;QACrC,iBAAY,GAAG,SAAS,CAAC;QAGxC,gDAAgD;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,MAAc;
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unbound-claude-code",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
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": {
|
|
@@ -60,8 +60,5 @@
|
|
|
60
60
|
"@anthropic-ai/claude-code": ">=0.1.0",
|
|
61
61
|
"keytar": "^7.9.0",
|
|
62
62
|
"rebuild": "^0.1.2"
|
|
63
|
-
},
|
|
64
|
-
"peerDependencies": {
|
|
65
|
-
"@anthropic-ai/claude-code": ">=0.1.0"
|
|
66
63
|
}
|
|
67
64
|
}
|