tokenmix 0.2.2 → 0.3.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 (42) hide show
  1. package/README.md +11 -2
  2. package/dist/agents/aider.js +24 -3
  3. package/dist/agents/aider.js.map +1 -1
  4. package/dist/agents/claude.js +59 -4
  5. package/dist/agents/claude.js.map +1 -1
  6. package/dist/agents/kilo.js +2 -0
  7. package/dist/agents/kilo.js.map +1 -1
  8. package/dist/agents/opencode.js +29 -0
  9. package/dist/agents/opencode.js.map +1 -1
  10. package/dist/api/client.js +12 -6
  11. package/dist/api/client.js.map +1 -1
  12. package/dist/cli.js +5 -55
  13. package/dist/cli.js.map +1 -1
  14. package/dist/commands/agent-runner.js +60 -23
  15. package/dist/commands/agent-runner.js.map +1 -1
  16. package/dist/commands/balance.js +5 -4
  17. package/dist/commands/balance.js.map +1 -1
  18. package/dist/commands/doctor.js +11 -10
  19. package/dist/commands/doctor.js.map +1 -1
  20. package/dist/commands/list.js +19 -9
  21. package/dist/commands/list.js.map +1 -1
  22. package/dist/commands/login.js +24 -20
  23. package/dist/commands/login.js.map +1 -1
  24. package/dist/commands/logout.js +21 -1
  25. package/dist/commands/logout.js.map +1 -1
  26. package/dist/commands/models.js +24 -12
  27. package/dist/commands/models.js.map +1 -1
  28. package/dist/commands/topup.js +4 -3
  29. package/dist/commands/topup.js.map +1 -1
  30. package/dist/config/store.js +1 -1
  31. package/dist/config/store.js.map +1 -1
  32. package/dist/i18n/index.js +33 -0
  33. package/dist/i18n/index.js.map +1 -0
  34. package/dist/i18n/messages.js +156 -0
  35. package/dist/i18n/messages.js.map +1 -0
  36. package/dist/program.js +61 -0
  37. package/dist/program.js.map +1 -0
  38. package/dist/utils/browser.js +12 -0
  39. package/dist/utils/browser.js.map +1 -1
  40. package/dist/utils/prompt.js +3 -2
  41. package/dist/utils/prompt.js.map +1 -1
  42. package/package.json +17 -8
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Zero-config CLI to use any open-source coding agent with [TokenMix](https://tokenmix.ai) as the unified LLM backend.
4
4
 
5
- One account, one balance, 75+ models routed automatically across Claude / GPT / Gemini / DeepSeek / Qwen / Moonshot / ...
5
+ One account, one balance, 160+ models routed automatically across Claude / GPT / Gemini / DeepSeek / Qwen / Moonshot / ...
6
6
 
7
7
  ## Quick Start
8
8
 
@@ -37,7 +37,7 @@ npx tokenmix login --key sk-tm-... # supply API key directly (for CI
37
37
 
38
38
  ```
39
39
  tokenmix login [--key sk-tm-xxx] Log in
40
- tokenmix logout Remove credentials
40
+ tokenmix logout Remove credentials (and revert injected agent config)
41
41
  tokenmix balance Open dashboard to view balance
42
42
  tokenmix topup Open browser to top up
43
43
  tokenmix models [--type chat] List available models with prices
@@ -50,6 +50,15 @@ tokenmix aider [args...] Launch Aider via TokenMix
50
50
  tokenmix kilo Print Kilo Code configuration
51
51
  ```
52
52
 
53
+ ## Language
54
+
55
+ The CLI speaks **English and 中文**, auto-detected from your system locale. Force it explicitly with `TOKENMIX_LANG`:
56
+
57
+ ```bash
58
+ TOKENMIX_LANG=zh npx tokenmix doctor # 中文
59
+ TOKENMIX_LANG=en npx tokenmix doctor # English
60
+ ```
61
+
53
62
  ## Configuration Location
54
63
 
55
64
  Your TokenMix credentials are stored locally at:
@@ -40,10 +40,31 @@ async function configure(apiKey, baseUrl, defaultModel) {
40
40
  ],
41
41
  };
42
42
  }
43
+ // Aider lets you pick a model with --model OR one of its built-in alias flags
44
+ // (--sonnet, --opus, ...). If the user used any of them, we must not inject our
45
+ // own --model on top, which would be a conflicting second model specifier.
46
+ const AIDER_MODEL_ALIAS_FLAGS = new Set([
47
+ '--sonnet',
48
+ '--opus',
49
+ '--haiku',
50
+ '--4o',
51
+ '--4',
52
+ '--mini',
53
+ '--35turbo',
54
+ '--deepseek',
55
+ '--o1',
56
+ '--o1-mini',
57
+ '--o3',
58
+ '--o3-mini',
59
+ '--gemini',
60
+ '--gemini-exp',
61
+ ]);
62
+ export function userSelectedModel(args) {
63
+ return args.some((a) => a === '--model' || a.startsWith('--model=') || AIDER_MODEL_ALIAS_FLAGS.has(a));
64
+ }
43
65
  async function launch(args, env) {
44
- // Inject --model only if user didn't supply one.
45
- const hasModel = args.some((a) => a === '--model' || a.startsWith('--model='));
46
- const finalArgs = hasModel
66
+ // Inject our default --model only if the user didn't already pick a model.
67
+ const finalArgs = userSelectedModel(args)
47
68
  ? args
48
69
  : ['--model', `openai/${env.TOKENMIX_DEFAULT_MODEL ?? 'claude-sonnet-4.6'}`, ...args];
49
70
  await run(AIDER_BIN, finalArgs, { env });
@@ -1 +1 @@
1
- {"version":3,"file":"aider.js","sourceRoot":"","sources":["../../src/agents/aider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEjE,MAAM,SAAS,GAAG,OAAO,CAAA;AAEzB,KAAK,UAAU,YAAY;IACzB,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAA;IAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,EAAE,GAAG,CAAC,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC9E,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,IAAI,EACF,6HAA6H;aAChI,CAAA;QACH,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,wBAAwB,CAAA;QAC9E,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,IAAI,EACF,8DAA8D,UAAU,6HAA6H;SACxM,CAAA;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;QACpD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IAC5B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,MAAc,EACd,OAAe,EACf,YAAoB;IAEpB,4EAA4E;IAC5E,sFAAsF;IACtF,OAAO;QACL,OAAO,EAAE;YACP,cAAc,EAAE,MAAM;YACtB,eAAe,EAAE,GAAG,OAAO,KAAK;YAChC,sBAAsB,EAAE,YAAY;SACrC;QACD,KAAK,EAAE;YACL,yDAAyD;YACzD,yBAAyB,YAAY,2BAA2B;SACjE;KACF,CAAA;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,GAA2B;IAC/D,iDAAiD;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;IAC9E,MAAM,SAAS,GAAG,QAAQ;QACxB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,GAAG,CAAC,sBAAsB,IAAI,mBAAmB,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;IACvF,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAoB;IACzC,EAAE,EAAE,OAAO;IACX,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,2DAA2D;IACxE,WAAW,EAAE,UAAU;IACvB,YAAY;IACZ,SAAS;IACT,MAAM;CACP,CAAA"}
1
+ {"version":3,"file":"aider.js","sourceRoot":"","sources":["../../src/agents/aider.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,14 @@ async function configure(apiKey, baseUrl, _defaultModel) {
38
38
  // first run
39
39
  }
40
40
  const existingEnv = existing.env || {};
41
+ // Detect that we're about to overwrite a user's OWN (non-tokenmix) Anthropic
42
+ // setup — e.g. a Claude Pro/Max OAuth or a personal sk-ant- key. We still
43
+ // proceed (they explicitly asked to use Claude Code via TokenMix), but warn
44
+ // so it isn't a silent hijack of their primary tool.
45
+ const prevKey = existingEnv.ANTHROPIC_API_KEY;
46
+ const prevBase = existingEnv.ANTHROPIC_BASE_URL;
47
+ const replacingForeign = (typeof prevKey === 'string' && prevKey.length > 0 && !prevKey.startsWith('sk-tm-')) ||
48
+ (typeof prevBase === 'string' && prevBase.length > 0 && !/tokenmix/i.test(prevBase));
41
49
  const next = {
42
50
  ...existing,
43
51
  env: {
@@ -54,21 +62,67 @@ async function configure(apiKey, baseUrl, _defaultModel) {
54
62
  catch {
55
63
  // ignore
56
64
  }
65
+ const notes = [
66
+ 'Available Claude models via tokenmix: claude-opus-4.7, claude-sonnet-4.6, claude-haiku-4.5',
67
+ 'Run `tokenmix models --type chat` for the full list.',
68
+ ];
69
+ if (replacingForeign) {
70
+ notes.unshift('⚠ Replaced your existing Anthropic settings in ~/.claude/settings.json.', ' `tokenmix logout` removes TokenMix\'s entries (your old key cannot be auto-restored).', '');
71
+ }
57
72
  return {
58
73
  configPath: settingsPath,
59
74
  envVars: {
60
75
  ANTHROPIC_BASE_URL: baseUrl,
61
76
  ANTHROPIC_API_KEY: apiKey,
62
77
  },
63
- notes: [
64
- 'Available Claude models via tokenmix: claude-opus-4.7, claude-sonnet-4.6, claude-haiku-4.5',
65
- 'Run `tokenmix models --type chat` for the full list.',
66
- ],
78
+ notes,
67
79
  };
68
80
  }
69
81
  async function launch(args, env) {
70
82
  await run(CLAUDE_BIN, args, { env });
71
83
  }
84
+ // Remove the ANTHROPIC_* env we injected, leaving everything else in
85
+ // settings.json untouched. Only acts when the config looks like ours (tokenmix
86
+ // key or base URL) so we never clobber a user's own Anthropic credentials.
87
+ async function cleanup() {
88
+ const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
89
+ let existing;
90
+ try {
91
+ existing = JSON.parse(await fs.readFile(settingsPath, 'utf-8'));
92
+ }
93
+ catch {
94
+ return { reverted: false };
95
+ }
96
+ const env = existing.env;
97
+ if (!env || typeof env !== 'object') {
98
+ return { reverted: false, configPath: settingsPath };
99
+ }
100
+ const key = env.ANTHROPIC_API_KEY;
101
+ const base = env.ANTHROPIC_BASE_URL;
102
+ const ours = (typeof key === 'string' && key.startsWith('sk-tm-')) ||
103
+ (typeof base === 'string' && /tokenmix/i.test(base));
104
+ if (!ours) {
105
+ return { reverted: false, configPath: settingsPath };
106
+ }
107
+ delete env.ANTHROPIC_API_KEY;
108
+ delete env.ANTHROPIC_BASE_URL;
109
+ if (Object.keys(env).length === 0)
110
+ delete existing.env;
111
+ else
112
+ existing.env = env;
113
+ await fs.writeFile(settingsPath, JSON.stringify(existing, null, 2));
114
+ try {
115
+ await fs.chmod(settingsPath, 0o600);
116
+ }
117
+ catch {
118
+ // ignore
119
+ }
120
+ return {
121
+ reverted: true,
122
+ configPath: settingsPath,
123
+ note: 'If you had your own ANTHROPIC_API_KEY here before, re-add it.',
124
+ };
125
+ }
72
126
  export const ClaudeCodeAgent = {
73
127
  id: 'claude',
74
128
  displayName: 'Claude Code',
@@ -78,5 +132,6 @@ export const ClaudeCodeAgent = {
78
132
  install,
79
133
  configure,
80
134
  launch,
135
+ cleanup,
81
136
  };
82
137
  //# sourceMappingURL=claude.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,8 @@ async function configure(apiKey, baseUrl, defaultModel) {
33
33
  openAiApiKey: apiKey,
34
34
  defaultModelId: defaultModel,
35
35
  }, null, 2),
36
+ '',
37
+ 'Keep this API key private — anyone with it can spend your TokenMix balance.',
36
38
  ],
37
39
  };
38
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"kilo.js","sourceRoot":"","sources":["../../src/agents/kilo.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,KAAK,UAAU,YAAY;IACzB,8EAA8E;IAC9E,gFAAgF;IAChF,2EAA2E;IAC3E,iDAAiD;IACjD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;IACxC,OAAO;QACL,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,IAAI;YACR,CAAC,CAAC,kGAAkG;YACpG,CAAC,CAAC,4GAA4G;KACjH,CAAA;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,MAAc,EACd,OAAe,EACf,YAAoB;IAEpB,6DAA6D;IAC7D,8EAA8E;IAC9E,OAAO;QACL,KAAK,EAAE;YACL,mEAAmE;YACnE,yCAAyC;YACzC,EAAE;YACF,oCAAoC;YACpC,oBAAoB,OAAO,KAAK;YAChC,oBAAoB,MAAM,EAAE;YAC5B,oBAAoB,YAAY,EAAE;YAClC,EAAE;YACF,mFAAmF;YACnF,EAAE;YACF,IAAI,CAAC,SAAS,CACZ;gBACE,QAAQ,EAAE,mBAAmB;gBAC7B,aAAa,EAAE,GAAG,OAAO,KAAK;gBAC9B,YAAY,EAAE,MAAM;gBACpB,cAAc,EAAE,YAAY;aAC7B,EACD,IAAI,EACJ,CAAC,CACF;SACF;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAoB;IACxC,EAAE,EAAE,MAAM;IACV,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,oDAAoD;IACjE,WAAW,EAAE,eAAe;IAC5B,YAAY;IACZ,SAAS;CACV,CAAA"}
1
+ {"version":3,"file":"kilo.js","sourceRoot":"","sources":["../../src/agents/kilo.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,KAAK,UAAU,YAAY;IACzB,8EAA8E;IAC9E,gFAAgF;IAChF,2EAA2E;IAC3E,iDAAiD;IACjD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;IACxC,OAAO;QACL,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,IAAI;YACR,CAAC,CAAC,kGAAkG;YACpG,CAAC,CAAC,4GAA4G;KACjH,CAAA;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,MAAc,EACd,OAAe,EACf,YAAoB;IAEpB,6DAA6D;IAC7D,8EAA8E;IAC9E,OAAO;QACL,KAAK,EAAE;YACL,mEAAmE;YACnE,yCAAyC;YACzC,EAAE;YACF,oCAAoC;YACpC,oBAAoB,OAAO,KAAK;YAChC,oBAAoB,MAAM,EAAE;YAC5B,oBAAoB,YAAY,EAAE;YAClC,EAAE;YACF,mFAAmF;YACnF,EAAE;YACF,IAAI,CAAC,SAAS,CACZ;gBACE,QAAQ,EAAE,mBAAmB;gBAC7B,aAAa,EAAE,GAAG,OAAO,KAAK;gBAC9B,YAAY,EAAE,MAAM;gBACpB,cAAc,EAAE,YAAY;aAC7B,EACD,IAAI,EACJ,CAAC,CACF;YACD,EAAE;YACF,6EAA6E;SAC9E;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAoB;IACxC,EAAE,EAAE,MAAM;IACV,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,oDAAoD;IACjE,WAAW,EAAE,eAAe;IAC5B,YAAY;IACZ,SAAS;CACV,CAAA"}
@@ -78,6 +78,34 @@ async function configure(apiKey, baseUrl, defaultModel) {
78
78
  async function launch(args) {
79
79
  await run(OPENCODE_BIN, args);
80
80
  }
81
+ // Remove the tokenmix provider (and our default model pin) from opencode.json,
82
+ // preserving any other providers or a user-chosen model.
83
+ async function cleanup() {
84
+ const filePath = configPath();
85
+ let existing;
86
+ try {
87
+ existing = JSON.parse(await fs.readFile(filePath, 'utf-8'));
88
+ }
89
+ catch {
90
+ return { reverted: false };
91
+ }
92
+ let changed = false;
93
+ const provider = existing.provider;
94
+ if (provider && 'tokenmix' in provider) {
95
+ delete provider.tokenmix;
96
+ changed = true;
97
+ if (Object.keys(provider).length === 0)
98
+ delete existing.provider;
99
+ }
100
+ if (typeof existing.model === 'string' && existing.model.startsWith('tokenmix/')) {
101
+ delete existing.model;
102
+ changed = true;
103
+ }
104
+ if (!changed)
105
+ return { reverted: false, configPath: filePath };
106
+ await fs.writeFile(filePath, JSON.stringify(existing, null, 2));
107
+ return { reverted: true, configPath: filePath };
108
+ }
81
109
  export const OpenCodeAgent = {
82
110
  id: 'opencode',
83
111
  displayName: 'OpenCode',
@@ -87,5 +115,6 @@ export const OpenCodeAgent = {
87
115
  install,
88
116
  configure,
89
117
  launch,
118
+ cleanup,
90
119
  };
91
120
  //# sourceMappingURL=opencode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import axios from 'axios';
2
- import { readConfig, apiBaseUrl } from '../config/store.js';
2
+ import { readConfig, apiBaseUrl, DEFAULT_API_BASE } from '../config/store.js';
3
3
  export class ApiError extends Error {
4
4
  status;
5
5
  constructor(status, message) {
@@ -7,7 +7,7 @@ export class ApiError extends Error {
7
7
  this.status = status;
8
8
  }
9
9
  }
10
- function unwrap(resp) {
10
+ export function unwrap(resp) {
11
11
  const body = resp.data;
12
12
  if (body && typeof body.code === 'number' && body.code !== 0) {
13
13
  throw new ApiError(0, body.message || 'API error');
@@ -22,7 +22,7 @@ function handleAxios(err) {
22
22
  e.message;
23
23
  throw new ApiError(e.response.status, msg);
24
24
  }
25
- throw new ApiError(0, e.message || 'network error');
25
+ throw new ApiError(0, `Could not reach the TokenMix API (${e.message || 'network error'}). Check your internet connection.`);
26
26
  }
27
27
  // Public endpoint, no auth required.
28
28
  // Note: backend pagination uses `per_page` (NOT `page_size`); max 500 (anything >500 falls back to 20).
@@ -45,7 +45,7 @@ export async function listPublicModels(cfg) {
45
45
  // A 200 implies the key is valid and not revoked/expired/over-quota.
46
46
  export async function verifyApiKey(apiKey, baseUrl) {
47
47
  try {
48
- const r = await axios.get(`${baseUrl || 'https://api.tokenmix.ai'}/v1/models`, {
48
+ const r = await axios.get(`${baseUrl || DEFAULT_API_BASE}/v1/models`, {
49
49
  headers: { Authorization: `Bearer ${apiKey}` },
50
50
  timeout: 15000,
51
51
  });
@@ -71,12 +71,18 @@ export async function startDeviceAuthorization(baseUrl, clientName = 'tokenmix-c
71
71
  handleAxios(err);
72
72
  }
73
73
  }
74
+ // RFC 8628 defaults, used when the server omits these fields — and to guard
75
+ // against a missing/0/NaN interval that would otherwise busy-loop, or a missing
76
+ // expires_in that would make the loop time out immediately.
77
+ const DEFAULT_POLL_INTERVAL_S = 5;
78
+ const DEFAULT_EXPIRES_IN_S = 900;
74
79
  // Poll until approved, denied, or expired. Returns the API key when approved.
75
80
  // Throws DeviceFlowError with code ∈ {expired_token, access_denied, api_key_limit_reached, timeout} on terminal failures.
76
81
  // onTick is called once per polling iteration with the seconds remaining (for progress display).
77
82
  export async function pollDeviceToken(baseUrl, auth, onTick) {
78
- let intervalMs = Math.max(1, auth.interval) * 1000;
79
- const deadline = Date.now() + auth.expires_in * 1000;
83
+ let intervalMs = Math.max(1, Number(auth.interval) || DEFAULT_POLL_INTERVAL_S) * 1000;
84
+ const expiresIn = Number(auth.expires_in) > 0 ? Number(auth.expires_in) : DEFAULT_EXPIRES_IN_S;
85
+ const deadline = Date.now() + expiresIn * 1000;
80
86
  while (Date.now() < deadline) {
81
87
  await new Promise((r) => setTimeout(r, intervalMs));
82
88
  if (onTick) {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -1,58 +1,8 @@
1
- import { createRequire } from 'node:module';
2
- import { Command } from 'commander';
3
- import { loginCommand } from './commands/login.js';
4
- import { logoutCommand } from './commands/logout.js';
5
- import { balanceCommand } from './commands/balance.js';
6
- import { topupCommand } from './commands/topup.js';
7
- import { modelsCommand } from './commands/models.js';
8
- import { listCommand } from './commands/list.js';
9
- import { doctorCommand } from './commands/doctor.js';
10
- import { registerAgentCommands } from './commands/agent-runner.js';
11
- // Read version from package.json so we never have to bump it in two places.
12
- const pkg = createRequire(import.meta.url)('../package.json');
13
- const program = new Command();
14
- // Required so that agent subcommands can use passThroughOptions() to forward
15
- // --version / --help / --any to the underlying agent binary instead of having
16
- // tokenmix consume them.
17
- program.enablePositionalOptions();
18
- program
19
- .name('tokenmix')
20
- .description('Zero-config CLI to use any open-source coding agent with TokenMix as the unified LLM backend.')
21
- .version(pkg.version);
22
- program
23
- .command('login')
24
- .description('Log in to TokenMix (default: browser device authorization)')
25
- .option('-k, --key <apiKey>', 'Paste an API key directly (skip browser flow, useful in CI)')
26
- .option('-p, --paste', 'Force interactive paste prompt instead of browser flow')
27
- .option('-u, --url <baseUrl>', 'Override API base URL (default: https://api.tokenmix.ai)')
28
- .action(loginCommand);
29
- program
30
- .command('logout')
31
- .description('Remove stored credentials from this machine')
32
- .action(logoutCommand);
33
- program
34
- .command('balance')
35
- .description('Open the dashboard to view your balance')
36
- .action(balanceCommand);
37
- program
38
- .command('topup')
39
- .description('Open the browser to top up your account')
40
- .action(topupCommand);
41
- program
42
- .command('models')
43
- .description('List available models with prices')
44
- .option('-t, --type <type>', 'Filter by type: chat | embedding | image | audio | video')
45
- .action(modelsCommand);
46
- program
47
- .command('list')
48
- .description('List supported coding agents')
49
- .action(listCommand);
50
- program
51
- .command('doctor')
52
- .description('Diagnose CLI configuration and agent installation')
53
- .action(doctorCommand);
54
- // Register one subcommand per supported agent (opencode, claude, aider, kilo, ...).
55
- registerAgentCommands(program);
1
+ import { buildProgram } from './program.js';
2
+ import { detectLocale, setLocale } from './i18n/index.js';
3
+ // Resolve UI language once, before any command output.
4
+ setLocale(detectLocale());
5
+ const program = buildProgram();
56
6
  program.parseAsync(process.argv).catch((err) => {
57
7
  const e = err;
58
8
  console.error(e?.message ?? err);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE,4EAA4E;AAC5E,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAwB,CAAA;AAEpF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,6EAA6E;AAC7E,8EAA8E;AAC9E,yBAAyB;AACzB,OAAO,CAAC,uBAAuB,EAAE,CAAA;AAEjC,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,+FAA+F,CAAC;KAC5G,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,oBAAoB,EAAE,6DAA6D,CAAC;KAC3F,MAAM,CAAC,aAAa,EAAE,wDAAwD,CAAC;KAC/E,MAAM,CAAC,qBAAqB,EAAE,0DAA0D,CAAC;KACzF,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,cAAc,CAAC,CAAA;AAEzB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,YAAY,CAAC,CAAA;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,mBAAmB,EAAE,0DAA0D,CAAC;KACvF,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,WAAW,CAAC,CAAA;AAEtB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,aAAa,CAAC,CAAA;AAExB,oFAAoF;AACpF,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAE9B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,MAAM,CAAC,GAAG,GAA2B,CAAA;IACrC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,GAAG,CAAC,CAAA;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEzD,uDAAuD;AACvD,SAAS,CAAC,YAAY,EAAE,CAAC,CAAA;AAEzB,MAAM,OAAO,GAAG,YAAY,EAAE,CAAA;AAE9B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,MAAM,CAAC,GAAG,GAA2B,CAAA;IACrC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,GAAG,CAAC,CAAA;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -2,8 +2,28 @@ import { logger } from '../utils/logger.js';
2
2
  import { readConfig, apiBaseUrl } from '../config/store.js';
3
3
  import { confirm } from '../utils/prompt.js';
4
4
  import { AGENTS } from '../agents/registry.js';
5
+ import { t } from '../i18n/index.js';
5
6
  const DEFAULT_MODEL = 'claude-sonnet-4.6';
6
- export function registerAgentCommands(program) {
7
+ // Flags that are pure information requests meant for the underlying agent binary.
8
+ // For these we must NOT rewrite global config or require login — just forward them.
9
+ const INFO_ONLY_FLAGS = new Set(['--version', '-V', '--help', '-h']);
10
+ export function isInfoOnlyInvocation(args) {
11
+ return args.length > 0 && args.every((a) => INFO_ONLY_FLAGS.has(a));
12
+ }
13
+ // Forward to the agent binary, mirroring its exit code; re-throw non-exec errors.
14
+ async function launchOrExit(launch, args, env) {
15
+ try {
16
+ await launch(args, env);
17
+ }
18
+ catch (err) {
19
+ const e = err;
20
+ if (typeof e.exitCode === 'number' && e.exitCode !== 0) {
21
+ process.exit(e.exitCode);
22
+ }
23
+ throw err;
24
+ }
25
+ }
26
+ export function registerAgentCommands(program, runner = runAgent) {
7
27
  for (const agent of AGENTS) {
8
28
  if (agent.registerCommand) {
9
29
  agent.registerCommand(program);
@@ -15,14 +35,25 @@ export function registerAgentCommands(program) {
15
35
  .allowUnknownOption(true)
16
36
  .passThroughOptions(true) // forward --version / --help / --any to the underlying agent
17
37
  .action(async (args = []) => {
18
- await runAgent(agent, args);
38
+ await runner(agent, args);
19
39
  });
20
40
  }
21
41
  }
22
- async function runAgent(agent, args) {
42
+ export async function runAgent(agent, args) {
43
+ // `tokenmix <agent> --version|--help`: forward straight to the binary without
44
+ // rewriting global config or requiring login — a query must not have side effects.
45
+ if (agent.launch && isInfoOnlyInvocation(args)) {
46
+ const status = await agent.installCheck();
47
+ if (!status.installed) {
48
+ logger.warn(status.hint || t('agent.notInstalled', { name: agent.displayName }));
49
+ process.exit(1);
50
+ }
51
+ await launchOrExit(agent.launch, args, {});
52
+ return;
53
+ }
23
54
  const cfg = await readConfig();
24
55
  if (!cfg.apiKey) {
25
- logger.error('Not logged in. Run `tokenmix login` first.');
56
+ logger.error(t('common.notLoggedIn'));
26
57
  process.exit(1);
27
58
  }
28
59
  const baseUrl = apiBaseUrl(cfg);
@@ -31,26 +62,41 @@ async function runAgent(agent, args) {
31
62
  const status = await agent.installCheck();
32
63
  if (!status.installed) {
33
64
  if (agent.install) {
34
- const shouldInstall = await confirm(`${agent.displayName} is not installed. Install now?`, true);
65
+ const shouldInstall = await confirm(t('agent.installPrompt', { name: agent.displayName }), true);
35
66
  if (!shouldInstall) {
36
67
  if (status.hint)
37
68
  logger.warn(status.hint);
38
69
  process.exit(1);
39
70
  }
40
- logger.step(`Installing ${agent.displayName} ...`);
41
- await agent.install();
42
- logger.success(`${agent.displayName} installed.`);
71
+ logger.step(t('agent.installing', { name: agent.displayName }));
72
+ try {
73
+ await agent.install();
74
+ }
75
+ catch {
76
+ // The most common global-install failure worldwide is npm lacking
77
+ // permission to write to the global prefix. Give actionable guidance
78
+ // instead of dumping execa's raw error.
79
+ logger.error(t('agent.installFailed', { name: agent.displayName }));
80
+ logger.info(t('agent.installFailHint1'));
81
+ logger.info(t('agent.installFailHint2'));
82
+ if (status.hint) {
83
+ logger.info(t('agent.installFailHint3', { cmd: status.hint.replace(/^Will install via:\s*/, '') }));
84
+ }
85
+ logger.info(t('agent.installFailHint4'));
86
+ process.exit(1);
87
+ }
88
+ logger.success(t('agent.installed', { name: agent.displayName }));
43
89
  }
44
90
  else {
45
- logger.warn(status.hint || `${agent.displayName} is not installable from the CLI.`);
91
+ logger.warn(status.hint || t('agent.notInstallable', { name: agent.displayName }));
46
92
  process.exit(1);
47
93
  }
48
94
  }
49
95
  // 2. Configure with tokenmix credentials.
50
- logger.step(`Configuring ${agent.displayName} ...`);
96
+ logger.step(t('agent.configuring', { name: agent.displayName }));
51
97
  const result = await agent.configure(cfg.apiKey, baseUrl, defaultModel);
52
98
  if (result.configPath) {
53
- logger.success(`Wrote ${result.configPath}`);
99
+ logger.success(t('agent.wrote', { path: result.configPath }));
54
100
  }
55
101
  if (result.notes && result.notes.length > 0) {
56
102
  for (const note of result.notes) {
@@ -63,23 +109,14 @@ async function runAgent(agent, args) {
63
109
  }
64
110
  // 3. Launch (or stop if the agent has no CLI launcher).
65
111
  if (!agent.launch) {
66
- logger.info(`${agent.displayName} configuration ready.`);
112
+ logger.info(t('agent.configReady', { name: agent.displayName }));
67
113
  return;
68
114
  }
69
- logger.step(`Launching ${agent.displayName} ...`);
115
+ logger.step(t('agent.launching', { name: agent.displayName }));
70
116
  const env = {
71
117
  ...(result.envVars ?? {}),
72
118
  TOKENMIX_DEFAULT_MODEL: defaultModel,
73
119
  };
74
- try {
75
- await agent.launch(args, env);
76
- }
77
- catch (err) {
78
- const e = err;
79
- if (typeof e.exitCode === 'number' && e.exitCode !== 0) {
80
- process.exit(e.exitCode);
81
- }
82
- throw err;
83
- }
120
+ await launchOrExit(agent.launch, args, env);
84
121
  }
85
122
  //# sourceMappingURL=agent-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/commands/agent-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/commands/agent-runner.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { logger } from '../utils/logger.js';
2
- import { openInBrowser } from '../utils/browser.js';
2
+ import { openOrHint } from '../utils/browser.js';
3
3
  import { readConfig } from '../config/store.js';
4
+ import { t } from '../i18n/index.js';
4
5
  // v0.1: balance lookup over API requires a user JWT, which we do not yet have
5
6
  // (the CLI uses an API Key today). We open the dashboard instead.
6
7
  // Once the device-flow login lands in the backend, this will hit /api/user/wallet directly.
@@ -8,10 +9,10 @@ const DASHBOARD_URL = 'https://tokenmix.ai/dashboard';
8
9
  export async function balanceCommand() {
9
10
  const cfg = await readConfig();
10
11
  if (!cfg.apiKey) {
11
- logger.error('Not logged in. Run `tokenmix login` first.');
12
+ logger.error(t('common.notLoggedIn'));
12
13
  process.exit(1);
13
14
  }
14
- logger.step(`Opening dashboard to view balance: ${DASHBOARD_URL}`);
15
- await openInBrowser(DASHBOARD_URL);
15
+ logger.step(t('balance.opening', { url: DASHBOARD_URL }));
16
+ await openOrHint(DASHBOARD_URL);
16
17
  }
17
18
  //# sourceMappingURL=balance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE/C,8EAA8E;AAC9E,kEAAkE;AAClE,4FAA4F;AAC5F,MAAM,aAAa,GAAG,+BAA+B,CAAA;AAErD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAA;IAC9B,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,sCAAsC,aAAa,EAAE,CAAC,CAAA;IAClE,MAAM,aAAa,CAAC,aAAa,CAAC,CAAA;AACpC,CAAC"}
1
+ {"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AAEpC,8EAA8E;AAC9E,kEAAkE;AAClE,4FAA4F;AAC5F,MAAM,aAAa,GAAG,+BAA+B,CAAA;AAErD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAA;IAC9B,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAA;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;IACzD,MAAM,UAAU,CAAC,aAAa,CAAC,CAAA;AACjC,CAAC"}