useclaudeproxy 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -3
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +5 -4
- package/dist/app.js.map +1 -1
- package/dist/args.d.ts +0 -2
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +14 -8
- package/dist/args.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -4
- package/dist/config.js.map +1 -1
- package/dist/install-cli-proxy.d.ts.map +1 -1
- package/dist/install-cli-proxy.js +1 -2
- package/dist/install-cli-proxy.js.map +1 -1
- package/dist/providers/base-provider.d.ts +14 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +57 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/hermes.d.ts +5 -8
- package/dist/providers/hermes.d.ts.map +1 -1
- package/dist/providers/hermes.js +55 -104
- package/dist/providers/hermes.js.map +1 -1
- package/dist/providers/index.d.ts +2 -3
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +5 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/opencode.d.ts +17 -0
- package/dist/providers/opencode.d.ts.map +1 -0
- package/dist/providers/opencode.js +125 -0
- package/dist/providers/opencode.js.map +1 -0
- package/dist/providers/types.d.ts +1 -7
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/run-cli-proxy.d.ts.map +1 -1
- package/dist/run-cli-proxy.js +3 -1
- package/dist/run-cli-proxy.js.map +1 -1
- package/dist/utils.d.ts +2 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +12 -0
- package/dist/utils.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -71,6 +71,21 @@ useclaudeproxy --model stealth/ox-alpha
|
|
|
71
71
|
useclaudeproxy --proxy http://127.0.0.1:2080 --model stealth/ox-alpha
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
+
### Providers
|
|
75
|
+
|
|
76
|
+
Two providers are built in. Both expose the same local proxy endpoint — they
|
|
77
|
+
differ only in how they authenticate upstream.
|
|
78
|
+
|
|
79
|
+
- **`hermes`** (default) — Nous Research OAuth 2.0 device flow. Completes a
|
|
80
|
+
browser login, then auto-refreshes the token.
|
|
81
|
+
- **`opencode`** — authenticates against `https://opencode.ai/zen/v1` with a key
|
|
82
|
+
(no device flow). Tokens persist in `data/opencode-tokens.json`.
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# Use the opencode provider, routing its upstream traffic through a proxy:
|
|
86
|
+
useclaudeproxy --proxy http://127.0.0.1:2080 --provider opencode --model hy3-free
|
|
87
|
+
```
|
|
88
|
+
|
|
74
89
|
On success the CLI prints the env vars to point Claude Code at the local proxy:
|
|
75
90
|
|
|
76
91
|
```bash
|
|
@@ -86,7 +101,7 @@ These work in **any position** — before or after the command.
|
|
|
86
101
|
| Flag | Default | Notes |
|
|
87
102
|
| ------------------- | ------------------ | ------------------------------------------------------------- |
|
|
88
103
|
| `--model <model>` | _(required)_ | Model name to expose in OpenAI compatibility. |
|
|
89
|
-
| `--provider <name>` | `hermes` | OAuth provider to use (hermes
|
|
104
|
+
| `--provider <name>` | `hermes` | OAuth provider to use (`hermes` \| `opencode`). |
|
|
90
105
|
| `--node-env <env>` | `development` | `development` \| `production`. |
|
|
91
106
|
| `--debug <ns>` | `useclaudeproxy:*` | `debug` namespaces, e.g. `useclaudeproxy:oauth`. |
|
|
92
107
|
| `--data-dir <dir>` | `data` | Token storage directory. |
|
|
@@ -111,8 +126,9 @@ useclaudeproxy --model stealth/ox-alpha --data-dir ~/.useclaudeproxy --debug use
|
|
|
111
126
|
- Two independent "proxy" concepts: the TS app's OAuth calls can use an outbound
|
|
112
127
|
proxy (`--proxy`), and the binary has its own separate `proxy-url` for upstream
|
|
113
128
|
provider traffic. They do not affect each other.
|
|
114
|
-
- Providers are pluggable. `hermes`
|
|
115
|
-
add another by implementing
|
|
129
|
+
- Providers are pluggable. `hermes` and `opencode` are registered in
|
|
130
|
+
`src/providers/index.ts`; add another by implementing `BaseProvider` in
|
|
131
|
+
`src/providers/`.
|
|
116
132
|
|
|
117
133
|
## License
|
|
118
134
|
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAUA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAUA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBzC"}
|
package/dist/app.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import Debug from "debug";
|
|
2
2
|
import { args } from "./args.js";
|
|
3
|
-
import { setProxyUrl } from "./config-yaml.js";
|
|
4
3
|
import { ensureCliProxy } from "./install-cli-proxy.js";
|
|
5
4
|
import { getProvider } from "./providers/index.js";
|
|
6
5
|
import { runCliProxy } from "./run-cli-proxy.js";
|
|
7
6
|
const log = Debug("useclaudeproxy:oauth");
|
|
8
7
|
const errorLog = Debug("useclaudeproxy:oauth:error");
|
|
9
8
|
export async function app() {
|
|
10
|
-
await ensureCliProxy();
|
|
11
9
|
const provider = getProvider(args.activeProvider);
|
|
12
|
-
await
|
|
13
|
-
|
|
10
|
+
await ensureCliProxy();
|
|
11
|
+
if (args.renew)
|
|
12
|
+
process.exit(0);
|
|
13
|
+
provider.initConfig();
|
|
14
|
+
provider.logConfigInfo();
|
|
14
15
|
runCliProxy()
|
|
15
16
|
.then((code) => process.exit(code))
|
|
16
17
|
.catch((err) => {
|
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,
|
|
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"}
|
package/dist/args.d.ts
CHANGED
package/dist/args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,UAAgC,CAAC;AAEvD,UAAU,OAAO;IACf,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,UAAgC,CAAC;AAEvD,UAAU,OAAO;IACf,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAqED,eAAO,MAAM,IAAI,SAAM,CAAC"}
|
package/dist/args.js
CHANGED
|
@@ -4,19 +4,27 @@ const program = new Command();
|
|
|
4
4
|
program
|
|
5
5
|
.name("useclaudeproxy")
|
|
6
6
|
.description("Hermes OAuth Device Flow")
|
|
7
|
-
.option("--node-env <env>", "development | production", "development")
|
|
8
|
-
.option("--debug <ns>", 'debug namespaces, e.g. "useclaudeproxy:*"', "useclaudeproxy:*")
|
|
9
7
|
.option("--data-dir <dir>", "token storage directory", "data")
|
|
10
|
-
.
|
|
8
|
+
.option("--model <model>", "model name to expose in openai-compatibility")
|
|
11
9
|
.option("--proxy <url>", 'CLIProxyAPI outbound proxy (omit for "", or ""|direct|none to clear)')
|
|
12
10
|
.option("--provider <name>", "OAuth provider to use (default: hermes)", "hermes")
|
|
13
11
|
.option("--force", "re-download CLIProxyAPI even if already installed")
|
|
14
12
|
.option("--renew", "re-extract from the kept archive and re-run device flow")
|
|
15
13
|
.parse();
|
|
14
|
+
if (!program.opts().renew &&
|
|
15
|
+
!program.opts().model) {
|
|
16
|
+
program.error("required option '--model <model>' not specified");
|
|
17
|
+
}
|
|
18
|
+
program.addHelpText("after", `
|
|
19
|
+
Environment variables:
|
|
20
|
+
NODE_ENV development | production
|
|
21
|
+
Example: export NODE_ENV=production
|
|
22
|
+
|
|
23
|
+
DEBUG debug namespaces, e.g. "useclaudeproxy:*"
|
|
24
|
+
Example: export DEBUG="useclaudeproxy:*"
|
|
25
|
+
`);
|
|
16
26
|
const cli = {
|
|
17
27
|
force: false,
|
|
18
|
-
nodeEnv: "development",
|
|
19
|
-
debug: "useclaudeproxy:*",
|
|
20
28
|
dataDir: "data",
|
|
21
29
|
proxy: "",
|
|
22
30
|
renew: false,
|
|
@@ -24,9 +32,7 @@ const cli = {
|
|
|
24
32
|
model: "",
|
|
25
33
|
};
|
|
26
34
|
const opts = program.opts();
|
|
27
|
-
process.env.DEBUG
|
|
28
|
-
cli.nodeEnv = opts.nodeEnv;
|
|
29
|
-
cli.debug = opts.debug;
|
|
35
|
+
process.env.DEBUG ??= "useclaudeproxy:*";
|
|
30
36
|
cli.dataDir = opts.dataDir;
|
|
31
37
|
cli.proxy = opts.proxy ?? "";
|
|
32
38
|
cli.model = opts.model;
|
package/dist/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAcvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,CAAC;KAC7D,MAAM,CAAC,iBAAiB,EAAE,8CAA8C,CAAC;KACzE,MAAM,CACL,eAAe,EACf,sEAAsE,CACvE;KACA,MAAM,CACL,mBAAmB,EACnB,yCAAyC,EACzC,QAAQ,CACT;KACA,MAAM,CAAC,SAAS,EAAE,mDAAmD,CAAC;KACtE,MAAM,CAAC,SAAS,EAAE,yDAAyD,CAAC;KAC5E,KAAK,EAAE,CAAC;AAEX,IACE,CAAC,OAAO,CAAC,IAAI,EAAsC,CAAC,KAAK;IACzD,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,EACrB,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACnE,CAAC;AAED,OAAO,CAAC,WAAW,CACjB,OAAO,EACP;;;;;;;CAOD,CACA,CAAC;AAEF,MAAM,GAAG,GAAY;IACnB,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,KAAK;IACZ,cAAc,EAAE,QAAQ;IACxB,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EASxB,CAAC;AAEF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,kBAAkB,CAAC;AACzC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;AAC3B,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AAC7B,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AACvB,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AACvB,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AACvB,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC;AAEnC,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC"}
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,MAAM;;;;EAAgC,CAAC;AACpD,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { args } from "./args.js";
|
|
4
|
-
// All config is supplied via CLI flags (see args.ts). Validated with zod and
|
|
5
|
-
// frozen. Importing this module also creates DATA_DIR.
|
|
6
4
|
const envSchema = z.object({
|
|
7
5
|
NODE_ENV: z.enum(["development", "production"]).default("development"),
|
|
8
6
|
DATA_DIR: z.string().default("data"),
|
|
@@ -10,9 +8,9 @@ const envSchema = z.object({
|
|
|
10
8
|
// Proxy
|
|
11
9
|
});
|
|
12
10
|
const parsedEnv = envSchema.safeParse({
|
|
13
|
-
NODE_ENV:
|
|
11
|
+
NODE_ENV: process.env.NODE_ENV,
|
|
14
12
|
DATA_DIR: args.dataDir,
|
|
15
|
-
DEBUG:
|
|
13
|
+
DEBUG: process.env.DEBUG,
|
|
16
14
|
});
|
|
17
15
|
if (!parsedEnv.success) {
|
|
18
16
|
console.error("❌ Invalid arguments:");
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IACtE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE5B,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;IACpC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ;IAC9B,QAAQ,EAAE,IAAI,CAAC,OAAO;IACtB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK;CACzB,CAAC,CAAC;AACH,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACtC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAEpD,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-cli-proxy.d.ts","sourceRoot":"","sources":["../src/install-cli-proxy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install-cli-proxy.d.ts","sourceRoot":"","sources":["../src/install-cli-proxy.ts"],"names":[],"mappings":"AA+EA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCpD;AAsBD,wBAAgB,YAAY,IAAI,IAAI,CASnC"}
|
|
@@ -9,7 +9,7 @@ import { args } from "./args.js";
|
|
|
9
9
|
import { CONFIG_PATH } from "./config-yaml.js";
|
|
10
10
|
import { getProvider } from "./providers/index.js";
|
|
11
11
|
const log = Debug("app:install");
|
|
12
|
-
const VERSION = "7.2.
|
|
12
|
+
const VERSION = "7.2.144";
|
|
13
13
|
const RELEASE_BASE = `https://github.com/router-for-me/CLIProxyAPI/releases/download/v${VERSION}`;
|
|
14
14
|
const TOOLS_DIR = path.join(import.meta.dirname, "..", "tools");
|
|
15
15
|
function pickAsset() {
|
|
@@ -120,7 +120,6 @@ function renewFromArchive(archivePath) {
|
|
|
120
120
|
extract(archivePath, TOOLS_DIR);
|
|
121
121
|
log("Renewed CLIProxyAPI from %s", archivePath);
|
|
122
122
|
createConfig();
|
|
123
|
-
args.renew = false;
|
|
124
123
|
}
|
|
125
124
|
export function createConfig() {
|
|
126
125
|
const example = path.join(TOOLS_DIR, "config.example.yaml");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-cli-proxy.js","sourceRoot":"","sources":["../src/install-cli-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"install-cli-proxy.js","sourceRoot":"","sources":["../src/install-cli-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare abstract class BaseProvider {
|
|
2
|
+
abstract readonly name: string;
|
|
3
|
+
abstract readonly baseUrl: string;
|
|
4
|
+
abstract readonly tokenPath: string;
|
|
5
|
+
abstract initConfig(): Promise<void>;
|
|
6
|
+
abstract getValidToken(): Promise<unknown>;
|
|
7
|
+
abstract startTokenWatcher(signal?: AbortSignal): Promise<void>;
|
|
8
|
+
logConfigInfo(): void;
|
|
9
|
+
readStoredToken<T>(): T | undefined;
|
|
10
|
+
clearStoredToken(): void;
|
|
11
|
+
saveTokens(token: unknown): void;
|
|
12
|
+
setApiKey(apiKey: string): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=base-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-provider.d.ts","sourceRoot":"","sources":["../../src/providers/base-provider.ts"],"names":[],"mappings":"AAQA,8BAAsB,YAAY;IAChC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAEpC,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,QAAQ,CAAC,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE,aAAa,SAoBZ;IACD,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,SAAS,CAOlC;IAED,gBAAgB,IAAI,IAAI,CAOvB;IAED,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAI/B;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ9B;CACF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import Debug from "debug";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { args } from "../args.js";
|
|
4
|
+
import { readConfig, writeConfig } from "../config-yaml.js";
|
|
5
|
+
const log = Debug("useclaudeproxy:BaseProvider");
|
|
6
|
+
const errorLog = Debug("useclaudeproxy:BaseProvider:error");
|
|
7
|
+
export class BaseProvider {
|
|
8
|
+
logConfigInfo() {
|
|
9
|
+
const config = readConfig();
|
|
10
|
+
const text = `
|
|
11
|
+
#API-KEY: ${config["api-keys"]}
|
|
12
|
+
OpenAI-compatible: http://${config["host"]}:${config["port"]}/v1
|
|
13
|
+
Anthropic-compatible: http://${config["host"]}:${config["port"]}
|
|
14
|
+
Gemini-compatible: http://${config["host"]}:${config["port"]}
|
|
15
|
+
|
|
16
|
+
Model >>> Alias:
|
|
17
|
+
${args.model} >>> claude-opus-5
|
|
18
|
+
${args.model} >>> ${args.model}
|
|
19
|
+
|
|
20
|
+
[ClaudeCode]
|
|
21
|
+
export ANTHROPIC_MODEL=claude-opus-5
|
|
22
|
+
export ANTHROPIC_BASE_URL=http://${config["host"]}:${config["port"]}
|
|
23
|
+
export ANTHROPIC_AUTH_TOKEN=${config["api-keys"]}
|
|
24
|
+
`;
|
|
25
|
+
console.log(text);
|
|
26
|
+
}
|
|
27
|
+
readStoredToken() {
|
|
28
|
+
if (!fs.existsSync(this.tokenPath))
|
|
29
|
+
return undefined;
|
|
30
|
+
try {
|
|
31
|
+
return JSON.parse(fs.readFileSync(this.tokenPath, "utf8"));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
clearStoredToken() {
|
|
38
|
+
fs.rmSync(args.dataDir, {
|
|
39
|
+
recursive: true,
|
|
40
|
+
force: true,
|
|
41
|
+
});
|
|
42
|
+
log("Cleared stored token");
|
|
43
|
+
}
|
|
44
|
+
saveTokens(token) {
|
|
45
|
+
fs.writeFileSync(this.tokenPath, JSON.stringify(token, null, 2), {
|
|
46
|
+
mode: 0o600,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
setApiKey(apiKey) {
|
|
50
|
+
const config = readConfig();
|
|
51
|
+
const api = config["openai-compatibility"][0];
|
|
52
|
+
api["api-key-entries"] = [{ "api-key": apiKey }];
|
|
53
|
+
api["headers"]["Authorization"] = `Bearer ${apiKey}`;
|
|
54
|
+
writeConfig(config);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=base-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-provider.js","sourceRoot":"","sources":["../../src/providers/base-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,GAAG,GAAG,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,mCAAmC,CAAC,CAAC;AAE5D,MAAM,OAAgB,YAAY;IAShC,aAAa;QACX,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,MAAM,IAAI,GAAG;gBACD,MAAM,CAAC,UAAU,CAAC;gCACF,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;mCAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;gCACnC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;;;UAGtD,IAAI,CAAC,KAAK;UACV,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK;;;;uCAIC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;kCACrC,MAAM,CAAC,UAAU,CAAC;KAC/C,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,eAAe;QACb,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAM,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,gBAAgB;QACd,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;YACtB,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC9B,CAAC;IAED,UAAU,CAAC,KAAc;QACvB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;YAC/D,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9C,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,GAAG,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;QAErD,WAAW,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -1,23 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { BaseProvider } from "./base-provider.ts";
|
|
2
2
|
type TokenResponse = {
|
|
3
3
|
access_token: string;
|
|
4
4
|
refresh_token?: string;
|
|
5
5
|
token_type: string;
|
|
6
6
|
expires_in?: number;
|
|
7
7
|
};
|
|
8
|
-
export declare class HermesProvider
|
|
8
|
+
export declare class HermesProvider extends BaseProvider {
|
|
9
9
|
readonly name = "hermes";
|
|
10
|
+
readonly baseUrl = "https://inference-api.nousresearch.com/v1";
|
|
10
11
|
readonly tokenPath: string;
|
|
11
12
|
private readonly client;
|
|
13
|
+
initConfig(): Promise<void>;
|
|
12
14
|
getValidToken(): Promise<TokenResponse>;
|
|
13
15
|
startTokenWatcher(signal?: AbortSignal): Promise<void>;
|
|
14
|
-
private getAccountInfo;
|
|
15
16
|
private runDeviceFlow;
|
|
16
|
-
|
|
17
|
-
private readStoredToken;
|
|
18
|
-
private saveTokens;
|
|
19
|
-
private initConfig;
|
|
20
|
-
private setApiKey;
|
|
17
|
+
saveTokens(token: TokenResponse): void;
|
|
21
18
|
}
|
|
22
19
|
export declare const hermesProvider: HermesProvider;
|
|
23
20
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../src/providers/hermes.ts"],"names":[],"mappings":"AASA,OAAO,
|
|
1
|
+
{"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../src/providers/hermes.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAqBlD,KAAK,aAAa,GAAG;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AA8IF,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,OAAO,+CAA+C;IAC/D,QAAQ,CAAC,SAAS,SAAoD;IACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IAEjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAiChC;IAEK,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,CAwB5C;IAEK,iBAAiB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3D;YAEa,aAAa;IAqBlB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAG9C;CACF;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
package/dist/providers/hermes.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import Debug from "debug";
|
|
2
|
-
import fs from "node:fs";
|
|
3
2
|
import path from "node:path";
|
|
4
3
|
import open from "open";
|
|
5
4
|
import { args } from "../args.js";
|
|
@@ -7,21 +6,16 @@ import { readConfig, writeConfig } from "../config-yaml.js";
|
|
|
7
6
|
import { config } from "../config.js";
|
|
8
7
|
import { createOAuthHttpClient } from "../http-client.js";
|
|
9
8
|
import { AccessDeniedError } from "../types.js";
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
import { sleep } from "../utils.js";
|
|
10
|
+
import { BaseProvider } from "./base-provider.js";
|
|
11
|
+
const log = Debug("useclaudeproxy:hermes");
|
|
12
|
+
const errorLog = Debug("useclaudeproxy:hermes:error");
|
|
12
13
|
const POLL_INTERVAL_MS = 7000;
|
|
13
14
|
const WATCH_INTERVAL_MS = 7000;
|
|
14
15
|
const FORM_HEADERS = {
|
|
15
16
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
16
17
|
Accept: "application/json",
|
|
17
18
|
};
|
|
18
|
-
const OAUTH = {
|
|
19
|
-
baseUrl: "https://portal.nousresearch.com/api/oauth",
|
|
20
|
-
clientId: "hermes-cli",
|
|
21
|
-
scope: "inference:invoke",
|
|
22
|
-
grantType: "urn:ietf:params:oauth:grant-type:device_code",
|
|
23
|
-
refreshTokenHeader: "X-Nous-Refresh-Token",
|
|
24
|
-
};
|
|
25
19
|
class OAuthHttpError extends Error {
|
|
26
20
|
statusCode;
|
|
27
21
|
body;
|
|
@@ -40,14 +34,21 @@ class DeviceCodeExpiredError extends Error {
|
|
|
40
34
|
}
|
|
41
35
|
class HermesDeviceFlowClient {
|
|
42
36
|
http;
|
|
37
|
+
OAUTH = {
|
|
38
|
+
baseUrl: "https://portal.nousresearch.com/api/oauth",
|
|
39
|
+
clientId: "hermes-cli",
|
|
40
|
+
scope: "inference:invoke",
|
|
41
|
+
grantType: "urn:ietf:params:oauth:grant-type:device_code",
|
|
42
|
+
refreshTokenHeader: "X-Nous-Refresh-Token",
|
|
43
|
+
};
|
|
43
44
|
constructor(http = createOAuthHttpClient()) {
|
|
44
45
|
this.http = http;
|
|
45
46
|
}
|
|
46
47
|
async requestDeviceCode() {
|
|
47
48
|
log("Requesting device code");
|
|
48
|
-
const response = await this.http.post(`${OAUTH.baseUrl}/device/code`, {
|
|
49
|
+
const response = await this.http.post(`${this.OAUTH.baseUrl}/device/code`, {
|
|
49
50
|
headers: FORM_HEADERS,
|
|
50
|
-
body: `client_id=${OAUTH.clientId}&scope=${encodeURIComponent(OAUTH.scope)}`,
|
|
51
|
+
body: `client_id=${this.OAUTH.clientId}&scope=${encodeURIComponent(this.OAUTH.scope)}`,
|
|
51
52
|
});
|
|
52
53
|
return this.parseOrThrow(response, "Failed to get device code");
|
|
53
54
|
}
|
|
@@ -55,9 +56,9 @@ class HermesDeviceFlowClient {
|
|
|
55
56
|
log("Polling for token");
|
|
56
57
|
while (true) {
|
|
57
58
|
await sleep(POLL_INTERVAL_MS);
|
|
58
|
-
const response = await this.http.post(`${OAUTH.baseUrl}/token`, {
|
|
59
|
+
const response = await this.http.post(`${this.OAUTH.baseUrl}/token`, {
|
|
59
60
|
headers: FORM_HEADERS,
|
|
60
|
-
body: `grant_type=${OAUTH.grantType}&client_id=${OAUTH.clientId}&device_code=${deviceCode}`,
|
|
61
|
+
body: `grant_type=${this.OAUTH.grantType}&client_id=${this.OAUTH.clientId}&device_code=${deviceCode}`,
|
|
61
62
|
});
|
|
62
63
|
if (response.statusCode === 200)
|
|
63
64
|
return parseBody(response);
|
|
@@ -70,15 +71,18 @@ class HermesDeviceFlowClient {
|
|
|
70
71
|
}
|
|
71
72
|
async refreshToken(refreshToken) {
|
|
72
73
|
log("Refreshing access token");
|
|
73
|
-
const response = await this.http.post(`${OAUTH.baseUrl}/token`, {
|
|
74
|
-
headers: {
|
|
75
|
-
|
|
74
|
+
const response = await this.http.post(`${this.OAUTH.baseUrl}/token`, {
|
|
75
|
+
headers: {
|
|
76
|
+
...FORM_HEADERS,
|
|
77
|
+
[this.OAUTH.refreshTokenHeader]: refreshToken,
|
|
78
|
+
},
|
|
79
|
+
body: `grant_type=refresh_token&client_id=${this.OAUTH.clientId}`,
|
|
76
80
|
});
|
|
77
81
|
return this.parseOrThrow(response, "Failed to refresh token");
|
|
78
82
|
}
|
|
79
83
|
async fetchAccountInfo(accessToken) {
|
|
80
84
|
log("Fetching account information");
|
|
81
|
-
const response = await this.http.get(`${OAUTH.baseUrl}/account`, {
|
|
85
|
+
const response = await this.http.get(`${this.OAUTH.baseUrl}/account`, {
|
|
82
86
|
headers: {
|
|
83
87
|
Authorization: `Bearer ${accessToken}`,
|
|
84
88
|
Accept: "application/json",
|
|
@@ -111,21 +115,39 @@ function parseBody(response) {
|
|
|
111
115
|
? JSON.parse(response.body)
|
|
112
116
|
: response.body;
|
|
113
117
|
}
|
|
114
|
-
|
|
115
|
-
return new Promise((resolve) => {
|
|
116
|
-
if (signal?.aborted)
|
|
117
|
-
return resolve();
|
|
118
|
-
const t = setTimeout(resolve, ms);
|
|
119
|
-
signal?.addEventListener("abort", () => {
|
|
120
|
-
clearTimeout(t);
|
|
121
|
-
resolve();
|
|
122
|
-
}, { once: true });
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
export class HermesProvider {
|
|
118
|
+
export class HermesProvider extends BaseProvider {
|
|
126
119
|
name = "hermes";
|
|
120
|
+
baseUrl = "https://inference-api.nousresearch.com/v1";
|
|
127
121
|
tokenPath = path.join(config.DATA_DIR, "hermes-tokens.json");
|
|
128
122
|
client = new HermesDeviceFlowClient();
|
|
123
|
+
async initConfig() {
|
|
124
|
+
const config = readConfig();
|
|
125
|
+
config["host"] = "127.0.0.1";
|
|
126
|
+
config["api-keys"] = ["456789"];
|
|
127
|
+
config["openai-compatibility"] = [{ name: this.name }];
|
|
128
|
+
const api = config["openai-compatibility"][0];
|
|
129
|
+
api["base-url"] = this.baseUrl;
|
|
130
|
+
api["models"] = [
|
|
131
|
+
{ name: args.model, alias: "claude-opus-5" },
|
|
132
|
+
{ name: args.model, alias: "" },
|
|
133
|
+
];
|
|
134
|
+
api["headers"] = {
|
|
135
|
+
"User-Agent": "OpenAI/Python 2.24.0",
|
|
136
|
+
"X-Stainless-Arch": "x64",
|
|
137
|
+
"X-Stainless-Async": "false",
|
|
138
|
+
"X-Stainless-Lang": "python",
|
|
139
|
+
"X-Stainless-Os": "Linux",
|
|
140
|
+
"X-Stainless-Package-Version": "2.24.0",
|
|
141
|
+
"X-Stainless-Read-Timeout": "30.0",
|
|
142
|
+
"X-Stainless-Retry-Count": "0",
|
|
143
|
+
"X-Stainless-Runtime": "CPython",
|
|
144
|
+
"X-Stainless-Runtime-Version": "3.11.15",
|
|
145
|
+
};
|
|
146
|
+
api["disable-cooling"] = true;
|
|
147
|
+
const token = await this.getValidToken();
|
|
148
|
+
this.setApiKey(token.access_token);
|
|
149
|
+
writeConfig(config);
|
|
150
|
+
}
|
|
129
151
|
async getValidToken() {
|
|
130
152
|
const stored = this.readStoredToken();
|
|
131
153
|
if (stored) {
|
|
@@ -156,8 +178,8 @@ export class HermesProvider {
|
|
|
156
178
|
let current = (await this.getValidToken()).access_token;
|
|
157
179
|
while (!signal?.aborted) {
|
|
158
180
|
try {
|
|
159
|
-
const account = await this.
|
|
160
|
-
// log("Account Information
|
|
181
|
+
const account = await this.client.fetchAccountInfo(current);
|
|
182
|
+
// log("Account Information:", account);
|
|
161
183
|
log("Token valid");
|
|
162
184
|
}
|
|
163
185
|
catch (err) {
|
|
@@ -169,9 +191,6 @@ export class HermesProvider {
|
|
|
169
191
|
await sleep(WATCH_INTERVAL_MS, signal);
|
|
170
192
|
}
|
|
171
193
|
}
|
|
172
|
-
async getAccountInfo(accessToken) {
|
|
173
|
-
return this.client.fetchAccountInfo(accessToken);
|
|
174
|
-
}
|
|
175
194
|
async runDeviceFlow() {
|
|
176
195
|
const deviceCode = await this.client.requestDeviceCode();
|
|
177
196
|
log("Device code received: user_code=%s", deviceCode.user_code);
|
|
@@ -180,81 +199,13 @@ export class HermesProvider {
|
|
|
180
199
|
console.log(`Opened ${verificationUrl}. If it didn't open, enter code ${deviceCode.user_code} there.`);
|
|
181
200
|
const token = await this.client.pollForToken(deviceCode.device_code);
|
|
182
201
|
log("Authorization successful");
|
|
183
|
-
this.initConfig(args.model);
|
|
184
202
|
this.saveTokens(token);
|
|
185
203
|
return token;
|
|
186
204
|
}
|
|
187
|
-
clearStoredToken() {
|
|
188
|
-
if (fs.existsSync(this.tokenPath)) {
|
|
189
|
-
fs.rmSync(this.tokenPath, { force: true });
|
|
190
|
-
log("Cleared stored token");
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
readStoredToken() {
|
|
194
|
-
if (!fs.existsSync(this.tokenPath))
|
|
195
|
-
return undefined;
|
|
196
|
-
try {
|
|
197
|
-
return JSON.parse(fs.readFileSync(this.tokenPath, "utf8"));
|
|
198
|
-
}
|
|
199
|
-
catch {
|
|
200
|
-
return undefined;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
205
|
saveTokens(token) {
|
|
204
|
-
|
|
205
|
-
mode: 0o600,
|
|
206
|
-
});
|
|
206
|
+
super.saveTokens(token);
|
|
207
207
|
this.setApiKey(token.access_token);
|
|
208
208
|
}
|
|
209
|
-
initConfig(model) {
|
|
210
|
-
const config = readConfig();
|
|
211
|
-
config["host"] = "127.0.0.1";
|
|
212
|
-
config["api-keys"] = ["456789"];
|
|
213
|
-
config["openai-compatibility"] = [{ name: args.activeProvider }];
|
|
214
|
-
const api = config["openai-compatibility"][0];
|
|
215
|
-
api["base-url"] = "https://inference-api.nousresearch.com/v1";
|
|
216
|
-
api["models"] = [
|
|
217
|
-
{ name: model, alias: "claude-opus-5" },
|
|
218
|
-
{ name: model, alias: "" },
|
|
219
|
-
];
|
|
220
|
-
api["headers"] = {
|
|
221
|
-
"User-Agent": "OpenAI/Python 2.24.0",
|
|
222
|
-
"X-Stainless-Arch": "x64",
|
|
223
|
-
"X-Stainless-Async": "false",
|
|
224
|
-
"X-Stainless-Lang": "python",
|
|
225
|
-
"X-Stainless-Os": "Linux",
|
|
226
|
-
"X-Stainless-Package-Version": "2.24.0",
|
|
227
|
-
"X-Stainless-Read-Timeout": "30.0",
|
|
228
|
-
"X-Stainless-Retry-Count": "0",
|
|
229
|
-
"X-Stainless-Runtime": "CPython",
|
|
230
|
-
"X-Stainless-Runtime-Version": "3.11.15",
|
|
231
|
-
};
|
|
232
|
-
api["disable-cooling"] = true;
|
|
233
|
-
const text = `
|
|
234
|
-
#API-KEY: ${config["api-keys"]}
|
|
235
|
-
OpenAI-compatible: http://127.0.0.1:${config["port"]}/v1
|
|
236
|
-
Anthropic-compatible: http://127.0.0.1:${config["port"]}
|
|
237
|
-
Gemini-compatible: http://127.0.0.1:${config["port"]}
|
|
238
|
-
|
|
239
|
-
Model >>> Alias:
|
|
240
|
-
${model} >>> claude-opus-5
|
|
241
|
-
${model} >>>
|
|
242
|
-
|
|
243
|
-
[ClaudeCode]
|
|
244
|
-
export ANTHROPIC_MODEL=claude-opus-5
|
|
245
|
-
export ANTHROPIC_BASE_URL=http://127.0.0.1:${config["port"]}
|
|
246
|
-
export ANTHROPIC_AUTH_TOKEN=${config["api-keys"]}
|
|
247
|
-
`;
|
|
248
|
-
console.log(text);
|
|
249
|
-
writeConfig(config);
|
|
250
|
-
}
|
|
251
|
-
setApiKey(apiKey) {
|
|
252
|
-
const config = readConfig();
|
|
253
|
-
const api = config["openai-compatibility"][0];
|
|
254
|
-
api["api-key-entries"] = [{ "api-key": apiKey }];
|
|
255
|
-
api["headers"]["Authorization"] = `Bearer ${apiKey}`;
|
|
256
|
-
writeConfig(config);
|
|
257
|
-
}
|
|
258
209
|
}
|
|
259
210
|
export const hermesProvider = new HermesProvider();
|
|
260
211
|
//# sourceMappingURL=hermes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../src/providers/hermes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../src/providers/hermes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function getProvider(name: string):
|
|
1
|
+
import type { BaseProvider } from "./base-provider.ts";
|
|
2
|
+
export declare function getProvider(name: string): BaseProvider;
|
|
3
3
|
export declare const PROVIDER_NAMES: string[];
|
|
4
|
-
export type { Provider };
|
|
5
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAQtD;AAED,eAAO,MAAM,cAAc,UAAuB,CAAC"}
|
package/dist/providers/index.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { hermesProvider } from "./hermes.js";
|
|
2
|
-
|
|
2
|
+
import { openCodeProvider } from "./opencode.js";
|
|
3
|
+
const registry = new Map([
|
|
4
|
+
["hermes", hermesProvider],
|
|
5
|
+
["opencode", openCodeProvider],
|
|
6
|
+
]);
|
|
3
7
|
export function getProvider(name) {
|
|
4
8
|
const provider = registry.get(name.toLowerCase());
|
|
5
9
|
if (!provider) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"
|
|
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;AAEjD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAuB;IAC7C,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC1B,CAAC,UAAU,EAAE,gBAAgB,CAAC;CAC/B,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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseProvider } from "./base-provider.ts";
|
|
2
|
+
type Token = {
|
|
3
|
+
key: string;
|
|
4
|
+
};
|
|
5
|
+
export declare class OpenCodeProvider extends BaseProvider {
|
|
6
|
+
readonly name = "opencode";
|
|
7
|
+
readonly baseUrl = "https://opencode.ai/zen/v1";
|
|
8
|
+
readonly tokenPath: string;
|
|
9
|
+
private readonly http;
|
|
10
|
+
initConfig(): Promise<void>;
|
|
11
|
+
getValidToken(): Promise<Token>;
|
|
12
|
+
saveTokens(token: Token): void;
|
|
13
|
+
startTokenWatcher(signal?: AbortSignal): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export declare const openCodeProvider: OpenCodeProvider;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/providers/opencode.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAgCF,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,OAAO,gCAAgC;IAChD,QAAQ,CAAC,SAAS,SAAsD;IACxE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAC1C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBhC;IAEK,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,CAYpC;IAEQ,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAGtC;IAEK,iBAAiB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD3D;CACF;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import Debug from "debug";
|
|
2
|
+
import crypto from "node:crypto";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
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 { sleep } from "../utils.js";
|
|
10
|
+
import { BaseProvider } from "./base-provider.js";
|
|
11
|
+
const log = Debug("useclaudeproxy:opencode");
|
|
12
|
+
const errorLog = Debug("useclaudeproxy:opencode:error");
|
|
13
|
+
const WATCH_INTERVAL_MS = 7000;
|
|
14
|
+
function generateRequestId() {
|
|
15
|
+
return `msg_${crypto.randomUUID().replace(/-/g, "")}`;
|
|
16
|
+
}
|
|
17
|
+
function generateSessionId() {
|
|
18
|
+
return `ses_${crypto.randomUUID().replace(/-/g, "")}`;
|
|
19
|
+
}
|
|
20
|
+
function toOpencodeSession(id) {
|
|
21
|
+
const stripped = String(id ?? "")
|
|
22
|
+
.replace(/^ses_/, "")
|
|
23
|
+
.replace(/-/g, "");
|
|
24
|
+
return stripped ? `ses_${stripped}` : null;
|
|
25
|
+
}
|
|
26
|
+
function buildOpenCodeHeaders(sessionId) {
|
|
27
|
+
const currentSession = toOpencodeSession(sessionId) ?? generateSessionId();
|
|
28
|
+
return {
|
|
29
|
+
"Content-Type": "application/json",
|
|
30
|
+
"User-Agent": "opencode/1.18.23 ai-sdk/provider-utils/4.0.23 runtime/bun/1.3.14",
|
|
31
|
+
"x-opencode-client": "cli",
|
|
32
|
+
"x-opencode-session": currentSession,
|
|
33
|
+
"x-opencode-request": generateRequestId(),
|
|
34
|
+
"x-opencode-project": "global",
|
|
35
|
+
accept: "*/*",
|
|
36
|
+
"accept-encoding": "gzip, deflate, br",
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export class OpenCodeProvider extends BaseProvider {
|
|
40
|
+
name = "opencode";
|
|
41
|
+
baseUrl = "https://opencode.ai/zen/v1";
|
|
42
|
+
tokenPath = path.join(config.DATA_DIR, "opencode-tokens.json");
|
|
43
|
+
http = createOAuthHttpClient();
|
|
44
|
+
async initConfig() {
|
|
45
|
+
const config = readConfig();
|
|
46
|
+
config["host"] = "127.0.0.1";
|
|
47
|
+
config["api-keys"] = ["456789"];
|
|
48
|
+
config["openai-compatibility"] = [{ name: this.name }];
|
|
49
|
+
const api = config["openai-compatibility"][0];
|
|
50
|
+
api["base-url"] = this.baseUrl;
|
|
51
|
+
api["models"] = [
|
|
52
|
+
{ name: args.model, alias: "claude-opus-5" },
|
|
53
|
+
{ name: args.model, alias: "" },
|
|
54
|
+
];
|
|
55
|
+
api["disable-cooling"] = true;
|
|
56
|
+
api["headers"] = buildOpenCodeHeaders();
|
|
57
|
+
const token = await this.getValidToken();
|
|
58
|
+
this.setApiKey(token.key);
|
|
59
|
+
writeConfig(config);
|
|
60
|
+
}
|
|
61
|
+
async getValidToken() {
|
|
62
|
+
if (fs.existsSync(this.tokenPath)) {
|
|
63
|
+
const token = this.readStoredToken();
|
|
64
|
+
if (token)
|
|
65
|
+
return token;
|
|
66
|
+
}
|
|
67
|
+
const token = {
|
|
68
|
+
key: "public",
|
|
69
|
+
};
|
|
70
|
+
this.saveTokens(token);
|
|
71
|
+
return token;
|
|
72
|
+
}
|
|
73
|
+
saveTokens(token) {
|
|
74
|
+
super.saveTokens(token);
|
|
75
|
+
this.setApiKey(token.key);
|
|
76
|
+
}
|
|
77
|
+
async startTokenWatcher(signal) {
|
|
78
|
+
const cfg = readConfig();
|
|
79
|
+
const token = await this.getValidToken();
|
|
80
|
+
log("Watching OpenCode provider at %s every %dms", this.baseUrl, WATCH_INTERVAL_MS);
|
|
81
|
+
while (!signal?.aborted) {
|
|
82
|
+
try {
|
|
83
|
+
const res = await this.http.post(`${this.baseUrl}/chat/completions`, {
|
|
84
|
+
headers: {
|
|
85
|
+
...buildOpenCodeHeaders(),
|
|
86
|
+
Authorization: `Bearer ${token.key}`,
|
|
87
|
+
},
|
|
88
|
+
json: {
|
|
89
|
+
model: args.model,
|
|
90
|
+
messages: [
|
|
91
|
+
{
|
|
92
|
+
role: "system",
|
|
93
|
+
content: 'You are a title generator. You output ONLY a thread title. Nothing else.\n\n<task>\nGenerate a brief title that would help the user find this conversation later.\n\nFollow all rules in <rules>\nUse the <examples> so you know what a good title looks like.\nYour output must be:\n- A single line\n- ≤50 characters\n- No explanations\n</task>\n\n<rules>\n- you MUST use the same language as the user message you are summarizing\n- Title must be grammatically correct and read naturally - no word salad\n- Never include tool names in the title (e.g. "read tool", "bash tool", "edit tool")\n- Focus on the main topic or question the user needs to retrieve\n- Vary your phrasing - avoid repetitive patterns like always starting with "Analyzing"\n- When a file is mentioned, focus on WHAT the user wants to do WITH the file, not just that they shared it\n- Keep exact: technical terms, numbers, filenames, HTTP codes\n- Remove: the, this, my, a, an\n- Never assume tech stack\n- Never use tools\n- NEVER respond to questions, just generate a title for the conversation\n- The title should NEVER include "summarizing" or "generating" when generating a title\n- DO NOT SAY YOU CANNOT GENERATE A TITLE OR COMPLAIN ABOUT THE INPUT\n- Always output something meaningful, even if the input is minimal.\n- If the user message is short or conversational (e.g. "hello", "lol", "what\'s up", "hey"):\n → create a title that reflects the user\'s tone or intent (such as Greeting, Quick check-in, Light chat, Intro message, etc.)\n</rules>\n\n<examples>\n"debug 500 errors in production" → Debugging production 500 errors\n"refactor user service" → Refactoring user service\n"why is app.js failing" → app.js failure investigation\n"implement rate limiting" → Rate limiting implementation\n"how do I connect postgres to my API" → Postgres API connection\n"best practices for React hooks" → React hooks best practices\n"@src/auth.ts can you add refresh token support" → Auth refresh token support\n"@utils/parser.ts this is broken" → Parser bug fix\n"look at @config.json" → Config review\n"@App.tsx add dark mode toggle" → Dark mode toggle in App\n</examples>\n',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
role: "user",
|
|
97
|
+
content: "Generate a title for this conversation:\n",
|
|
98
|
+
},
|
|
99
|
+
{ role: "user", content: "Hello" },
|
|
100
|
+
],
|
|
101
|
+
stream: false,
|
|
102
|
+
max_tokens: 100,
|
|
103
|
+
temperature: 0.5,
|
|
104
|
+
reasoning_effort: "low",
|
|
105
|
+
stream_options: { include_usage: true },
|
|
106
|
+
},
|
|
107
|
+
throwHttpErrors: false,
|
|
108
|
+
retry: { limit: 0 },
|
|
109
|
+
timeout: { request: 30_000 },
|
|
110
|
+
https: { rejectUnauthorized: false },
|
|
111
|
+
});
|
|
112
|
+
if (res.statusCode !== 200) {
|
|
113
|
+
throw new Error(`StatusCode: ${res.statusCode}`);
|
|
114
|
+
}
|
|
115
|
+
log("OpenCode provider reachable");
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
errorLog("OpenCode provider unavailable: %o", err);
|
|
119
|
+
}
|
|
120
|
+
await sleep(WATCH_INTERVAL_MS, signal);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export const openCodeProvider = new OpenCodeProvider();
|
|
125
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/providers/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-cli-proxy.d.ts","sourceRoot":"","sources":["../src/run-cli-proxy.ts"],"names":[],"mappings":"AAaA,wBAAsB,WAAW,CAAC,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"run-cli-proxy.d.ts","sourceRoot":"","sources":["../src/run-cli-proxy.ts"],"names":[],"mappings":"AAaA,wBAAsB,WAAW,CAAC,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAe3E"}
|
package/dist/run-cli-proxy.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import Debug from "debug";
|
|
2
2
|
import cp from "node:child_process";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import {
|
|
4
|
+
import { args } from "./args.js";
|
|
5
|
+
import { CONFIG_PATH, setProxyUrl } from "./config-yaml.js";
|
|
5
6
|
const log = Debug("app:run");
|
|
6
7
|
const BINARY = path.join(import.meta.dirname, "..", "tools", "cli-proxy-api");
|
|
7
8
|
// Spawns the extracted binary with tools/config.yaml. `proxyArgs` are passed
|
|
8
9
|
// through verbatim (e.g. --tui, --standalone). Inherits stdio and forwards
|
|
9
10
|
// signals so the user drives it directly (Ctrl+C shuts the server down).
|
|
10
11
|
export async function runCliProxy(proxyArgs = []) {
|
|
12
|
+
setProxyUrl(args.proxy);
|
|
11
13
|
const argv = [BINARY, "-config", CONFIG_PATH, ...proxyArgs];
|
|
12
14
|
log("Spawning: %s", argv.join(" "));
|
|
13
15
|
const child = cp.spawn(argv[0], argv.slice(1), { stdio: "inherit" });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-cli-proxy.js","sourceRoot":"","sources":["../src/run-cli-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-cli-proxy.js","sourceRoot":"","sources":["../src/run-cli-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAE9E,6EAA6E;AAC7E,2EAA2E;AAC3E,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAS,GAAa,EAAE;IACxD,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAExB,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,CAAC;IAC5D,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAErE,MAAM,OAAO,GAAG,CAAC,GAAmB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/D,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAEvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAC/C,CAAC;AACJ,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAarE"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function sleep(ms, signal) {
|
|
2
|
+
return new Promise((resolve) => {
|
|
3
|
+
if (signal?.aborted)
|
|
4
|
+
return resolve();
|
|
5
|
+
const t = setTimeout(resolve, ms);
|
|
6
|
+
signal?.addEventListener("abort", () => {
|
|
7
|
+
clearTimeout(t);
|
|
8
|
+
resolve();
|
|
9
|
+
}, { once: true });
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,MAAoB;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,OAAO,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClC,MAAM,EAAE,gBAAgB,CACtB,OAAO,EACP,GAAG,EAAE;YACH,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO,EAAE,CAAC;QACZ,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "useclaudeproxy",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.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",
|