useclaudeproxy 3.3.0 → 3.4.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/README.md CHANGED
@@ -78,6 +78,8 @@ differ only in how they authenticate upstream.
78
78
  browser login, then auto-refreshes the token.
79
79
  - **`opencode`** — authenticates against `https://opencode.ai/zen/v1` with a key
80
80
  (no device flow). Tokens persist in `data/opencode-tokens.json`.
81
+ - **`cline`** — Cline (cline.bot) WorkOS device flow. Completes a browser login,
82
+ then auto-refreshes the token. Tokens persist in `data/cline-tokens.json`.
81
83
  - **`custom`** — point the proxy at any OpenAI-compatible API. No login: supply
82
84
  `--url`, `--api`, and `--model`; the given key is sent as a `Bearer` header
83
85
  upstream. Token persists in `data/custom-tokens.json`.
@@ -92,6 +94,9 @@ useclaudeproxy --provider custom \
92
94
  --url http://1.1.1.1:20128/v1 \
93
95
  --api sk-123123123 \
94
96
  --model XX
97
+
98
+ # Use the cline provider (WorkOS device flow):
99
+ useclaudeproxy --provider cline --model deepseek/deepseek-v4-flash
95
100
  ```
96
101
 
97
102
  On success the CLI prints the env vars to point Claude Code at the local proxy:
@@ -109,11 +114,14 @@ These work in **any position** — before or after the command.
109
114
  | Flag | Default | Notes |
110
115
  | ------------------- | ------------ | ------------------------------------------------------------- |
111
116
  | `--model <model>` | _(required)_ | Model name to expose in OpenAI compatibility. |
112
- | `--provider <name>` | `hermes` | OAuth provider to use (`hermes` \| `opencode` \| `custom`). |
117
+ | `--provider <name>` | `hermes` | OAuth provider to use (`hermes` \| `opencode` \| `cline` \| `custom`). |
113
118
  | `--url <url>` | `""` | OpenAI-compatible API base URL (required when `custom`). |
114
119
  | `--api <key>` | `""` | API key for the custom API (required when `custom`). |
115
120
  | `--data-dir <dir>` | `data` | Token storage directory. |
116
121
  | `--proxy <url>` | `""` | CLIProxyAPI outbound proxy (`""`\|`direct`\|`none` to clear). |
122
+ | `--host <host>` | `127.0.0.1` | Host to bind in `tools/config.yaml`. |
123
+ | `--cli-key <key>` | `456789` | API key to register in config `api-keys`. |
124
+ | `--port <port>` | `2096` | Port to bind in `tools/config.yaml`. |
117
125
  | `--force` | `false` | Re-download the binary even if already installed. |
118
126
  | `--renew` | `false` | Re-extract from the kept archive and re-run the device flow. |
119
127
 
@@ -135,9 +143,9 @@ useclaudeproxy --renew
135
143
  - Two independent "proxy" concepts: the TS app's OAuth calls can use an outbound
136
144
  proxy (`--proxy`), and the binary has its own separate `proxy-url` for upstream
137
145
  provider traffic. They do not affect each other.
138
- - Providers are pluggable. `hermes` and `opencode` are registered in
139
- `src/providers/index.ts`; add another by implementing `BaseProvider` in
140
- `src/providers/`.
146
+ - Providers are pluggable. `hermes`, `opencode`, `cline`, and `custom` are
147
+ registered in `src/providers/index.ts`; add another by implementing
148
+ `BaseProvider` in `src/providers/`.
141
149
 
142
150
  ## License
143
151
 
package/dist/app.js CHANGED
@@ -10,7 +10,7 @@ export async function app() {
10
10
  await ensureCliProxy();
11
11
  if (args.renew)
12
12
  process.exit(0);
13
- provider.initConfig();
13
+ await provider.initConfig();
14
14
  provider.logConfigInfo();
15
15
  runCliProxy()
16
16
  .then((code) => process.exit(code))
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,GAAG,GAAG,KAAK,CAAC,sBAAsB,CAAC,CAAC;AAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,MAAM,QAAQ,GAAiB,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAEhE,MAAM,cAAc,EAAE,CAAC;IAEvB,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhC,QAAQ,CAAC,UAAU,EAAE,CAAC;IAEtB,QAAQ,CAAC,aAAa,EAAE,CAAC;IAEzB,WAAW,EAAE;SACV,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,QAAQ,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;QACjD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,GAAG,GAAG,KAAK,CAAC,sBAAsB,CAAC,CAAC;AAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,MAAM,QAAQ,GAAiB,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAEhE,MAAM,cAAc,EAAE,CAAC;IAEvB,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAE5B,QAAQ,CAAC,aAAa,EAAE,CAAC;IAEzB,WAAW,EAAE;SACV,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,QAAQ,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;QACjD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { BaseProvider } from "./base-provider.ts";
2
+ type TokenResponse = {
3
+ access_token: string;
4
+ refresh_token?: string;
5
+ token_type?: string;
6
+ expires_in?: number;
7
+ user?: Record<string, unknown>;
8
+ authentication_method?: string;
9
+ };
10
+ export declare class ClineProvider extends BaseProvider {
11
+ readonly name = "cline";
12
+ readonly baseUrl = "https://api.cline.bot/api/v1";
13
+ readonly tokenPath: string;
14
+ private readonly client;
15
+ initConfig(): Promise<void>;
16
+ getValidToken(): Promise<TokenResponse>;
17
+ startTokenWatcher(signal?: AbortSignal): Promise<void>;
18
+ private runDeviceFlow;
19
+ saveTokens(token: TokenResponse): void;
20
+ }
21
+ export declare const clineProvider: ClineProvider;
22
+ export {};
23
+ //# sourceMappingURL=cline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.d.ts","sourceRoot":"","sources":["../../src/providers/cline.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAoBlD,KAAK,aAAa,GAAG;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAiKF,qBAAa,aAAc,SAAQ,YAAY;IAC7C,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,OAAO,kCAAkC;IAClD,QAAQ,CAAC,SAAS,SAAmD;IACrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IAEhD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAwChC;IAEK,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,CAwB5C;IAEK,iBAAiB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3D;YAEa,aAAa;IAqBlB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAG9C;CACF;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,229 @@
1
+ import Debug from "debug";
2
+ import crypto from "node:crypto";
3
+ import path from "node:path";
4
+ import open from "open";
5
+ import { args } from "../args.js";
6
+ import { readConfig, writeConfig } from "../config-yaml.js";
7
+ import { config } from "../config.js";
8
+ import { createOAuthHttpClient } from "../http-client.js";
9
+ import { AccessDeniedError } from "../types.js";
10
+ import { sleep } from "../utils.js";
11
+ import { BaseProvider } from "./base-provider.js";
12
+ const log = Debug("useclaudeproxy:cline");
13
+ const errorLog = Debug("useclaudeproxy:cline:error");
14
+ const WATCH_INTERVAL_MS = 7000;
15
+ const FORM_HEADERS = {
16
+ "Content-Type": "application/x-www-form-urlencoded",
17
+ Accept: "application/json",
18
+ };
19
+ class OAuthHttpError extends Error {
20
+ statusCode;
21
+ body;
22
+ constructor(message, statusCode, body) {
23
+ super(message);
24
+ this.statusCode = statusCode;
25
+ this.body = body;
26
+ this.name = "OAuthHttpError";
27
+ }
28
+ }
29
+ class DeviceCodeExpiredError extends Error {
30
+ constructor() {
31
+ super("Device code expired before authorization completed");
32
+ this.name = "DeviceCodeExpiredError";
33
+ }
34
+ }
35
+ class ClineDeviceFlowClient {
36
+ http;
37
+ OAUTH = {
38
+ deviceCodeUrl: "https://api.workos.com/user_management/authorize/device",
39
+ authenticateUrl: "https://api.workos.com/user_management/authenticate",
40
+ clientId: "client_01K3A541FN8TA3EPPHTD2325AR",
41
+ grantType: "urn:ietf:params:oauth:grant-type:device_code",
42
+ verifyUrl: "https://api.cline.bot/api/v1/users/me/remote-config",
43
+ };
44
+ pollIntervalMs = 7000;
45
+ constructor(http = createOAuthHttpClient()) {
46
+ this.http = http;
47
+ }
48
+ async requestDeviceCode() {
49
+ log("Requesting device code");
50
+ const response = await this.http.post(this.OAUTH.deviceCodeUrl, {
51
+ headers: FORM_HEADERS,
52
+ body: `client_id=${this.OAUTH.clientId}`,
53
+ });
54
+ const deviceCode = this.parseOrThrow(response, "Failed to get device code");
55
+ this.pollIntervalMs = (deviceCode.interval || 7) * 1000;
56
+ return deviceCode;
57
+ }
58
+ async pollForToken(deviceCode) {
59
+ log("Polling for token");
60
+ while (true) {
61
+ await sleep(this.pollIntervalMs);
62
+ const response = await this.http.post(this.OAUTH.authenticateUrl, {
63
+ headers: FORM_HEADERS,
64
+ body: `grant_type=${encodeURIComponent(this.OAUTH.grantType)}&device_code=${deviceCode}&client_id=${this.OAUTH.clientId}`,
65
+ });
66
+ if (response.statusCode === 200) {
67
+ const data = parseBody(response);
68
+ data.access_token = `workos:${data.access_token}`;
69
+ return data;
70
+ }
71
+ if (response.statusCode === 400) {
72
+ this.handlePollingError(parseBody(response));
73
+ continue;
74
+ }
75
+ throw new OAuthHttpError(`Unexpected status during polling: ${response.statusCode}`, response.statusCode, response.body);
76
+ }
77
+ }
78
+ async refreshToken(refreshToken) {
79
+ log("Refreshing access token");
80
+ const response = await this.http.post(this.OAUTH.authenticateUrl, {
81
+ headers: FORM_HEADERS,
82
+ body: `grant_type=refresh_token&client_id=${this.OAUTH.clientId}&refresh_token=${refreshToken}`,
83
+ });
84
+ const data = this.parseOrThrow(response, "Failed to refresh token");
85
+ data.access_token = `workos:${data.access_token}`;
86
+ return data;
87
+ }
88
+ async fetchAccountInfo(accessToken) {
89
+ log("Verifying access token");
90
+ const response = await this.http.get(this.OAUTH.verifyUrl, {
91
+ headers: {
92
+ Authorization: `Bearer ${accessToken}`,
93
+ Accept: "*/*",
94
+ "User-Agent": "Bun/1.3.13",
95
+ },
96
+ });
97
+ const parsed = this.parseOrThrow(response, "Failed to verify access token");
98
+ if (!parsed.success) {
99
+ throw new OAuthHttpError("Access token invalid (remote-config success=false)", response.statusCode, parsed);
100
+ }
101
+ return parsed;
102
+ }
103
+ handlePollingError(error) {
104
+ switch (error.error) {
105
+ case "authorization_pending":
106
+ case "slow_down":
107
+ return;
108
+ case "expired_token":
109
+ throw new DeviceCodeExpiredError();
110
+ case "access_denied":
111
+ throw new AccessDeniedError();
112
+ default:
113
+ throw new OAuthHttpError(`Unexpected polling error: ${error.error}`, 400, error);
114
+ }
115
+ }
116
+ parseOrThrow(response, failureMessage) {
117
+ if (response.statusCode !== 200) {
118
+ throw new OAuthHttpError(failureMessage, response.statusCode, response.body);
119
+ }
120
+ return parseBody(response);
121
+ }
122
+ }
123
+ function parseBody(response) {
124
+ return typeof response.body === "string"
125
+ ? JSON.parse(response.body)
126
+ : response.body;
127
+ }
128
+ function generateTaskId() {
129
+ return `${Date.now()}_${crypto.randomBytes(3).toString("hex")}`;
130
+ }
131
+ export class ClineProvider extends BaseProvider {
132
+ name = "cline";
133
+ baseUrl = "https://api.cline.bot/api/v1";
134
+ tokenPath = path.join(config.DATA_DIR, "cline-tokens.json");
135
+ client = new ClineDeviceFlowClient();
136
+ async initConfig() {
137
+ const cfg = readConfig();
138
+ cfg["host"] = args.host;
139
+ cfg["port"] = args.port;
140
+ cfg["api-keys"] = [args.cliKey];
141
+ cfg["openai-compatibility"] = [{ name: this.name }];
142
+ const api = cfg["openai-compatibility"][0];
143
+ api["base-url"] = this.baseUrl;
144
+ api["models"] = [
145
+ { name: args.model, alias: "claude-opus-5" },
146
+ { name: args.model, alias: "" },
147
+ ];
148
+ api["headers"] = {
149
+ "Content-Type": "application/json",
150
+ "Http-Referer": "https://cline.bot",
151
+ "User-Agent": "Cline/4.1.16 ai-sdk/openai-compatible/3.0.30 ai-sdk/provider-utils/5.0.27 runtime/node.js/v24.18.1",
152
+ "X-Client-Type": "VSCode Extension",
153
+ "X-Client-Version": "4.1.16",
154
+ "X-Core-Version": "0.0.79",
155
+ "X-Is-Multiroot": "true",
156
+ "X-Platform": "Visual Studio Code",
157
+ "X-Platform-Version": "1.135.0",
158
+ "X-Task-Id": generateTaskId(),
159
+ "X-Title": "Cline",
160
+ Accept: "*/*",
161
+ "Accept-Language": "*",
162
+ "Sec-Fetch-Mode": "cors",
163
+ "Accept-Encoding": "gzip, deflate, br",
164
+ };
165
+ api["disable-cooling"] = true;
166
+ const token = await this.getValidToken();
167
+ this.setApiKey(token.access_token);
168
+ writeConfig(cfg);
169
+ }
170
+ async getValidToken() {
171
+ const stored = this.readStoredToken();
172
+ if (stored) {
173
+ try {
174
+ await this.client.fetchAccountInfo(stored.access_token);
175
+ log("Stored token valid");
176
+ return stored;
177
+ }
178
+ catch (err) {
179
+ errorLog("Stored Access-Token invalid: %o", err);
180
+ }
181
+ if (stored.refresh_token) {
182
+ try {
183
+ log("Refreshing stored token");
184
+ const refreshed = await this.client.refreshToken(stored.refresh_token);
185
+ this.saveTokens(refreshed);
186
+ return refreshed;
187
+ }
188
+ catch (err) {
189
+ errorLog("Stored Refresh-Token invalid: %o", err);
190
+ }
191
+ }
192
+ }
193
+ return this.runDeviceFlow();
194
+ }
195
+ async startTokenWatcher(signal) {
196
+ log("Watching token every %dms", WATCH_INTERVAL_MS);
197
+ let current = (await this.getValidToken()).access_token;
198
+ while (!signal?.aborted) {
199
+ try {
200
+ await this.client.fetchAccountInfo(current);
201
+ log("Token valid");
202
+ }
203
+ catch (err) {
204
+ errorLog("Token invalid, renewing: %o", err);
205
+ const refreshed = await this.getValidToken();
206
+ current = refreshed.access_token;
207
+ log("Token RENEWED");
208
+ }
209
+ await sleep(WATCH_INTERVAL_MS, signal);
210
+ }
211
+ }
212
+ async runDeviceFlow() {
213
+ const deviceCode = await this.client.requestDeviceCode();
214
+ log("Device code received: user_code=%s", deviceCode.user_code);
215
+ const verificationUrl = deviceCode.verification_uri_complete ?? deviceCode.verification_uri;
216
+ await open(verificationUrl).catch((err) => log("Failed to open browser: %o", err));
217
+ console.log(`Opened ${verificationUrl}. If it didn't open, enter code ${deviceCode.user_code} there.`);
218
+ const token = await this.client.pollForToken(deviceCode.device_code);
219
+ log("Authorization successful");
220
+ this.saveTokens(token);
221
+ return token;
222
+ }
223
+ saveTokens(token) {
224
+ super.saveTokens(token);
225
+ this.setApiKey(token.access_token);
226
+ }
227
+ }
228
+ export const clineProvider = new ClineProvider();
229
+ //# sourceMappingURL=cline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.js","sourceRoot":"","sources":["../../src/providers/cline.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAQtD;AAED,eAAO,MAAM,cAAc,UAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAavD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAQtD;AAED,eAAO,MAAM,cAAc,UAAuB,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import { hermesProvider } from "./hermes.js";
2
2
  import { openCodeProvider } from "./opencode.js";
3
3
  import { customProvider } from "./custom.js";
4
+ import { clineProvider } from "./cline.js";
4
5
  const registry = new Map([
5
6
  ["hermes", hermesProvider],
6
7
  ["opencode", openCodeProvider],
8
+ ["cline", clineProvider],
7
9
  ["custom", customProvider],
8
10
  ]);
9
11
  export function getProvider(name) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAuB;IAC7C,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC1B,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAC9B,CAAC,QAAQ,EAAE,cAAc,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,kBAAkB,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7E,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAuB;IAC7C,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC1B,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAC9B,CAAC,OAAO,EAAE,aAAa,CAAC;IACxB,CAAC,QAAQ,EAAE,cAAc,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,kBAAkB,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7E,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "useclaudeproxy",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "author": "maanimeisam",
5
5
  "description": "useclaudeproxy — OAuth device-flow CLI that authenticates the Hermes CLI and runs CLIProxyAPI as a local OpenAI/Claude/Gemini/Codex proxy.",
6
6
  "main": "./dist/index.js",