useclaudeproxy 1.1.1 → 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.
Files changed (40) hide show
  1. package/README.md +19 -21
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +6 -3
  4. package/dist/app.js.map +1 -1
  5. package/dist/args.d.ts +0 -2
  6. package/dist/args.d.ts.map +1 -1
  7. package/dist/args.js +14 -8
  8. package/dist/args.js.map +1 -1
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +2 -4
  11. package/dist/config.js.map +1 -1
  12. package/dist/install-cli-proxy.d.ts.map +1 -1
  13. package/dist/install-cli-proxy.js +2 -6
  14. package/dist/install-cli-proxy.js.map +1 -1
  15. package/dist/providers/base-provider.d.ts +14 -0
  16. package/dist/providers/base-provider.d.ts.map +1 -0
  17. package/dist/providers/base-provider.js +57 -0
  18. package/dist/providers/base-provider.js.map +1 -0
  19. package/dist/providers/hermes.d.ts +5 -8
  20. package/dist/providers/hermes.d.ts.map +1 -1
  21. package/dist/providers/hermes.js +56 -113
  22. package/dist/providers/hermes.js.map +1 -1
  23. package/dist/providers/index.d.ts +2 -3
  24. package/dist/providers/index.d.ts.map +1 -1
  25. package/dist/providers/index.js +5 -1
  26. package/dist/providers/index.js.map +1 -1
  27. package/dist/providers/opencode.d.ts +17 -0
  28. package/dist/providers/opencode.d.ts.map +1 -0
  29. package/dist/providers/opencode.js +125 -0
  30. package/dist/providers/opencode.js.map +1 -0
  31. package/dist/providers/types.d.ts +1 -6
  32. package/dist/providers/types.d.ts.map +1 -1
  33. package/dist/run-cli-proxy.d.ts.map +1 -1
  34. package/dist/run-cli-proxy.js +3 -3
  35. package/dist/run-cli-proxy.js.map +1 -1
  36. package/dist/utils.d.ts +2 -0
  37. package/dist/utils.d.ts.map +1 -0
  38. package/dist/utils.js +12 -0
  39. package/dist/utils.js.map +1 -0
  40. package/package.json +1 -1
package/README.md CHANGED
@@ -42,25 +42,7 @@ invocation starts from wherever you ran it, so to reuse your saved login next
42
42
  time, run it from the **same directory** every time. To keep data elsewhere,
43
43
  pass `--data-dir`.
44
44
 
45
- ## How it works
46
45
 
47
- ```
48
- useclaudeproxy --model <model>
49
-
50
- ├─ app() (src/app.ts) — high-level orchestrator, provider-agnostic
51
- │ ├─ getProvider(--provider) resolve hermes (default)
52
- │ ├─ --renew → provider.clearStoredToken()
53
- │ ├─ provider.getValidToken() delegate auth to the provider
54
- │ ├─ setProxyUrl() apply --proxy to tools/config.yaml
55
- │ └─ runCliProxy() spawn cli-proxy-api -config tools/config.yaml
56
- │ + provider.startTokenWatcher() validate + renew token while running
57
-
58
- └─ HermesProvider owns the full token lifecycle (src/providers/hermes.ts)
59
- ├─ readStoredToken() ─► fetchAccountInfo() validate stored token
60
- ├─ refreshToken() renew when refresh token valid
61
- ├─ requestDeviceCode()/pollForToken() re-authenticate via device flow
62
- └─ saveTokens() persist (mode 0o600) at data/hermes-tokens.json
63
- ```
64
46
 
65
47
  Tokens are persisted inside the provider's own file — Hermes uses
66
48
  `data/hermes-tokens.json` (mode `0o600`). The token path is **provider-specific**,
@@ -89,6 +71,21 @@ useclaudeproxy --model stealth/ox-alpha
89
71
  useclaudeproxy --proxy http://127.0.0.1:2080 --model stealth/ox-alpha
90
72
  ```
91
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
+
92
89
  On success the CLI prints the env vars to point Claude Code at the local proxy:
93
90
 
94
91
  ```bash
@@ -104,7 +101,7 @@ These work in **any position** — before or after the command.
104
101
  | Flag | Default | Notes |
105
102
  | ------------------- | ------------------ | ------------------------------------------------------------- |
106
103
  | `--model <model>` | _(required)_ | Model name to expose in OpenAI compatibility. |
107
- | `--provider <name>` | `hermes` | OAuth provider to use (hermes only, for now). |
104
+ | `--provider <name>` | `hermes` | OAuth provider to use (`hermes` \| `opencode`). |
108
105
  | `--node-env <env>` | `development` | `development` \| `production`. |
109
106
  | `--debug <ns>` | `useclaudeproxy:*` | `debug` namespaces, e.g. `useclaudeproxy:oauth`. |
110
107
  | `--data-dir <dir>` | `data` | Token storage directory. |
@@ -129,8 +126,9 @@ useclaudeproxy --model stealth/ox-alpha --data-dir ~/.useclaudeproxy --debug use
129
126
  - Two independent "proxy" concepts: the TS app's OAuth calls can use an outbound
130
127
  proxy (`--proxy`), and the binary has its own separate `proxy-url` for upstream
131
128
  provider traffic. They do not affect each other.
132
- - Providers are pluggable. `hermes` is registered in `src/providers/index.ts`;
133
- add another by implementing the `Provider` interface in `src/providers/types.ts`.
129
+ - Providers are pluggable. `hermes` and `opencode` are registered in
130
+ `src/providers/index.ts`; add another by implementing `BaseProvider` in
131
+ `src/providers/`.
134
132
 
135
133
  ## License
136
134
 
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AASA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBzC"}
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,14 +1,17 @@
1
1
  import Debug from "debug";
2
2
  import { args } from "./args.js";
3
- import { setProxyUrl } from "./config-yaml.js";
3
+ import { ensureCliProxy } from "./install-cli-proxy.js";
4
4
  import { getProvider } from "./providers/index.js";
5
5
  import { runCliProxy } from "./run-cli-proxy.js";
6
6
  const log = Debug("useclaudeproxy:oauth");
7
7
  const errorLog = Debug("useclaudeproxy:oauth:error");
8
8
  export async function app() {
9
9
  const provider = getProvider(args.activeProvider);
10
- await provider.getValidToken();
11
- setProxyUrl(args.proxy);
10
+ await ensureCliProxy();
11
+ if (args.renew)
12
+ process.exit(0);
13
+ provider.initConfig();
14
+ provider.logConfigInfo();
12
15
  runCliProxy()
13
16
  .then((code) => process.exit(code))
14
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,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAiB,MAAM,sBAAsB,CAAC;AAClE,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,GAAa,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAE5D,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;IAE/B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,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,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
@@ -1,8 +1,6 @@
1
1
  export declare const PROVIDERS: string[];
2
2
  interface CliArgs {
3
3
  force: boolean;
4
- nodeEnv: string;
5
- debug: string;
6
4
  dataDir: string;
7
5
  proxy: string;
8
6
  renew: boolean;
@@ -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,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;AAiED,eAAO,MAAM,IAAI,SAAM,CAAC"}
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
- .requiredOption("--model <model>", "model name to expose in openai-compatibility")
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 = opts.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;AAgBvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,kBAAkB,EAAE,0BAA0B,EAAE,aAAa,CAAC;KACrE,MAAM,CACL,cAAc,EACd,2CAA2C,EAC3C,kBAAkB,CACnB;KACA,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,CAAC;KAC7D,cAAc,CACb,iBAAiB,EACjB,8CAA8C,CAC/C;KACA,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,MAAM,GAAG,GAAY;IACnB,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,aAAa;IACtB,KAAK,EAAE,kBAAkB;IACzB,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,EAWxB,CAAC;AAEF,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AAC/B,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;AAC3B,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AACvB,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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,MAAM;;;;EAAgC,CAAC;AACpD,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC"}
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: args.nodeEnv,
11
+ NODE_ENV: process.env.NODE_ENV,
14
12
  DATA_DIR: args.dataDir,
15
- DEBUG: args.debug,
13
+ DEBUG: process.env.DEBUG,
16
14
  });
17
15
  if (!parsedEnv.success) {
18
16
  console.error("❌ Invalid arguments:");
@@ -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,6EAA6E;AAC7E,uDAAuD;AACvD,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,IAAI,CAAC,OAAO;IACtB,QAAQ,EAAE,IAAI,CAAC,OAAO;IACtB,KAAK,EAAE,IAAI,CAAC,KAAK;CAClB,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
+ {"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":"AA8EA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA0CpD;AAsBD,wBAAgB,YAAY,IAAI,IAAI,CASnC"}
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.142";
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() {
@@ -77,10 +77,7 @@ export async function ensureCliProxy() {
77
77
  const archivePath = path.join(TOOLS_DIR, asset);
78
78
  const provider = getProvider(args.activeProvider);
79
79
  if (args.renew) {
80
- if (fs.existsSync(provider.tokenPath)) {
81
- fs.rmSync(provider.tokenPath, { force: true });
82
- log("--renew: cleared stored token, will re-run device flow");
83
- }
80
+ provider.clearStoredToken();
84
81
  renewFromArchive(archivePath);
85
82
  return;
86
83
  }
@@ -123,7 +120,6 @@ function renewFromArchive(archivePath) {
123
120
  extract(archivePath, TOOLS_DIR);
124
121
  log("Renewed CLIProxyAPI from %s", archivePath);
125
122
  createConfig();
126
- args.renew = false;
127
123
  }
128
124
  export function createConfig() {
129
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":"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"}
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 type { Provider } from "./types.ts";
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 implements Provider {
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
- clearStoredToken(): void;
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":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA8B3C,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;AAmJF,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,SAAS,SAAe;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IAEjD,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,CAwB5C;IAEK,iBAAiB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB3D;YAEa,cAAc;YAMd,aAAa;IAqB3B,gBAAgB,IAAI,IAAI,CAKvB;IAED,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,UAAU;IAiDlB,OAAO,CAAC,SAAS;CASlB;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
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"}
@@ -1,29 +1,21 @@
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";
6
5
  import { readConfig, writeConfig } from "../config-yaml.js";
7
6
  import { config } from "../config.js";
8
7
  import { createOAuthHttpClient } from "../http-client.js";
9
- import { createConfig } from "../install-cli-proxy.js";
10
8
  import { AccessDeniedError } from "../types.js";
11
- const log = Debug("useclaudeproxy:oauth");
12
- const errorLog = Debug("useclaudeproxy:oauth:error");
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");
13
13
  const POLL_INTERVAL_MS = 7000;
14
14
  const WATCH_INTERVAL_MS = 7000;
15
- const TOKENS_PATH = path.join(config.DATA_DIR, "hermes-tokens.json");
16
15
  const FORM_HEADERS = {
17
16
  "Content-Type": "application/x-www-form-urlencoded",
18
17
  Accept: "application/json",
19
18
  };
20
- const OAUTH = {
21
- baseUrl: "https://portal.nousresearch.com/api/oauth",
22
- clientId: "hermes-cli",
23
- scope: "inference:invoke",
24
- grantType: "urn:ietf:params:oauth:grant-type:device_code",
25
- refreshTokenHeader: "X-Nous-Refresh-Token",
26
- };
27
19
  class OAuthHttpError extends Error {
28
20
  statusCode;
29
21
  body;
@@ -42,14 +34,21 @@ class DeviceCodeExpiredError extends Error {
42
34
  }
43
35
  class HermesDeviceFlowClient {
44
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
+ };
45
44
  constructor(http = createOAuthHttpClient()) {
46
45
  this.http = http;
47
46
  }
48
47
  async requestDeviceCode() {
49
48
  log("Requesting device code");
50
- const response = await this.http.post(`${OAUTH.baseUrl}/device/code`, {
49
+ const response = await this.http.post(`${this.OAUTH.baseUrl}/device/code`, {
51
50
  headers: FORM_HEADERS,
52
- body: `client_id=${OAUTH.clientId}&scope=${encodeURIComponent(OAUTH.scope)}`,
51
+ body: `client_id=${this.OAUTH.clientId}&scope=${encodeURIComponent(this.OAUTH.scope)}`,
53
52
  });
54
53
  return this.parseOrThrow(response, "Failed to get device code");
55
54
  }
@@ -57,9 +56,9 @@ class HermesDeviceFlowClient {
57
56
  log("Polling for token");
58
57
  while (true) {
59
58
  await sleep(POLL_INTERVAL_MS);
60
- const response = await this.http.post(`${OAUTH.baseUrl}/token`, {
59
+ const response = await this.http.post(`${this.OAUTH.baseUrl}/token`, {
61
60
  headers: FORM_HEADERS,
62
- 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}`,
63
62
  });
64
63
  if (response.statusCode === 200)
65
64
  return parseBody(response);
@@ -72,15 +71,18 @@ class HermesDeviceFlowClient {
72
71
  }
73
72
  async refreshToken(refreshToken) {
74
73
  log("Refreshing access token");
75
- const response = await this.http.post(`${OAUTH.baseUrl}/token`, {
76
- headers: { ...FORM_HEADERS, [OAUTH.refreshTokenHeader]: refreshToken },
77
- body: `grant_type=refresh_token&client_id=${OAUTH.clientId}`,
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}`,
78
80
  });
79
81
  return this.parseOrThrow(response, "Failed to refresh token");
80
82
  }
81
83
  async fetchAccountInfo(accessToken) {
82
84
  log("Fetching account information");
83
- const response = await this.http.get(`${OAUTH.baseUrl}/account`, {
85
+ const response = await this.http.get(`${this.OAUTH.baseUrl}/account`, {
84
86
  headers: {
85
87
  Authorization: `Bearer ${accessToken}`,
86
88
  Accept: "application/json",
@@ -113,21 +115,39 @@ function parseBody(response) {
113
115
  ? JSON.parse(response.body)
114
116
  : response.body;
115
117
  }
116
- function sleep(ms, signal) {
117
- return new Promise((resolve) => {
118
- if (signal?.aborted)
119
- return resolve();
120
- const t = setTimeout(resolve, ms);
121
- signal?.addEventListener("abort", () => {
122
- clearTimeout(t);
123
- resolve();
124
- }, { once: true });
125
- });
126
- }
127
- export class HermesProvider {
118
+ export class HermesProvider extends BaseProvider {
128
119
  name = "hermes";
129
- tokenPath = TOKENS_PATH;
120
+ baseUrl = "https://inference-api.nousresearch.com/v1";
121
+ tokenPath = path.join(config.DATA_DIR, "hermes-tokens.json");
130
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
+ }
131
151
  async getValidToken() {
132
152
  const stored = this.readStoredToken();
133
153
  if (stored) {
@@ -156,29 +176,21 @@ export class HermesProvider {
156
176
  async startTokenWatcher(signal) {
157
177
  log("Watching token every %dms", WATCH_INTERVAL_MS);
158
178
  let current = (await this.getValidToken()).access_token;
159
- let printed = false;
160
179
  while (!signal?.aborted) {
161
180
  try {
162
- const account = await this.getAccountInfo(current);
163
- if (!printed) {
164
- printed = true;
165
- log("Account Information:\n" + JSON.stringify(account, null, 2));
166
- }
181
+ const account = await this.client.fetchAccountInfo(current);
182
+ // log("Account Information:", account);
167
183
  log("Token valid");
168
184
  }
169
185
  catch (err) {
170
186
  errorLog("Token invalid, renewing: %o", err);
171
187
  const refreshed = await this.getValidToken();
172
188
  current = refreshed.access_token;
173
- printed = false;
174
189
  log(`Token RENEWED (expires_in=${refreshed.expires_in})`);
175
190
  }
176
191
  await sleep(WATCH_INTERVAL_MS, signal);
177
192
  }
178
193
  }
179
- async getAccountInfo(accessToken) {
180
- return this.client.fetchAccountInfo(accessToken);
181
- }
182
194
  async runDeviceFlow() {
183
195
  const deviceCode = await this.client.requestDeviceCode();
184
196
  log("Device code received: user_code=%s", deviceCode.user_code);
@@ -187,82 +199,13 @@ export class HermesProvider {
187
199
  console.log(`Opened ${verificationUrl}. If it didn't open, enter code ${deviceCode.user_code} there.`);
188
200
  const token = await this.client.pollForToken(deviceCode.device_code);
189
201
  log("Authorization successful");
190
- createConfig();
191
- this.initConfig(args.model);
192
202
  this.saveTokens(token);
193
203
  return token;
194
204
  }
195
- clearStoredToken() {
196
- if (fs.existsSync(TOKENS_PATH)) {
197
- fs.rmSync(TOKENS_PATH, { force: true });
198
- log("Cleared stored token");
199
- }
200
- }
201
- readStoredToken() {
202
- if (!fs.existsSync(TOKENS_PATH))
203
- return undefined;
204
- try {
205
- return JSON.parse(fs.readFileSync(TOKENS_PATH, "utf8"));
206
- }
207
- catch {
208
- return undefined;
209
- }
210
- }
211
205
  saveTokens(token) {
212
- fs.writeFileSync(TOKENS_PATH, JSON.stringify(token, null, 2), {
213
- mode: 0o600,
214
- });
206
+ super.saveTokens(token);
215
207
  this.setApiKey(token.access_token);
216
208
  }
217
- initConfig(model) {
218
- const config = readConfig();
219
- config["host"] = "127.0.0.1";
220
- config["api-keys"] = ["456789"];
221
- config["openai-compatibility"] = [{ name: "Hermes" }];
222
- const api = config["openai-compatibility"][0];
223
- api["base-url"] = "https://inference-api.nousresearch.com/v1";
224
- api["models"] = [
225
- { name: model, alias: "claude-opus-5" },
226
- { name: model, alias: "" },
227
- ];
228
- api["headers"] = {
229
- "User-Agent": "OpenAI/Python 2.24.0",
230
- "X-Stainless-Arch": "x64",
231
- "X-Stainless-Async": "false",
232
- "X-Stainless-Lang": "python",
233
- "X-Stainless-Os": "Linux",
234
- "X-Stainless-Package-Version": "2.24.0",
235
- "X-Stainless-Read-Timeout": "30.0",
236
- "X-Stainless-Retry-Count": "0",
237
- "X-Stainless-Runtime": "CPython",
238
- "X-Stainless-Runtime-Version": "3.11.15",
239
- };
240
- api["disable-cooling"] = true;
241
- const text = `
242
- #API-KEY: ${config["api-keys"]}
243
- OpenAI-compatible: http://127.0.0.1:${config["port"]}/v1
244
- Anthropic-compatible: http://127.0.0.1:${config["port"]}
245
- Gemini-compatible: http://127.0.0.1:${config["port"]}
246
-
247
- Model >>> Alias:
248
- ${model} >>> claude-opus-5
249
- ${model} >>>
250
-
251
- [ClaudeCode]
252
- export ANTHROPIC_MODEL=claude-opus-5
253
- export ANTHROPIC_BASE_URL=http://127.0.0.1:${config["port"]}
254
- export ANTHROPIC_AUTH_TOKEN=${config["api-keys"]}
255
- `;
256
- console.log(text);
257
- writeConfig(config);
258
- }
259
- setApiKey(apiKey) {
260
- const config = readConfig();
261
- const api = config["openai-compatibility"][0];
262
- api["api-key-entries"] = [{ "api-key": apiKey }];
263
- api["headers"]["Authorization"] = `Bearer ${apiKey}`;
264
- writeConfig(config);
265
- }
266
209
  }
267
210
  export const hermesProvider = new HermesProvider();
268
211
  //# sourceMappingURL=hermes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../src/providers/hermes.ts"],"names":[],"mappings":"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"}
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 { Provider } from "./types.ts";
2
- export declare function getProvider(name: string): Provider;
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":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAQlD;AAED,eAAO,MAAM,cAAc,UAAuB,CAAC;AAEnD,YAAY,EAAE,QAAQ,EAAE,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;AASvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAQtD;AAED,eAAO,MAAM,cAAc,UAAuB,CAAC"}
@@ -1,5 +1,9 @@
1
1
  import { hermesProvider } from "./hermes.js";
2
- const registry = new Map([["hermes", hermesProvider]]);
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":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAmB,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;AAEzE,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;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,7 +1,2 @@
1
- export interface Provider {
2
- readonly name: string;
3
- readonly tokenPath: string;
4
- getValidToken(): Promise<unknown>;
5
- startTokenWatcher(signal?: AbortSignal): Promise<void>;
6
- }
1
+ export {};
7
2
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,iBAAiB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD"}
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,CAc3E"}
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"}
@@ -1,15 +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 { CONFIG_PATH } from "./config-yaml.js";
5
- import { ensureCliProxy } from "./install-cli-proxy.js";
4
+ import { args } from "./args.js";
5
+ import { CONFIG_PATH, setProxyUrl } from "./config-yaml.js";
6
6
  const log = Debug("app:run");
7
7
  const BINARY = path.join(import.meta.dirname, "..", "tools", "cli-proxy-api");
8
8
  // Spawns the extracted binary with tools/config.yaml. `proxyArgs` are passed
9
9
  // through verbatim (e.g. --tui, --standalone). Inherits stdio and forwards
10
10
  // signals so the user drives it directly (Ctrl+C shuts the server down).
11
11
  export async function runCliProxy(proxyArgs = []) {
12
- await ensureCliProxy();
12
+ setProxyUrl(args.proxy);
13
13
  const argv = [BINARY, "-config", CONFIG_PATH, ...proxyArgs];
14
14
  log("Spawning: %s", argv.join(" "));
15
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;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,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,MAAM,cAAc,EAAE,CAAC;IACvB,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"}
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"}
@@ -0,0 +1,2 @@
1
+ export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -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": "1.1.1",
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",