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.
- package/README.md +11 -2
- package/dist/agents/aider.js +24 -3
- package/dist/agents/aider.js.map +1 -1
- package/dist/agents/claude.js +59 -4
- package/dist/agents/claude.js.map +1 -1
- package/dist/agents/kilo.js +2 -0
- package/dist/agents/kilo.js.map +1 -1
- package/dist/agents/opencode.js +29 -0
- package/dist/agents/opencode.js.map +1 -1
- package/dist/api/client.js +12 -6
- package/dist/api/client.js.map +1 -1
- package/dist/cli.js +5 -55
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent-runner.js +60 -23
- package/dist/commands/agent-runner.js.map +1 -1
- package/dist/commands/balance.js +5 -4
- package/dist/commands/balance.js.map +1 -1
- package/dist/commands/doctor.js +11 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/list.js +19 -9
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.js +24 -20
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +21 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/models.js +24 -12
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/topup.js +4 -3
- package/dist/commands/topup.js.map +1 -1
- package/dist/config/store.js +1 -1
- package/dist/config/store.js.map +1 -1
- package/dist/i18n/index.js +33 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/messages.js +156 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/program.js +61 -0
- package/dist/program.js.map +1 -0
- package/dist/utils/browser.js +12 -0
- package/dist/utils/browser.js.map +1 -1
- package/dist/utils/prompt.js +3 -2
- package/dist/utils/prompt.js.map +1 -1
- 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,
|
|
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:
|
package/dist/agents/aider.js
CHANGED
|
@@ -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
|
|
45
|
-
const
|
|
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 });
|
package/dist/agents/aider.js.map
CHANGED
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"aider.js","sourceRoot":"","sources":["../../src/agents/aider.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/claude.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/kilo.js
CHANGED
package/dist/agents/kilo.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/agents/opencode.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"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"}
|
package/dist/api/client.js
CHANGED
|
@@ -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 ||
|
|
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
|
|
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) {
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAc,MAAM,oBAAoB,CAAA;
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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('
|
|
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(
|
|
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(
|
|
41
|
-
|
|
42
|
-
|
|
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 ||
|
|
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(
|
|
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(
|
|
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(
|
|
112
|
+
logger.info(t('agent.configReady', { name: agent.displayName }));
|
|
67
113
|
return;
|
|
68
114
|
}
|
|
69
|
-
logger.step(
|
|
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
|
-
|
|
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":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/commands/agent-runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AAEpC,MAAM,aAAa,GAAG,mBAAmB,CAAA;AAEzC,kFAAkF;AAClF,oFAAoF;AACpF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;AAEpE,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AACrE,CAAC;AAOD,kFAAkF;AAClF,KAAK,UAAU,YAAY,CACzB,MAA8C,EAC9C,IAAc,EACd,GAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACzB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAqB,CAAA;QAC/B,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QAC1B,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,qBAAqB,CAAC,OAAgB,EAAE,SAAsB,QAAQ;IACpF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;YAC9B,SAAQ;QACV,CAAC;QACD,OAAO;aACJ,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,YAAY,CAAC;aAChC,WAAW,CAAC,wBAAwB,KAAK,CAAC,WAAW,eAAe,CAAC;aACrE,kBAAkB,CAAC,IAAI,CAAC;aACxB,kBAAkB,CAAC,IAAI,CAAC,CAAC,6DAA6D;aACtF,MAAM,CAAC,KAAK,EAAE,OAAiB,EAAE,EAAE,EAAE;YACpC,MAAM,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;IACN,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAsB,EAAE,IAAc;IACnE,8EAA8E;IAC9E,mFAAmF;IACnF,IAAI,KAAK,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;QAC1C,OAAM;IACR,CAAC;IAED,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,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;IAC/B,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,aAAa,CAAA;IAEtD,2BAA2B;IAC3B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;IACzC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,MAAM,OAAO,CACjC,CAAC,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,EACrD,IAAI,CACL,CAAA;YACD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,IAAI,MAAM,CAAC,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;YAC/D,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;gBAClE,qEAAqE;gBACrE,wCAAwC;gBACxC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;gBACnE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAA;gBACxC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAA;gBACxC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAChB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;gBACrG,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAA;gBACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;YAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAChE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;IACvE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,KAAK,EAAE;gBAAE,OAAO,CAAC,GAAG,EAAE,CAAA;;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;QAC/B,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAA;IACf,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QAChE,OAAM;IACR,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC9D,MAAM,GAAG,GAA2B;QAClC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACzB,sBAAsB,EAAE,YAAY;KACrC,CAAA;IACD,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;AAC7C,CAAC"}
|
package/dist/commands/balance.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { logger } from '../utils/logger.js';
|
|
2
|
-
import {
|
|
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('
|
|
12
|
+
logger.error(t('common.notLoggedIn'));
|
|
12
13
|
process.exit(1);
|
|
13
14
|
}
|
|
14
|
-
logger.step(
|
|
15
|
-
await
|
|
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,
|
|
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"}
|