tokenmix 0.2.4 → 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 +9 -0
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent-runner.js +18 -16
- package/dist/commands/agent-runner.js.map +1 -1
- package/dist/commands/balance.js +3 -2
- 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 +19 -18
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +3 -2
- 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 +2 -1
- package/dist/commands/topup.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/utils/browser.js +2 -1
- 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 +1 -1
package/README.md
CHANGED
|
@@ -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/cli.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
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());
|
|
2
5
|
const program = buildProgram();
|
|
3
6
|
program.parseAsync(process.argv).catch((err) => {
|
|
4
7
|
const e = 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,YAAY,EAAE,MAAM,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,6 +2,7 @@ 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.
|
|
7
8
|
// For these we must NOT rewrite global config or require login — just forward them.
|
|
@@ -44,7 +45,7 @@ export async function runAgent(agent, args) {
|
|
|
44
45
|
if (agent.launch && isInfoOnlyInvocation(args)) {
|
|
45
46
|
const status = await agent.installCheck();
|
|
46
47
|
if (!status.installed) {
|
|
47
|
-
logger.warn(status.hint ||
|
|
48
|
+
logger.warn(status.hint || t('agent.notInstalled', { name: agent.displayName }));
|
|
48
49
|
process.exit(1);
|
|
49
50
|
}
|
|
50
51
|
await launchOrExit(agent.launch, args, {});
|
|
@@ -52,7 +53,7 @@ export async function runAgent(agent, args) {
|
|
|
52
53
|
}
|
|
53
54
|
const cfg = await readConfig();
|
|
54
55
|
if (!cfg.apiKey) {
|
|
55
|
-
logger.error('
|
|
56
|
+
logger.error(t('common.notLoggedIn'));
|
|
56
57
|
process.exit(1);
|
|
57
58
|
}
|
|
58
59
|
const baseUrl = apiBaseUrl(cfg);
|
|
@@ -61,13 +62,13 @@ export async function runAgent(agent, args) {
|
|
|
61
62
|
const status = await agent.installCheck();
|
|
62
63
|
if (!status.installed) {
|
|
63
64
|
if (agent.install) {
|
|
64
|
-
const shouldInstall = await confirm(
|
|
65
|
+
const shouldInstall = await confirm(t('agent.installPrompt', { name: agent.displayName }), true);
|
|
65
66
|
if (!shouldInstall) {
|
|
66
67
|
if (status.hint)
|
|
67
68
|
logger.warn(status.hint);
|
|
68
69
|
process.exit(1);
|
|
69
70
|
}
|
|
70
|
-
logger.step(
|
|
71
|
+
logger.step(t('agent.installing', { name: agent.displayName }));
|
|
71
72
|
try {
|
|
72
73
|
await agent.install();
|
|
73
74
|
}
|
|
@@ -75,26 +76,27 @@ export async function runAgent(agent, args) {
|
|
|
75
76
|
// The most common global-install failure worldwide is npm lacking
|
|
76
77
|
// permission to write to the global prefix. Give actionable guidance
|
|
77
78
|
// instead of dumping execa's raw error.
|
|
78
|
-
logger.error(
|
|
79
|
-
logger.info('
|
|
80
|
-
logger.info(
|
|
81
|
-
if (status.hint)
|
|
82
|
-
logger.info(
|
|
83
|
-
|
|
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'));
|
|
84
86
|
process.exit(1);
|
|
85
87
|
}
|
|
86
|
-
logger.success(
|
|
88
|
+
logger.success(t('agent.installed', { name: agent.displayName }));
|
|
87
89
|
}
|
|
88
90
|
else {
|
|
89
|
-
logger.warn(status.hint ||
|
|
91
|
+
logger.warn(status.hint || t('agent.notInstallable', { name: agent.displayName }));
|
|
90
92
|
process.exit(1);
|
|
91
93
|
}
|
|
92
94
|
}
|
|
93
95
|
// 2. Configure with tokenmix credentials.
|
|
94
|
-
logger.step(
|
|
96
|
+
logger.step(t('agent.configuring', { name: agent.displayName }));
|
|
95
97
|
const result = await agent.configure(cfg.apiKey, baseUrl, defaultModel);
|
|
96
98
|
if (result.configPath) {
|
|
97
|
-
logger.success(
|
|
99
|
+
logger.success(t('agent.wrote', { path: result.configPath }));
|
|
98
100
|
}
|
|
99
101
|
if (result.notes && result.notes.length > 0) {
|
|
100
102
|
for (const note of result.notes) {
|
|
@@ -107,10 +109,10 @@ export async function runAgent(agent, args) {
|
|
|
107
109
|
}
|
|
108
110
|
// 3. Launch (or stop if the agent has no CLI launcher).
|
|
109
111
|
if (!agent.launch) {
|
|
110
|
-
logger.info(
|
|
112
|
+
logger.info(t('agent.configReady', { name: agent.displayName }));
|
|
111
113
|
return;
|
|
112
114
|
}
|
|
113
|
-
logger.step(
|
|
115
|
+
logger.step(t('agent.launching', { name: agent.displayName }));
|
|
114
116
|
const env = {
|
|
115
117
|
...(result.envVars ?? {}),
|
|
116
118
|
TOKENMIX_DEFAULT_MODEL: defaultModel,
|
|
@@ -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
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
|
+
logger.step(t('balance.opening', { url: DASHBOARD_URL }));
|
|
15
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,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;
|
|
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"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -3,6 +3,7 @@ import { logger } from '../utils/logger.js';
|
|
|
3
3
|
import { readConfig, apiBaseUrl } from '../config/store.js';
|
|
4
4
|
import { verifyApiKey } from '../api/client.js';
|
|
5
5
|
import { AGENTS } from '../agents/registry.js';
|
|
6
|
+
import { t } from '../i18n/index.js';
|
|
6
7
|
function maskKey(key) {
|
|
7
8
|
if (key.length <= 12)
|
|
8
9
|
return key;
|
|
@@ -10,35 +11,35 @@ function maskKey(key) {
|
|
|
10
11
|
}
|
|
11
12
|
export async function doctorCommand() {
|
|
12
13
|
console.log();
|
|
13
|
-
console.log(chalk.bold('
|
|
14
|
+
console.log(chalk.bold(t('doctor.title')));
|
|
14
15
|
console.log();
|
|
15
16
|
const cfg = await readConfig();
|
|
16
|
-
console.log(chalk.bold('
|
|
17
|
+
console.log(chalk.bold(t('doctor.credentials')));
|
|
17
18
|
if (cfg.apiKey) {
|
|
18
|
-
logger.success(
|
|
19
|
-
logger.success(
|
|
19
|
+
logger.success(`${t('doctor.apiKeyLabel')} ${chalk.cyan(maskKey(cfg.apiKey))}`);
|
|
20
|
+
logger.success(`${t('doctor.apiBaseLabel')} ${chalk.cyan(apiBaseUrl(cfg))}`);
|
|
20
21
|
const ok = await verifyApiKey(cfg.apiKey, apiBaseUrl(cfg));
|
|
21
22
|
if (ok) {
|
|
22
|
-
logger.success('
|
|
23
|
+
logger.success(t('doctor.keyValid'));
|
|
23
24
|
}
|
|
24
25
|
else {
|
|
25
|
-
logger.error('
|
|
26
|
+
logger.error(t('doctor.keyInvalid'));
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
else {
|
|
29
|
-
logger.warn('
|
|
30
|
+
logger.warn(t('doctor.notLoggedIn'));
|
|
30
31
|
}
|
|
31
32
|
console.log();
|
|
32
|
-
console.log(chalk.bold('
|
|
33
|
+
console.log(chalk.bold(t('doctor.agentStatus')));
|
|
33
34
|
for (const a of AGENTS) {
|
|
34
35
|
const r = await a.installCheck();
|
|
35
36
|
if (r.installed) {
|
|
36
|
-
logger.success(`${a.displayName.padEnd(14)} installed${r.version ? ` (${chalk.dim(r.version)})` : ''}`);
|
|
37
|
+
logger.success(`${a.displayName.padEnd(14)} ${t('doctor.installed')}${r.version ? ` (${chalk.dim(r.version)})` : ''}`);
|
|
37
38
|
if (r.hint)
|
|
38
39
|
console.log(` ${chalk.dim(r.hint)}`);
|
|
39
40
|
}
|
|
40
41
|
else {
|
|
41
|
-
logger.warn(`${a.displayName.padEnd(14)}
|
|
42
|
+
logger.warn(`${a.displayName.padEnd(14)} ${t('doctor.notInstalled')}`);
|
|
42
43
|
if (r.hint)
|
|
43
44
|
console.log(` ${chalk.dim(r.hint)}`);
|
|
44
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/list.js
CHANGED
|
@@ -1,23 +1,33 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { AGENTS } from '../agents/registry.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
import { t } from '../i18n/index.js';
|
|
4
|
+
// Resolved at call time so it follows the active locale.
|
|
5
|
+
function modeLabel(mode) {
|
|
6
|
+
switch (mode) {
|
|
7
|
+
case 'auto-npm':
|
|
8
|
+
return t('list.modeAutoNpm');
|
|
9
|
+
case 'auto-pip':
|
|
10
|
+
return t('list.modeAutoPip');
|
|
11
|
+
case 'manual-vscode':
|
|
12
|
+
return t('list.modeManualVscode');
|
|
13
|
+
case 'manual':
|
|
14
|
+
return t('list.modeManual');
|
|
15
|
+
default:
|
|
16
|
+
return mode;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
9
19
|
export async function listCommand() {
|
|
10
20
|
console.log();
|
|
11
|
-
console.log(chalk.bold('
|
|
21
|
+
console.log(chalk.bold(t('list.title')));
|
|
12
22
|
console.log();
|
|
13
23
|
for (const a of AGENTS) {
|
|
14
24
|
const id = chalk.cyan(a.id.padEnd(10));
|
|
15
|
-
const mode = chalk.dim(`[${
|
|
25
|
+
const mode = chalk.dim(`[${modeLabel(a.installMode)}]`);
|
|
16
26
|
console.log(` ${id} ${a.displayName.padEnd(14)} ${mode}`);
|
|
17
27
|
console.log(` ${chalk.dim(a.description)}`);
|
|
18
28
|
}
|
|
19
29
|
console.log();
|
|
20
|
-
console.log(chalk.dim('
|
|
30
|
+
console.log(chalk.dim(t('list.usage')));
|
|
21
31
|
console.log();
|
|
22
32
|
}
|
|
23
33
|
//# sourceMappingURL=list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AAEpC,yDAAyD;AACzD,SAAS,SAAS,CAAC,IAAY;IAC7B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAA;QAC9B,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAA;QAC9B,KAAK,eAAe;YAClB,OAAO,CAAC,CAAC,uBAAuB,CAAC,CAAA;QACnC,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,iBAAiB,CAAC,CAAA;QAC7B;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QAC1D,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC"}
|
package/dist/commands/login.js
CHANGED
|
@@ -4,6 +4,7 @@ import { promptApiKey, confirm } from '../utils/prompt.js';
|
|
|
4
4
|
import { openInBrowser } from '../utils/browser.js';
|
|
5
5
|
import { verifyApiKey, startDeviceAuthorization, pollDeviceToken, DeviceFlowError, } from '../api/client.js';
|
|
6
6
|
import { readConfig, updateConfig, apiBaseUrl } from '../config/store.js';
|
|
7
|
+
import { t } from '../i18n/index.js';
|
|
7
8
|
export async function loginCommand(opts) {
|
|
8
9
|
const cfg = await readConfig();
|
|
9
10
|
const baseUrl = opts.url || apiBaseUrl(cfg);
|
|
@@ -16,7 +17,7 @@ export async function loginCommand(opts) {
|
|
|
16
17
|
if (opts.paste) {
|
|
17
18
|
const entered = await promptApiKey();
|
|
18
19
|
if (!entered) {
|
|
19
|
-
logger.error('
|
|
20
|
+
logger.error(t('login.noKey'));
|
|
20
21
|
process.exit(1);
|
|
21
22
|
}
|
|
22
23
|
await loginByKey(entered, baseUrl);
|
|
@@ -27,28 +28,28 @@ export async function loginCommand(opts) {
|
|
|
27
28
|
}
|
|
28
29
|
async function loginByKey(apiKey, baseUrl) {
|
|
29
30
|
if (!apiKey.startsWith('sk-tm-')) {
|
|
30
|
-
logger.error('
|
|
31
|
+
logger.error(t('login.keyMustStart'));
|
|
31
32
|
process.exit(1);
|
|
32
33
|
}
|
|
33
|
-
logger.step(
|
|
34
|
+
logger.step(t('login.verifying', { baseUrl }));
|
|
34
35
|
const ok = await verifyApiKey(apiKey, baseUrl);
|
|
35
36
|
if (!ok) {
|
|
36
|
-
logger.error('
|
|
37
|
+
logger.error(t('login.verifyFailed'));
|
|
37
38
|
process.exit(1);
|
|
38
39
|
}
|
|
39
40
|
await updateConfig({ apiKey, apiBaseUrl: baseUrl });
|
|
40
|
-
logger.success('
|
|
41
|
+
logger.success(t('login.loggedInHint'));
|
|
41
42
|
}
|
|
42
43
|
async function loginByDeviceFlow(baseUrl) {
|
|
43
|
-
logger.step('
|
|
44
|
+
logger.step(t('login.requesting'));
|
|
44
45
|
let auth;
|
|
45
46
|
try {
|
|
46
47
|
auth = await startDeviceAuthorization(baseUrl);
|
|
47
48
|
}
|
|
48
49
|
catch (err) {
|
|
49
50
|
const msg = err instanceof Error ? err.message : String(err);
|
|
50
|
-
logger.error(
|
|
51
|
-
logger.info('
|
|
51
|
+
logger.error(t('login.couldNotStart', { msg }));
|
|
52
|
+
logger.info(t('login.fallbackPaste'));
|
|
52
53
|
const entered = await promptApiKey();
|
|
53
54
|
if (!entered)
|
|
54
55
|
process.exit(1);
|
|
@@ -60,48 +61,48 @@ async function loginByDeviceFlow(baseUrl) {
|
|
|
60
61
|
const verifyUrl = auth.verification_uri_complete || auth.verification_uri;
|
|
61
62
|
// Display user_code prominently
|
|
62
63
|
console.log();
|
|
63
|
-
console.log(' ' + chalk.dim('
|
|
64
|
+
console.log(' ' + chalk.dim(t('login.openLinkConfirm')));
|
|
64
65
|
console.log();
|
|
65
66
|
console.log(' ' + chalk.bold.cyan(auth.user_code));
|
|
66
67
|
console.log();
|
|
67
|
-
console.log(' ' + chalk.dim('
|
|
68
|
+
console.log(' ' + chalk.dim(t('login.link')));
|
|
68
69
|
console.log(' ' + chalk.underline(verifyUrl));
|
|
69
70
|
console.log();
|
|
70
71
|
// Try to open browser, but proceed even if it fails (headless / SSH)
|
|
71
72
|
try {
|
|
72
73
|
await openInBrowser(verifyUrl);
|
|
73
|
-
logger.dim('
|
|
74
|
+
logger.dim(' ' + t('login.browserOpened'));
|
|
74
75
|
}
|
|
75
76
|
catch {
|
|
76
|
-
logger.dim('
|
|
77
|
+
logger.dim(' ' + t('login.browserFailed'));
|
|
77
78
|
}
|
|
78
79
|
console.log();
|
|
79
|
-
logger.step(
|
|
80
|
+
logger.step(t('login.waiting', { expires: auth.expires_in, interval: auth.interval }));
|
|
80
81
|
let lastReported = -1;
|
|
81
82
|
try {
|
|
82
83
|
const result = await pollDeviceToken(baseUrl, auth, (secondsRemaining) => {
|
|
83
84
|
// Print a heartbeat at most every 15s so the terminal isn't silent
|
|
84
85
|
if (lastReported < 0 || lastReported - secondsRemaining >= 15) {
|
|
85
86
|
lastReported = secondsRemaining;
|
|
86
|
-
logger.dim(
|
|
87
|
+
logger.dim(' ' + t('login.stillWaiting', { seconds: secondsRemaining }));
|
|
87
88
|
}
|
|
88
89
|
});
|
|
89
90
|
await updateConfig({ apiKey: result.apiKey, apiBaseUrl: baseUrl });
|
|
90
91
|
console.log();
|
|
91
92
|
if (result.userEmail) {
|
|
92
|
-
logger.success(
|
|
93
|
+
logger.success(t('login.loggedInAs', { email: chalk.bold(result.userEmail), id: result.apiKeyId }));
|
|
93
94
|
}
|
|
94
95
|
else {
|
|
95
|
-
logger.success(
|
|
96
|
+
logger.success(t('login.loggedInId', { id: result.apiKeyId }));
|
|
96
97
|
}
|
|
97
|
-
logger.info('
|
|
98
|
+
logger.info(t('login.tryFirstAgent'));
|
|
98
99
|
}
|
|
99
100
|
catch (err) {
|
|
100
101
|
console.log();
|
|
101
102
|
if (err instanceof DeviceFlowError) {
|
|
102
103
|
logger.error(err.message);
|
|
103
104
|
if (err.code === 'expired_token' || err.code === 'timeout') {
|
|
104
|
-
const retry = await confirm('
|
|
105
|
+
const retry = await confirm(t('login.tryAgain'), true);
|
|
105
106
|
if (retry) {
|
|
106
107
|
await loginByDeviceFlow(baseUrl);
|
|
107
108
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,eAAe,EACf,eAAe,GAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/logout.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { logger } from '../utils/logger.js';
|
|
2
2
|
import { clearConfig } from '../config/store.js';
|
|
3
3
|
import { AGENTS } from '../agents/registry.js';
|
|
4
|
+
import { t } from '../i18n/index.js';
|
|
4
5
|
export async function logoutCommand() {
|
|
5
6
|
await clearConfig();
|
|
6
|
-
logger.success('
|
|
7
|
+
logger.success(t('logout.done'));
|
|
7
8
|
// Also revert the config we injected into agents, so they stop routing through
|
|
8
9
|
// TokenMix with a key that's about to be gone. Best-effort and precise — each
|
|
9
10
|
// agent only removes what it recognizes as its own tokenmix config.
|
|
@@ -13,7 +14,7 @@ export async function logoutCommand() {
|
|
|
13
14
|
try {
|
|
14
15
|
const r = await agent.cleanup();
|
|
15
16
|
if (r.reverted) {
|
|
16
|
-
logger.success(
|
|
17
|
+
logger.success(t('logout.reverted', { name: agent.displayName }) + (r.configPath ? ` (${r.configPath})` : ''));
|
|
17
18
|
if (r.note)
|
|
18
19
|
logger.dim(` ${r.note}`);
|
|
19
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AAEpC,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,WAAW,EAAE,CAAA;IACnB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAA;IAEhC,+EAA+E;IAC/E,8EAA8E;IAC9E,oEAAoE;IACpE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,SAAQ;QAC5B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;YAC/B,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACf,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC9G,IAAI,CAAC,CAAC,IAAI;oBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/commands/models.js
CHANGED
|
@@ -1,14 +1,26 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { logger } from '../utils/logger.js';
|
|
3
3
|
import { listPublicModels } from '../api/client.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
import { t } from '../i18n/index.js';
|
|
5
|
+
// Resolved at call time so it follows the active locale.
|
|
6
|
+
function typeLabel(type) {
|
|
7
|
+
switch (type) {
|
|
8
|
+
case 'chat':
|
|
9
|
+
return t('models.typeChat');
|
|
10
|
+
case 'embedding':
|
|
11
|
+
return t('models.typeEmbedding');
|
|
12
|
+
case 'image':
|
|
13
|
+
return t('models.typeImage');
|
|
14
|
+
case 'audio':
|
|
15
|
+
return t('models.typeAudio');
|
|
16
|
+
case 'video':
|
|
17
|
+
return t('models.typeVideo');
|
|
18
|
+
case 'completion':
|
|
19
|
+
return t('models.typeCompletion');
|
|
20
|
+
default:
|
|
21
|
+
return type;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
12
24
|
// Match the platform-wide formatter: 6 decimals, trim trailing zeros.
|
|
13
25
|
function formatPrice(p) {
|
|
14
26
|
if (!p)
|
|
@@ -19,7 +31,7 @@ export async function modelsCommand(opts) {
|
|
|
19
31
|
const all = await listPublicModels();
|
|
20
32
|
const filtered = opts.type ? all.filter((m) => m.model_type === opts.type) : all;
|
|
21
33
|
if (filtered.length === 0) {
|
|
22
|
-
logger.warn('
|
|
34
|
+
logger.warn(t('models.none'));
|
|
23
35
|
return;
|
|
24
36
|
}
|
|
25
37
|
const grouped = new Map();
|
|
@@ -30,13 +42,13 @@ export async function modelsCommand(opts) {
|
|
|
30
42
|
}
|
|
31
43
|
for (const [type, list] of grouped) {
|
|
32
44
|
console.log();
|
|
33
|
-
console.log(chalk.bold(`${
|
|
45
|
+
console.log(chalk.bold(`${typeLabel(type)} (${list.length})`));
|
|
34
46
|
for (const m of list) {
|
|
35
47
|
const id = chalk.cyan(m.short_id || m.model_id);
|
|
36
48
|
const priceParts = [];
|
|
37
49
|
if (type === 'chat' || type === 'embedding' || type === 'audio' || type === 'completion') {
|
|
38
|
-
priceParts.push(
|
|
39
|
-
priceParts.push(
|
|
50
|
+
priceParts.push(`${t('models.in')} $${formatPrice(m.input_price)}/M`);
|
|
51
|
+
priceParts.push(`${t('models.out')} $${formatPrice(m.output_price)}/M`);
|
|
40
52
|
}
|
|
41
53
|
else if (type === 'image') {
|
|
42
54
|
priceParts.push(`$${formatPrice(m.image_price)}/img`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAY,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/topup.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { logger } from '../utils/logger.js';
|
|
2
2
|
import { openOrHint } from '../utils/browser.js';
|
|
3
|
+
import { t } from '../i18n/index.js';
|
|
3
4
|
const TOPUP_URL = 'https://tokenmix.ai/dashboard/credits';
|
|
4
5
|
export async function topupCommand() {
|
|
5
|
-
logger.step(
|
|
6
|
+
logger.step(t('topup.opening', { url: TOPUP_URL }));
|
|
6
7
|
await openOrHint(TOPUP_URL);
|
|
7
8
|
}
|
|
8
9
|
//# sourceMappingURL=topup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topup.js","sourceRoot":"","sources":["../../src/commands/topup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"topup.js","sourceRoot":"","sources":["../../src/commands/topup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AAEpC,MAAM,SAAS,GAAG,uCAAuC,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;IACnD,MAAM,UAAU,CAAC,SAAS,CAAC,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { catalogs, en } from './messages.js';
|
|
2
|
+
let current = 'en';
|
|
3
|
+
// Resolve the UI language from the environment. Precedence:
|
|
4
|
+
// TOKENMIX_LANG (explicit override, e.g. `TOKENMIX_LANG=zh`)
|
|
5
|
+
// LC_ALL / LC_MESSAGES / LANG (the user's system locale, e.g. zh_CN.UTF-8)
|
|
6
|
+
// default: en
|
|
7
|
+
// Takes `env` for testability; defaults to process.env.
|
|
8
|
+
export function detectLocale(env = process.env) {
|
|
9
|
+
const raw = (env.TOKENMIX_LANG || env.LC_ALL || env.LC_MESSAGES || env.LANG || '')
|
|
10
|
+
.toLowerCase()
|
|
11
|
+
.trim();
|
|
12
|
+
if (raw.startsWith('zh') || raw.includes('zh_') || raw.includes('zh-'))
|
|
13
|
+
return 'zh';
|
|
14
|
+
return 'en';
|
|
15
|
+
}
|
|
16
|
+
export function setLocale(loc) {
|
|
17
|
+
current = loc;
|
|
18
|
+
}
|
|
19
|
+
export function getLocale() {
|
|
20
|
+
return current;
|
|
21
|
+
}
|
|
22
|
+
// Translate a key for the active locale, filling {placeholders} from params.
|
|
23
|
+
// Falls back to English, then to the raw key, so a partial catalog never throws.
|
|
24
|
+
export function t(key, params) {
|
|
25
|
+
let s = catalogs[current]?.[key] ?? en[key] ?? key;
|
|
26
|
+
if (params) {
|
|
27
|
+
for (const [k, v] of Object.entries(params)) {
|
|
28
|
+
s = s.split(`{${k}}`).join(String(v));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return s;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAc,MAAM,eAAe,CAAA;AAIxD,IAAI,OAAO,GAAW,IAAI,CAAA;AAE1B,4DAA4D;AAC5D,gEAAgE;AAChE,8EAA8E;AAC9E,gBAAgB;AAChB,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC/D,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;SAC/E,WAAW,EAAE;SACb,IAAI,EAAE,CAAA;IACT,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACnF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,GAAG,CAAA;AACf,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,6EAA6E;AAC7E,iFAAiF;AACjF,MAAM,UAAU,CAAC,CAAC,GAAe,EAAE,MAAwC;IACzE,IAAI,CAAC,GAAW,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAA;IAC1D,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// User-facing message catalogs. `en` is the source of truth; `zh` is typed as
|
|
2
|
+
// `typeof en`, so the compiler forces every key to be translated (no missing
|
|
3
|
+
// strings can ship). Add a new language by adding another `typeof en` catalog
|
|
4
|
+
// to `catalogs` below — nothing else needs to change.
|
|
5
|
+
//
|
|
6
|
+
// `{name}`-style placeholders are filled by t() at call time.
|
|
7
|
+
export const en = {
|
|
8
|
+
'common.notLoggedIn': 'Not logged in. Run `tokenmix login` first.',
|
|
9
|
+
// login
|
|
10
|
+
'login.keyMustStart': 'API key should start with sk-tm-',
|
|
11
|
+
'login.verifying': 'Verifying API key against {baseUrl} ...',
|
|
12
|
+
'login.verifyFailed': 'API key verification failed. Double-check at https://tokenmix.ai/dashboard/keys',
|
|
13
|
+
'login.loggedInHint': 'Logged in. Try `tokenmix opencode` to launch your first agent.',
|
|
14
|
+
'login.noKey': 'No API key provided.',
|
|
15
|
+
'login.requesting': 'Requesting device authorization ...',
|
|
16
|
+
'login.couldNotStart': 'Could not start device authorization: {msg}',
|
|
17
|
+
'login.fallbackPaste': 'Falling back to manual paste. Get an API key at https://tokenmix.ai/dashboard/keys',
|
|
18
|
+
'login.openLinkConfirm': 'Open the link below and confirm this code:',
|
|
19
|
+
'login.link': 'Link:',
|
|
20
|
+
'login.browserOpened': '(browser opened; if nothing happens, copy the link above)',
|
|
21
|
+
'login.browserFailed': '(could not open browser; copy the link above into one)',
|
|
22
|
+
'login.waiting': 'Waiting for authorization (expires in {expires}s, polling every {interval}s) ...',
|
|
23
|
+
'login.stillWaiting': '... still waiting ({seconds}s remaining)',
|
|
24
|
+
'login.loggedInAs': 'Logged in as {email} (API key #{id})',
|
|
25
|
+
'login.loggedInId': 'Logged in (API key #{id})',
|
|
26
|
+
'login.tryFirstAgent': 'Try `tokenmix opencode` to launch your first agent.',
|
|
27
|
+
'login.tryAgain': 'Try again?',
|
|
28
|
+
// agent install / configure / launch
|
|
29
|
+
'agent.notInstalled': '{name} is not installed.',
|
|
30
|
+
'agent.notInstallable': '{name} is not installable from the CLI.',
|
|
31
|
+
'agent.installPrompt': '{name} is not installed. Install now?',
|
|
32
|
+
'agent.installing': 'Installing {name} ...',
|
|
33
|
+
'agent.installed': '{name} installed.',
|
|
34
|
+
'agent.installFailed': 'Could not install {name} automatically.',
|
|
35
|
+
'agent.installFailHint1': 'This usually means npm cannot write to its global folder. Options:',
|
|
36
|
+
'agent.installFailHint2': ' • Use a Node version manager (nvm / fnm / volta) — then global installs need no sudo, or',
|
|
37
|
+
'agent.installFailHint3': ' • Install it yourself: {cmd}',
|
|
38
|
+
'agent.installFailHint4': 'Then re-run this command — your TokenMix login is already saved.',
|
|
39
|
+
'agent.configuring': 'Configuring {name} ...',
|
|
40
|
+
'agent.wrote': 'Wrote {path}',
|
|
41
|
+
'agent.configReady': '{name} configuration ready.',
|
|
42
|
+
'agent.launching': 'Launching {name} ...',
|
|
43
|
+
// logout
|
|
44
|
+
'logout.done': 'Logged out. Credentials removed from this machine.',
|
|
45
|
+
'logout.reverted': 'Reverted {name} config',
|
|
46
|
+
// doctor
|
|
47
|
+
'doctor.title': 'TokenMix CLI diagnostic',
|
|
48
|
+
'doctor.credentials': 'Credentials:',
|
|
49
|
+
'doctor.apiKeyLabel': 'API key:',
|
|
50
|
+
'doctor.apiBaseLabel': 'API base:',
|
|
51
|
+
'doctor.keyValid': 'API key is valid.',
|
|
52
|
+
'doctor.keyInvalid': 'API key did NOT validate. Run `tokenmix login` again.',
|
|
53
|
+
'doctor.notLoggedIn': 'Not logged in. Run `tokenmix login`.',
|
|
54
|
+
'doctor.agentStatus': 'Agent install status:',
|
|
55
|
+
'doctor.installed': 'installed',
|
|
56
|
+
'doctor.notInstalled': 'not installed',
|
|
57
|
+
// list
|
|
58
|
+
'list.title': 'Supported agents:',
|
|
59
|
+
'list.usage': 'Usage: tokenmix <agent> [args...]',
|
|
60
|
+
'list.modeAutoNpm': 'auto (npm)',
|
|
61
|
+
'list.modeAutoPip': 'semi (pip)',
|
|
62
|
+
'list.modeManualVscode': 'config-only (VSCode)',
|
|
63
|
+
'list.modeManual': 'manual',
|
|
64
|
+
// models
|
|
65
|
+
'models.none': 'No models match the filter.',
|
|
66
|
+
'models.typeChat': 'Chat',
|
|
67
|
+
'models.typeEmbedding': 'Embedding',
|
|
68
|
+
'models.typeImage': 'Image',
|
|
69
|
+
'models.typeAudio': 'Audio',
|
|
70
|
+
'models.typeVideo': 'Video',
|
|
71
|
+
'models.typeCompletion': 'Completion',
|
|
72
|
+
'models.in': 'in',
|
|
73
|
+
'models.out': 'out',
|
|
74
|
+
// prompt
|
|
75
|
+
'prompt.pasteKey': 'Paste your TokenMix API key (sk-tm-...)',
|
|
76
|
+
// browser
|
|
77
|
+
'balance.opening': 'Opening dashboard to view balance: {url}',
|
|
78
|
+
'topup.opening': 'Opening top-up page: {url}',
|
|
79
|
+
'browser.manual': 'Could not open a browser automatically. Open this URL manually:\n {url}',
|
|
80
|
+
};
|
|
81
|
+
export const zh = {
|
|
82
|
+
'common.notLoggedIn': '未登录,请先运行 `tokenmix login`。',
|
|
83
|
+
// login
|
|
84
|
+
'login.keyMustStart': 'API 密钥应以 sk-tm- 开头',
|
|
85
|
+
'login.verifying': '正在通过 {baseUrl} 校验 API 密钥 ...',
|
|
86
|
+
'login.verifyFailed': 'API 密钥校验失败。请到 https://tokenmix.ai/dashboard/keys 核对',
|
|
87
|
+
'login.loggedInHint': '登录成功。试试 `tokenmix opencode` 启动你的第一个 agent。',
|
|
88
|
+
'login.noKey': '未提供 API 密钥。',
|
|
89
|
+
'login.requesting': '正在请求设备授权 ...',
|
|
90
|
+
'login.couldNotStart': '无法发起设备授权:{msg}',
|
|
91
|
+
'login.fallbackPaste': '改用手动粘贴。可在 https://tokenmix.ai/dashboard/keys 获取 API 密钥',
|
|
92
|
+
'login.openLinkConfirm': '打开下方链接并确认此验证码:',
|
|
93
|
+
'login.link': '链接:',
|
|
94
|
+
'login.browserOpened': '(已打开浏览器;若无反应,请复制上面的链接)',
|
|
95
|
+
'login.browserFailed': '(无法打开浏览器;请复制上面的链接到浏览器打开)',
|
|
96
|
+
'login.waiting': '等待授权({expires}s 后过期,每 {interval}s 轮询一次)...',
|
|
97
|
+
'login.stillWaiting': '... 仍在等待(剩余 {seconds}s)',
|
|
98
|
+
'login.loggedInAs': '已登录:{email}(API 密钥 #{id})',
|
|
99
|
+
'login.loggedInId': '登录成功(API 密钥 #{id})',
|
|
100
|
+
'login.tryFirstAgent': '试试 `tokenmix opencode` 启动你的第一个 agent。',
|
|
101
|
+
'login.tryAgain': '重试?',
|
|
102
|
+
// agent install / configure / launch
|
|
103
|
+
'agent.notInstalled': '{name} 尚未安装。',
|
|
104
|
+
'agent.notInstallable': '{name} 无法通过 CLI 安装。',
|
|
105
|
+
'agent.installPrompt': '{name} 尚未安装。现在安装?',
|
|
106
|
+
'agent.installing': '正在安装 {name} ...',
|
|
107
|
+
'agent.installed': '{name} 安装完成。',
|
|
108
|
+
'agent.installFailed': '无法自动安装 {name}。',
|
|
109
|
+
'agent.installFailHint1': '这通常是 npm 无权写入全局目录。可选方案:',
|
|
110
|
+
'agent.installFailHint2': ' • 使用 Node 版本管理器(nvm / fnm / volta)—— 全局安装即无需 sudo;或',
|
|
111
|
+
'agent.installFailHint3': ' • 自行安装:{cmd}',
|
|
112
|
+
'agent.installFailHint4': '随后重新运行本命令 —— 你的 TokenMix 登录已保存。',
|
|
113
|
+
'agent.configuring': '正在配置 {name} ...',
|
|
114
|
+
'agent.wrote': '已写入 {path}',
|
|
115
|
+
'agent.configReady': '{name} 配置已就绪。',
|
|
116
|
+
'agent.launching': '正在启动 {name} ...',
|
|
117
|
+
// logout
|
|
118
|
+
'logout.done': '已登出。凭据已从本机移除。',
|
|
119
|
+
'logout.reverted': '已还原 {name} 配置',
|
|
120
|
+
// doctor
|
|
121
|
+
'doctor.title': 'TokenMix CLI 诊断',
|
|
122
|
+
'doctor.credentials': '凭据:',
|
|
123
|
+
'doctor.apiKeyLabel': 'API 密钥:',
|
|
124
|
+
'doctor.apiBaseLabel': 'API 地址:',
|
|
125
|
+
'doctor.keyValid': 'API 密钥有效。',
|
|
126
|
+
'doctor.keyInvalid': 'API 密钥校验未通过。请重新运行 `tokenmix login`。',
|
|
127
|
+
'doctor.notLoggedIn': '未登录。请运行 `tokenmix login`。',
|
|
128
|
+
'doctor.agentStatus': 'Agent 安装状态:',
|
|
129
|
+
'doctor.installed': '已安装',
|
|
130
|
+
'doctor.notInstalled': '未安装',
|
|
131
|
+
// list
|
|
132
|
+
'list.title': '支持的 agent:',
|
|
133
|
+
'list.usage': '用法:tokenmix <agent> [参数...]',
|
|
134
|
+
'list.modeAutoNpm': '自动 (npm)',
|
|
135
|
+
'list.modeAutoPip': '半自动 (pip)',
|
|
136
|
+
'list.modeManualVscode': '仅配置 (VSCode)',
|
|
137
|
+
'list.modeManual': '手动',
|
|
138
|
+
// models
|
|
139
|
+
'models.none': '没有匹配该筛选条件的模型。',
|
|
140
|
+
'models.typeChat': '对话',
|
|
141
|
+
'models.typeEmbedding': '向量',
|
|
142
|
+
'models.typeImage': '图像',
|
|
143
|
+
'models.typeAudio': '音频',
|
|
144
|
+
'models.typeVideo': '视频',
|
|
145
|
+
'models.typeCompletion': '补全',
|
|
146
|
+
'models.in': '输入',
|
|
147
|
+
'models.out': '输出',
|
|
148
|
+
// prompt
|
|
149
|
+
'prompt.pasteKey': '粘贴你的 TokenMix API 密钥(sk-tm-...)',
|
|
150
|
+
// browser
|
|
151
|
+
'balance.opening': '正在打开仪表盘查看余额:{url}',
|
|
152
|
+
'topup.opening': '正在打开充值页面:{url}',
|
|
153
|
+
'browser.manual': '无法自动打开浏览器。请手动打开此链接:\n {url}',
|
|
154
|
+
};
|
|
155
|
+
export const catalogs = { en, zh };
|
|
156
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/browser.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import open from 'open';
|
|
2
2
|
import { logger } from './logger.js';
|
|
3
|
+
import { t } from '../i18n/index.js';
|
|
3
4
|
export async function openInBrowser(url) {
|
|
4
5
|
await open(url);
|
|
5
6
|
}
|
|
@@ -10,7 +11,7 @@ export async function openOrHint(url) {
|
|
|
10
11
|
await open(url);
|
|
11
12
|
}
|
|
12
13
|
catch {
|
|
13
|
-
logger.info(
|
|
14
|
+
logger.info(t('browser.manual', { url }));
|
|
14
15
|
}
|
|
15
16
|
}
|
|
16
17
|
//# sourceMappingURL=browser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,IAAI,CAAC,GAAG,CAAC,CAAA;AACjB,CAAC;AAED,iFAAiF;AACjF,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAA;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AAEpC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,IAAI,CAAC,GAAG,CAAC,CAAA;AACjB,CAAC;AAED,iFAAiF;AACjF,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAA;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAC3C,CAAC;AACH,CAAC"}
|
package/dist/utils/prompt.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import prompts from 'prompts';
|
|
2
|
+
import { t } from '../i18n/index.js';
|
|
2
3
|
export async function promptApiKey() {
|
|
3
4
|
const r = await prompts({
|
|
4
5
|
type: 'password',
|
|
5
6
|
name: 'apiKey',
|
|
6
|
-
message: '
|
|
7
|
-
validate: (v) => v && v.startsWith('sk-tm-') ? true : '
|
|
7
|
+
message: t('prompt.pasteKey'),
|
|
8
|
+
validate: (v) => v && v.startsWith('sk-tm-') ? true : t('login.keyMustStart'),
|
|
8
9
|
});
|
|
9
10
|
const key = r.apiKey?.trim();
|
|
10
11
|
return key || null;
|
package/dist/utils/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AAEpC,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC;QACtB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,CAAC,iBAAiB,CAAC;QAC7B,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CACtB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;KAC/D,CAAC,CAAA;IACF,MAAM,GAAG,GAAI,CAAC,CAAC,MAA6B,EAAE,IAAI,EAAE,CAAA;IACpD,OAAO,GAAG,IAAI,IAAI,CAAA;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,UAAmB,IAAI;IACpE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC;QACtB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,IAAI;QACV,OAAO;QACP,OAAO;KACR,CAAC,CAAA;IACF,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACtB,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAe,EACf,OAA0B;IAE1B,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC;QACtB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;QACb,OAAO;QACP,OAAO;KACR,CAAC,CAAA;IACF,OAAQ,CAAC,CAAC,KAAW,IAAI,IAAI,CAAA;AAC/B,CAAC"}
|