tokenmix 1.4.15 → 1.4.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,6 +14,19 @@ Behind the zero-config CLI is a gateway built to be the **honest, transparent**
14
14
  - **One key, every protocol.** OpenAI Chat Completions, Anthropic Messages, and the Responses API — all on one account, which is why every agent below (terminal and editor alike) runs on a single balance.
15
15
  - **Non-invasive by design.** Configuring an agent never clobbers your setup: your Claude settings are backed up and restored, Codex's provider is injected at launch (your `~/.codex/config.toml` stays untouched), and `tokenmix logout` reverts everything. Credentials are stored locally at `0600`.
16
16
 
17
+ ## TokenMix vs. the grey market
18
+
19
+ The "中转站" proxy market is cheap but trust-broken — independent audits have documented model substitution, credential theft, and prompt-data resale. TokenMix is built to be the honest alternative, and every row below is enforced in code, not just promised:
20
+
21
+ | | Typical grey-market proxy | TokenMix |
22
+ |---|---|---|
23
+ | **The model you get** | Sells "Opus", serves Haiku / Qwen | The model you name is the model that runs — no fallback to a cheaper one |
24
+ | **Billing** | Opaque "credits", no real-usage detail | Real upstream usage at the public price, to micro-USD, auditable |
25
+ | **Cache savings** | Pocketed by the proxy | Passed back to you at the discounted rate, automatically |
26
+ | **Your credentials** | Keys harvested and resold | Stored locally at `0600`, injected non-invasively, reverted on `logout` |
27
+
28
+ Versus a mainstream gateway like [OpenRouter](https://openrouter.ai), the difference is focus, not a knock on them: TokenMix is built for Asia/China BYOK users — a six-language CLI and dashboard, networking tuned for slow or restricted connections, and one balance across the Anthropic, OpenAI, and Responses protocols.
29
+
17
30
  ## Quick Start
18
31
 
19
32
  ```bash
@@ -40,6 +40,15 @@ export async function doctorCommand() {
40
40
  console.log(chalk.bold(t('doctor.agentStatus')));
41
41
  for (const a of AGENTS) {
42
42
  const r = await a.installCheck();
43
+ // Config-only agents (VSCode extensions) have no binary of their own to install,
44
+ // so installCheck always reports installed:true — labeling them "installed" is
45
+ // misleading. Show their install mode instead, matching `tokenmix list`.
46
+ if (a.installMode === 'manual-vscode') {
47
+ logger.success(`${a.displayName.padEnd(14)} ${chalk.dim(t('list.modeManualVscode'))}`);
48
+ if (r.hint)
49
+ console.log(` ${chalk.dim(r.hint)}`);
50
+ continue;
51
+ }
43
52
  if (r.installed) {
44
53
  logger.success(`${a.displayName.padEnd(14)} ${t('doctor.installed')}${r.version ? ` (${chalk.dim(r.version)})` : ''}`);
45
54
  if (r.hint)
@@ -10,6 +10,7 @@ export async function welcomeCommand() {
10
10
  const row = (cmd, desc) => ' ' + chalk.cyan(cmd.padEnd(21)) + chalk.dim(desc);
11
11
  console.log();
12
12
  console.log(' ' + chalk.bold.cyan('TokenMix') + chalk.dim(' — ' + t('welcome.tagline')));
13
+ console.log(' ' + chalk.green('✓') + ' ' + t('welcome.why'));
13
14
  console.log();
14
15
  if (loggedIn) {
15
16
  console.log(' ' + chalk.green('✓') + ' ' + t('welcome.loggedIn'));
@@ -8,6 +8,7 @@ export const en = {
8
8
  'common.notLoggedIn': 'Not logged in. Run `tokenmix login` first.',
9
9
  // welcome screen (bare `tokenmix`, no args — onboarding for first-time users)
10
10
  'welcome.tagline': 'one account, 160+ models, every open-source coding agent',
11
+ 'welcome.why': 'The model you pick is the model you get — no silent swaps, billed at real usage.',
11
12
  'welcome.start': 'Get started:',
12
13
  'welcome.s1': 'log in (opens a browser, ~10s)',
13
14
  'welcome.s2': 'see all 11 supported agents',
@@ -101,7 +102,7 @@ export const en = {
101
102
  // install hints
102
103
  'install.willInstallVia': 'Will install via: {cmd}',
103
104
  'aider.hintNeedPython': 'Aider requires Python 3. Install Python 3 from https://python.org/downloads, then come back and run `tokenmix aider` again.',
104
- 'aider.hintNotInstalled': 'Aider is not installed. Run this in another terminal:\n {cmd}\nThen come back and run `tokenmix aider` again — your TokenMix login is already saved, so it will pick up automatically.',
105
+ 'aider.hintNotInstalled': 'Aider is not installed. Run this in another terminal:\n {cmd}',
105
106
  // opencode configure notes
106
107
  'opencode.noteModel': 'Default model set to tokenmix/{model}',
107
108
  'opencode.noteSwitch': 'To switch models, run `tokenmix models` or use `/connect` inside OpenCode.',
@@ -184,6 +185,7 @@ export const en = {
184
185
  export const zh = {
185
186
  'common.notLoggedIn': '未登录,请先运行 `tokenmix login`。',
186
187
  'welcome.tagline': '一个账户、160+ 模型、对接所有开源编程 agent',
188
+ 'welcome.why': '你选的模型就是你用的模型 —— 不偷换、不降级,按真实用量计费。',
187
189
  'welcome.start': '快速开始:',
188
190
  'welcome.s1': '登录(打开浏览器,约 10 秒)',
189
191
  'welcome.s2': '查看支持的 11 个 agent',
@@ -277,7 +279,7 @@ export const zh = {
277
279
  // install hints
278
280
  'install.willInstallVia': '将自动安装:{cmd}',
279
281
  'aider.hintNeedPython': 'Aider 需要 Python 3。请从 https://python.org/downloads 安装 Python 3,然后重新运行 `tokenmix aider`。',
280
- 'aider.hintNotInstalled': 'Aider 尚未安装。请在另一个终端运行:\n {cmd}\n然后重新运行 `tokenmix aider` —— 你的 TokenMix 登录已保存,会自动生效。',
282
+ 'aider.hintNotInstalled': 'Aider 尚未安装。请在另一个终端运行:\n {cmd}',
281
283
  // opencode configure notes
282
284
  'opencode.noteModel': '默认模型已设为 tokenmix/{model}',
283
285
  'opencode.noteSwitch': '切换模型:运行 `tokenmix models`,或在 OpenCode 内使用 `/connect`。',
@@ -353,6 +355,7 @@ export const zh = {
353
355
  export const ja = {
354
356
  'common.notLoggedIn': 'ログインしていません。まず `tokenmix login` を実行してください。',
355
357
  'welcome.tagline': '1 つのアカウントで 160+ モデル、あらゆるオープンソース・コーディング agent に対応',
358
+ 'welcome.why': '選んだモデルがそのまま使われます —— すり替えなし、実使用量で課金。',
356
359
  'welcome.start': 'はじめに:',
357
360
  'welcome.s1': 'ログイン(ブラウザが開きます、約 10 秒)',
358
361
  'welcome.s2': 'サポートされている 11 の agent を表示',
@@ -436,7 +439,7 @@ export const ja = {
436
439
  'desc.openhands': 'All-Hands-AI/OpenHands — 自律型コーディング agent(OpenAI 互換)',
437
440
  'install.willInstallVia': '次の方法でインストールします:{cmd}',
438
441
  'aider.hintNeedPython': 'Aider には Python 3 が必要です。https://python.org/downloads から Python 3 をインストールし、再度 `tokenmix aider` を実行してください。',
439
- 'aider.hintNotInstalled': 'Aider はインストールされていません。別のターミナルで次を実行してください:\n {cmd}\nその後 `tokenmix aider` を再実行してください — TokenMix のログインは保存済みなので自動的に反映されます。',
442
+ 'aider.hintNotInstalled': 'Aider はインストールされていません。別のターミナルで次を実行してください:\n {cmd}',
440
443
  'opencode.noteModel': 'デフォルトモデルを tokenmix/{model} に設定しました',
441
444
  'opencode.noteSwitch': 'モデルを切り替えるには `tokenmix models` を実行するか、OpenCode 内で `/connect` を使用してください。',
442
445
  'claude.noteModels': 'tokenmix 経由で利用できる Claude モデル:claude-opus-4.7、claude-sonnet-4.6、claude-haiku-4.5',
@@ -507,6 +510,7 @@ export const ja = {
507
510
  export const ko = {
508
511
  'common.notLoggedIn': '로그인되어 있지 않습니다. 먼저 `tokenmix login`을 실행하세요.',
509
512
  'welcome.tagline': '하나의 계정으로 160+ 모델, 모든 오픈소스 코딩 agent 지원',
513
+ 'welcome.why': '선택한 모델 그대로 실행됩니다 —— 몰래 바꾸지 않고 실사용량으로 과금합니다.',
510
514
  'welcome.start': '시작하기:',
511
515
  'welcome.s1': '로그인 (브라우저가 열립니다, 약 10초)',
512
516
  'welcome.s2': '지원되는 11개 agent 보기',
@@ -590,7 +594,7 @@ export const ko = {
590
594
  'desc.openhands': 'All-Hands-AI/OpenHands — 자율 코딩 agent (OpenAI 호환)',
591
595
  'install.willInstallVia': '다음 방법으로 설치합니다: {cmd}',
592
596
  'aider.hintNeedPython': 'Aider에는 Python 3가 필요합니다. https://python.org/downloads 에서 Python 3를 설치한 뒤 다시 `tokenmix aider`를 실행하세요.',
593
- 'aider.hintNotInstalled': 'Aider가 설치되어 있지 않습니다. 다른 터미널에서 다음을 실행하세요:\n {cmd}\n그런 다음 다시 `tokenmix aider`를 실행하세요 — TokenMix 로그인이 이미 저장되어 있어 자동으로 적용됩니다.',
597
+ 'aider.hintNotInstalled': 'Aider가 설치되어 있지 않습니다. 다른 터미널에서 다음을 실행하세요:\n {cmd}',
594
598
  'opencode.noteModel': '기본 모델을 tokenmix/{model}(으)로 설정했습니다',
595
599
  'opencode.noteSwitch': '모델을 바꾸려면 `tokenmix models`를 실행하거나 OpenCode 안에서 `/connect`를 사용하세요.',
596
600
  'claude.noteModels': 'tokenmix를 통해 사용할 수 있는 Claude 모델: claude-opus-4.7, claude-sonnet-4.6, claude-haiku-4.5',
@@ -661,6 +665,7 @@ export const ko = {
661
665
  export const es = {
662
666
  'common.notLoggedIn': 'No has iniciado sesión. Ejecuta `tokenmix login` primero.',
663
667
  'welcome.tagline': 'una cuenta, 160+ modelos, todos los agentes de programación de código abierto',
668
+ 'welcome.why': 'El modelo que eliges es el que usas: sin cambios ocultos, facturado por uso real.',
664
669
  'welcome.start': 'Empezar:',
665
670
  'welcome.s1': 'inicia sesión (abre el navegador, ~10 s)',
666
671
  'welcome.s2': 've los 11 agentes compatibles',
@@ -744,7 +749,7 @@ export const es = {
744
749
  'desc.openhands': 'All-Hands-AI/OpenHands — agente de programación autónomo (compatible con OpenAI)',
745
750
  'install.willInstallVia': 'Se instalará mediante: {cmd}',
746
751
  'aider.hintNeedPython': 'Aider requiere Python 3. Instala Python 3 desde https://python.org/downloads y vuelve a ejecutar `tokenmix aider`.',
747
- 'aider.hintNotInstalled': 'Aider no está instalado. Ejecuta esto en otra terminal:\n {cmd}\nLuego vuelve a ejecutar `tokenmix aider`: tu sesión de TokenMix ya está guardada, así que se detectará automáticamente.',
752
+ 'aider.hintNotInstalled': 'Aider no está instalado. Ejecuta esto en otra terminal:\n {cmd}',
748
753
  'opencode.noteModel': 'Modelo predeterminado establecido en tokenmix/{model}',
749
754
  'opencode.noteSwitch': 'Para cambiar de modelo, ejecuta `tokenmix models` o usa `/connect` dentro de OpenCode.',
750
755
  'claude.noteModels': 'Modelos de Claude disponibles vía tokenmix: claude-opus-4.7, claude-sonnet-4.6, claude-haiku-4.5',
@@ -815,6 +820,7 @@ export const es = {
815
820
  export const fr = {
816
821
  'common.notLoggedIn': 'Non connecté. Exécutez d’abord `tokenmix login`.',
817
822
  'welcome.tagline': 'un seul compte, 160+ modèles, tous les agents de codage open source',
823
+ 'welcome.why': 'Le modèle que vous choisissez est celui que vous utilisez — sans substitution, facturé à l’usage réel.',
818
824
  'welcome.start': 'Démarrer :',
819
825
  'welcome.s1': 'connectez-vous (ouvre un navigateur, ~10 s)',
820
826
  'welcome.s2': 'voir les 11 agents pris en charge',
@@ -898,7 +904,7 @@ export const fr = {
898
904
  'desc.openhands': 'All-Hands-AI/OpenHands — agent de codage autonome (compatible OpenAI)',
899
905
  'install.willInstallVia': 'Sera installé via : {cmd}',
900
906
  'aider.hintNeedPython': 'Aider nécessite Python 3. Installez Python 3 depuis https://python.org/downloads, puis relancez `tokenmix aider`.',
901
- 'aider.hintNotInstalled': 'Aider n’est pas installé. Exécutez ceci dans un autre terminal :\n {cmd}\nPuis relancez `tokenmix aider` — votre connexion TokenMix est déjà enregistrée, elle sera donc prise en compte automatiquement.',
907
+ 'aider.hintNotInstalled': 'Aider n’est pas installé. Exécutez ceci dans un autre terminal :\n {cmd}',
902
908
  'opencode.noteModel': 'Modèle par défaut défini sur tokenmix/{model}',
903
909
  'opencode.noteSwitch': 'Pour changer de modèle, exécutez `tokenmix models` ou utilisez `/connect` dans OpenCode.',
904
910
  'claude.noteModels': 'Modèles Claude disponibles via tokenmix : claude-opus-4.7, claude-sonnet-4.6, claude-haiku-4.5',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokenmix",
3
- "version": "1.4.15",
3
+ "version": "1.4.17",
4
4
  "description": "Zero-config CLI to use any open-source coding agent with TokenMix as the unified LLM backend.",
5
5
  "type": "module",
6
6
  "bin": {