mimo2codex 0.1.2 → 0.1.5

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.
@@ -0,0 +1,288 @@
1
+ import { existsSync, readFileSync, statSync } from "node:fs";
2
+ import { extname, join, normalize, resolve } from "node:path";
3
+ import { PROVIDER_LIST } from "../providers/registry.js";
4
+ import { aggregateMappings, aggregateStats, deleteLogsBefore, queryLogs, } from "../db/logs.js";
5
+ import { deleteModel, insertCustomModel, listAliases, listModels, patchModel, upsertAlias, deleteAlias, } from "../db/models.js";
6
+ import { deleteSetting, ForbiddenSettingError, isForbiddenSettingKey, listSettings, setSetting, } from "../db/settings.js";
7
+ import { isProviderId } from "../providers/registry.js";
8
+ import { log } from "../util/log.js";
9
+ const STATIC_ROOT = (() => {
10
+ // dist/web/ is created when `web/` is built (vite.config.ts → outDir).
11
+ // tsc separately writes the admin handler bundle to dist/admin/, so the two
12
+ // paths cannot be the same — that's why the static root lives under
13
+ // dist/web/ rather than dist/admin/.
14
+ const candidate = resolve(process.cwd(), "dist", "web");
15
+ return candidate;
16
+ })();
17
+ const MIME = {
18
+ ".html": "text/html; charset=utf-8",
19
+ ".js": "application/javascript; charset=utf-8",
20
+ ".css": "text/css; charset=utf-8",
21
+ ".json": "application/json; charset=utf-8",
22
+ ".svg": "image/svg+xml",
23
+ ".png": "image/png",
24
+ ".jpg": "image/jpeg",
25
+ ".jpeg": "image/jpeg",
26
+ ".ico": "image/x-icon",
27
+ ".woff": "font/woff",
28
+ ".woff2": "font/woff2",
29
+ };
30
+ function sendJson(res, status, body) {
31
+ res.statusCode = status;
32
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
33
+ res.end(JSON.stringify(body));
34
+ }
35
+ function sendError(res, status, code, message) {
36
+ sendJson(res, status, { error: { code, message, status } });
37
+ }
38
+ async function readJsonBody(req, maxBytes = 1024 * 1024) {
39
+ return await new Promise((resolve, reject) => {
40
+ const chunks = [];
41
+ let total = 0;
42
+ req.on("data", (c) => {
43
+ total += c.length;
44
+ if (total > maxBytes) {
45
+ reject(new Error("admin body too large"));
46
+ req.destroy();
47
+ return;
48
+ }
49
+ chunks.push(c);
50
+ });
51
+ req.on("end", () => {
52
+ try {
53
+ const text = Buffer.concat(chunks).toString("utf-8");
54
+ if (!text)
55
+ return resolve({});
56
+ resolve(JSON.parse(text));
57
+ }
58
+ catch (err) {
59
+ reject(err);
60
+ }
61
+ });
62
+ req.on("error", reject);
63
+ });
64
+ }
65
+ function parseUrl(req) {
66
+ const u = new URL(req.url ?? "/", "http://localhost");
67
+ return { pathname: u.pathname, query: u.searchParams };
68
+ }
69
+ function providerStateFor(cfg) {
70
+ return PROVIDER_LIST.map((p) => {
71
+ const runtime = cfg.providers[p.id];
72
+ return {
73
+ id: p.id,
74
+ shortcut: p.shortcut,
75
+ display_name: p.displayName,
76
+ default: cfg.defaultProviderId === p.id,
77
+ enabled: !!runtime,
78
+ api_key_present: !!runtime,
79
+ api_key_env: p.envKeys,
80
+ base_url: runtime?.baseUrl ?? p.defaultBaseUrl,
81
+ default_model: p.defaultModel,
82
+ flags: runtime?.flags ?? {},
83
+ };
84
+ });
85
+ }
86
+ async function handleApi(ctx) {
87
+ const { cfg, req, res, pathname, query } = ctx;
88
+ // GET /admin/api/health — quick liveness probe for the UI
89
+ if (req.method === "GET" && pathname === "/admin/api/health") {
90
+ return sendJson(res, 200, { ok: true, dataDir: cfg.dataDir });
91
+ }
92
+ if (req.method === "GET" && pathname === "/admin/api/providers") {
93
+ return sendJson(res, 200, { providers: providerStateFor(cfg) });
94
+ }
95
+ // /admin/api/providers/:id/models
96
+ const provModels = pathname.match(/^\/admin\/api\/providers\/([^/]+)\/models$/);
97
+ if (provModels) {
98
+ const id = provModels[1];
99
+ if (!isProviderId(id))
100
+ return sendError(res, 404, "unknown_provider", `unknown provider ${id}`);
101
+ if (req.method === "GET") {
102
+ return sendJson(res, 200, { models: listModels(id) });
103
+ }
104
+ if (req.method === "POST") {
105
+ const body = await readJsonBody(req);
106
+ if (!body.upstream_id)
107
+ return sendError(res, 400, "missing_upstream_id", "upstream_id required");
108
+ try {
109
+ const row = insertCustomModel(id, {
110
+ upstream_id: body.upstream_id,
111
+ display_name: body.display_name,
112
+ });
113
+ return sendJson(res, 201, { model: row });
114
+ }
115
+ catch (err) {
116
+ return sendError(res, 400, "insert_failed", err.message);
117
+ }
118
+ }
119
+ return sendError(res, 405, "method_not_allowed", "use GET or POST");
120
+ }
121
+ // /admin/api/models/:id
122
+ const modelId = pathname.match(/^\/admin\/api\/models\/(\d+)$/);
123
+ if (modelId) {
124
+ const id = Number(modelId[1]);
125
+ if (req.method === "PATCH") {
126
+ const body = await readJsonBody(req);
127
+ try {
128
+ const row = patchModel(id, body);
129
+ if (!row)
130
+ return sendError(res, 404, "not_found", `model ${id} not found`);
131
+ return sendJson(res, 200, { model: row });
132
+ }
133
+ catch (err) {
134
+ return sendError(res, 400, "patch_failed", err.message);
135
+ }
136
+ }
137
+ if (req.method === "DELETE") {
138
+ try {
139
+ const ok = deleteModel(id);
140
+ if (!ok)
141
+ return sendError(res, 404, "not_found", `model ${id} not found`);
142
+ return sendJson(res, 200, { deleted: true });
143
+ }
144
+ catch (err) {
145
+ return sendError(res, 400, "delete_failed", err.message);
146
+ }
147
+ }
148
+ return sendError(res, 405, "method_not_allowed", "use PATCH or DELETE");
149
+ }
150
+ if (pathname === "/admin/api/aliases") {
151
+ if (req.method === "GET") {
152
+ return sendJson(res, 200, { aliases: listAliases() });
153
+ }
154
+ if (req.method === "POST") {
155
+ const body = await readJsonBody(req);
156
+ if (!body.alias || !body.provider_id || !body.upstream_id) {
157
+ return sendError(res, 400, "missing_fields", "alias, provider_id and upstream_id required");
158
+ }
159
+ if (!isProviderId(body.provider_id)) {
160
+ return sendError(res, 400, "unknown_provider", `unknown provider ${body.provider_id}`);
161
+ }
162
+ upsertAlias({
163
+ alias: body.alias,
164
+ provider_id: body.provider_id,
165
+ upstream_id: body.upstream_id,
166
+ });
167
+ return sendJson(res, 201, { alias: body.alias });
168
+ }
169
+ return sendError(res, 405, "method_not_allowed", "use GET or POST");
170
+ }
171
+ const aliasMatch = pathname.match(/^\/admin\/api\/aliases\/(.+)$/);
172
+ if (aliasMatch && req.method === "DELETE") {
173
+ const alias = decodeURIComponent(aliasMatch[1]);
174
+ const ok = deleteAlias(alias);
175
+ if (!ok)
176
+ return sendError(res, 404, "not_found", `alias ${alias} not found`);
177
+ return sendJson(res, 200, { deleted: true });
178
+ }
179
+ if (req.method === "GET" && pathname === "/admin/api/logs") {
180
+ const provider = query.get("provider") ?? undefined;
181
+ const from = query.get("from") ? Number(query.get("from")) : undefined;
182
+ const to = query.get("to") ? Number(query.get("to")) : undefined;
183
+ const limit = query.get("limit") ? Number(query.get("limit")) : undefined;
184
+ const offset = query.get("offset") ? Number(query.get("offset")) : undefined;
185
+ return sendJson(res, 200, { logs: queryLogs({ provider, from, to, limit, offset }) });
186
+ }
187
+ if (req.method === "DELETE" && pathname === "/admin/api/logs") {
188
+ const before = query.get("before");
189
+ if (!before)
190
+ return sendError(res, 400, "missing_before", "?before=<ts_ms> required");
191
+ const removed = deleteLogsBefore(Number(before));
192
+ return sendJson(res, 200, { removed });
193
+ }
194
+ if (req.method === "GET" && pathname === "/admin/api/mappings") {
195
+ return sendJson(res, 200, { mappings: aggregateMappings() });
196
+ }
197
+ if (req.method === "GET" && pathname === "/admin/api/stats") {
198
+ const range = query.get("range") ?? "24h";
199
+ return sendJson(res, 200, aggregateStats(range));
200
+ }
201
+ if (req.method === "GET" && pathname === "/admin/api/settings") {
202
+ return sendJson(res, 200, { settings: listSettings() });
203
+ }
204
+ const settingKey = pathname.match(/^\/admin\/api\/settings\/([^/]+)$/);
205
+ if (settingKey) {
206
+ const key = decodeURIComponent(settingKey[1]);
207
+ if (req.method === "PUT") {
208
+ if (isForbiddenSettingKey(key)) {
209
+ return sendError(res, 400, "forbidden_setting", `${key} cannot be stored in the UI — set the corresponding env var instead (MIMO_API_KEY, DS_API_KEY, DEEPSEEK_API_KEY) and restart mimo2codex.`);
210
+ }
211
+ const body = await readJsonBody(req);
212
+ if (typeof body.value !== "string") {
213
+ return sendError(res, 400, "invalid_value", "value must be a string");
214
+ }
215
+ try {
216
+ setSetting(key, body.value);
217
+ return sendJson(res, 200, { key, value: body.value });
218
+ }
219
+ catch (err) {
220
+ if (err instanceof ForbiddenSettingError) {
221
+ return sendError(res, 400, "forbidden_setting", err.message);
222
+ }
223
+ throw err;
224
+ }
225
+ }
226
+ if (req.method === "DELETE") {
227
+ const ok = deleteSetting(key);
228
+ if (!ok)
229
+ return sendError(res, 404, "not_found", `setting ${key} not found`);
230
+ return sendJson(res, 200, { deleted: true });
231
+ }
232
+ return sendError(res, 405, "method_not_allowed", "use PUT or DELETE");
233
+ }
234
+ return sendError(res, 404, "not_found", `no admin route for ${req.method} ${pathname}`);
235
+ }
236
+ function serveStatic(res, pathname) {
237
+ if (!existsSync(STATIC_ROOT)) {
238
+ res.statusCode = 503;
239
+ res.setHeader("Content-Type", "text/plain; charset=utf-8");
240
+ res.end("Admin UI not built. Run `npm run web:build` (or `npm run build:all`) to populate dist/admin/.\n");
241
+ return;
242
+ }
243
+ // Strip /admin prefix.
244
+ const rel = pathname.replace(/^\/admin\/?/, "") || "index.html";
245
+ const safe = normalize(rel).replace(/^[/\\]+/, "");
246
+ if (safe.includes("..")) {
247
+ res.statusCode = 400;
248
+ res.end("bad path");
249
+ return;
250
+ }
251
+ let filePath = join(STATIC_ROOT, safe);
252
+ if (existsSync(filePath) && statSync(filePath).isDirectory()) {
253
+ filePath = join(filePath, "index.html");
254
+ }
255
+ if (!existsSync(filePath)) {
256
+ // SPA fallback
257
+ filePath = join(STATIC_ROOT, "index.html");
258
+ if (!existsSync(filePath)) {
259
+ res.statusCode = 404;
260
+ res.end("not found");
261
+ return;
262
+ }
263
+ }
264
+ const ct = MIME[extname(filePath).toLowerCase()] ?? "application/octet-stream";
265
+ res.statusCode = 200;
266
+ res.setHeader("Content-Type", ct);
267
+ res.end(readFileSync(filePath));
268
+ }
269
+ export async function handleAdmin(cfg, req, res) {
270
+ const { pathname, query } = parseUrl(req);
271
+ try {
272
+ if (pathname.startsWith("/admin/api/")) {
273
+ await handleApi({ cfg, req, res, pathname, query });
274
+ return;
275
+ }
276
+ if (req.method === "GET" && (pathname === "/admin" || pathname.startsWith("/admin/"))) {
277
+ serveStatic(res, pathname);
278
+ return;
279
+ }
280
+ sendError(res, 404, "not_found", `no admin route for ${req.method} ${pathname}`);
281
+ }
282
+ catch (err) {
283
+ log.error("admin handler error", { error: err.message, stack: err.stack });
284
+ if (!res.headersSent)
285
+ sendError(res, 500, "internal_error", err.message);
286
+ }
287
+ }
288
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/admin/router.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -3,8 +3,9 @@ import { createRequire } from "node:module";
3
3
  import { buildConfig, parseArgv } from "./config.js";
4
4
  import { startServer } from "./server.js";
5
5
  import { setVerbose, log, redactKey } from "./util/log.js";
6
+ import { closeDb, openDb } from "./db/index.js";
6
7
  const VERSION = createRequire(import.meta.url)("../package.json").version;
7
- const HELP = `mimo2codex v${VERSION} — local proxy: Codex Responses API → Xiaomi MiMo Chat Completions
8
+ const HELP = `mimo2codex v${VERSION} — local proxy: Codex Responses API → Chat Completions (MiMo / DeepSeek)
8
9
 
9
10
  USAGE
10
11
  mimo2codex [options]
@@ -14,14 +15,26 @@ USAGE
14
15
  OPTIONS
15
16
  -p, --port <n> listen port (default: 8788, env: MIMO2CODEX_PORT)
16
17
  --host <h> bind host (default: 127.0.0.1, env: MIMO2CODEX_HOST)
17
- --base-url <url> MiMo base url (default: https://api.xiaomimimo.com/v1, env: MIMO_BASE_URL)
18
- --api-key <key> MiMo api key (env: MIMO_API_KEY) required
19
- --no-reasoning hide MiMo reasoning_content from Codex (still re-injected for multi-turn quality)
18
+ --model <shortcut> default upstream provider: "mimo" (default) or "ds" (DeepSeek)
19
+ --base-url <url> base url for the default provider (env: MIMO_BASE_URL / DEEPSEEK_BASE_URL)
20
+ --api-key <key> api key for the default provider (env varies see below) — required
21
+ --no-reasoning hide reasoning_content from Codex (still re-injected for multi-turn quality)
20
22
  --reasoning force reasoning passthrough (default)
23
+ --data-dir <path> admin sqlite + UI data directory (default: ~/.mimo2codex,
24
+ env: MIMO2CODEX_DATA_DIR)
25
+ --no-admin disable the local admin UI + sqlite logging
26
+ (env: MIMO2CODEX_NO_ADMIN=1)
21
27
  -v, --verbose log every request (env: MIMO2CODEX_VERBOSE=1)
22
28
  -V, --version print version
23
29
  -h, --help show this help
24
30
 
31
+ PROVIDER KEYS
32
+ MiMo: MIMO_API_KEY (default base: https://api.xiaomimimo.com/v1)
33
+ DeepSeek: DS_API_KEY or DEEPSEEK_API_KEY (default base: https://api.deepseek.com/v1)
34
+ Set the key for whichever provider --model selects. Other providers are
35
+ registered automatically when their key is present (per-request routing
36
+ lands in a follow-up release).
37
+
25
38
  DEFAULTS BAKED IN (no flag needed)
26
39
  ✓ MiMo thinking mode ON — model generates reasoning_content; use
27
40
  --no-reasoning to hide it from the Codex terminal (still preserved
@@ -135,15 +148,61 @@ ${configToml}
135
148
  # on the machine running mimo2codex.
136
149
  `;
137
150
  }
151
+ function checkMimoHostMismatch(cfg) {
152
+ // Catch the most common foot-gun: tp-* key sent at the pay-as-you-go host
153
+ // (or sk-* key sent at the token-plan host) — usually because MIMO_BASE_URL
154
+ // is left over in the shell from a previous session. Yields 401 or
155
+ // confusing 400s upstream; cheaper to warn at startup.
156
+ if (cfg.defaultProviderId !== "mimo")
157
+ return null;
158
+ const isTpKey = cfg.apiKey.startsWith("tp-");
159
+ const isSkKey = cfg.apiKey.startsWith("sk-");
160
+ const hostIsTokenPlan = /token-plan/i.test(cfg.baseUrl);
161
+ if (isTpKey && !hostIsTokenPlan) {
162
+ return `tp-* key 通常需要 token-plan 主机,但当前 baseUrl 是 ${cfg.baseUrl}。检查 MIMO_BASE_URL / --base-url 是否覆盖了自动推断。`;
163
+ }
164
+ if (isSkKey && hostIsTokenPlan) {
165
+ return `sk-* key 通常需要 pay-as-you-go 主机,但当前 baseUrl 是 ${cfg.baseUrl}。检查 MIMO_BASE_URL / --base-url 是否泄漏(PowerShell: Remove-Item Env:MIMO_BASE_URL)。`;
166
+ }
167
+ return null;
168
+ }
138
169
  function printStartupBanner(cfg) {
139
170
  // eslint-disable-next-line no-console
140
171
  console.log(`mimo2codex v${VERSION} listening on http://${cfg.host}:${cfg.port}`);
141
172
  // eslint-disable-next-line no-console
173
+ console.log(`provider: ${cfg.defaultProviderId}`);
174
+ // eslint-disable-next-line no-console
142
175
  console.log(`upstream: ${cfg.baseUrl}`);
143
176
  // eslint-disable-next-line no-console
144
177
  console.log(`api key: ${redactKey(cfg.apiKey)}`);
178
+ const mismatch = checkMimoHostMismatch(cfg);
179
+ if (mismatch) {
180
+ // eslint-disable-next-line no-console
181
+ console.log(`⚠ 警告: ${mismatch}`);
182
+ }
183
+ if (cfg.defaultProviderId === "mimo") {
184
+ // eslint-disable-next-line no-console
185
+ console.log(`plan: ${cfg.isTokenPlan ? "token-plan (web_search auto-disabled — plugin not available)" : "pay-as-you-go"}`);
186
+ }
145
187
  // eslint-disable-next-line no-console
146
188
  console.log(`reasoning: ${cfg.exposeReasoning ? "passthrough" : "hidden"}`);
189
+ const others = Object.keys(cfg.providers)
190
+ .filter((id) => id !== cfg.defaultProviderId && cfg.providers[id])
191
+ .join(", ");
192
+ if (others) {
193
+ // eslint-disable-next-line no-console
194
+ console.log(`registered: ${others} (model-routed when client picks one of those ids)`);
195
+ }
196
+ if (cfg.adminEnabled) {
197
+ // eslint-disable-next-line no-console
198
+ console.log(`admin UI: http://${cfg.host}:${cfg.port}/admin/`);
199
+ // eslint-disable-next-line no-console
200
+ console.log(`data dir: ${cfg.dataDir}`);
201
+ }
202
+ else {
203
+ // eslint-disable-next-line no-console
204
+ console.log(`admin UI: disabled (--no-admin)`);
205
+ }
147
206
  // eslint-disable-next-line no-console
148
207
  console.log("");
149
208
  // eslint-disable-next-line no-console
@@ -194,6 +253,17 @@ function main() {
194
253
  process.exit(2);
195
254
  }
196
255
  setVerbose(cfg.verbose);
256
+ if (cfg.adminEnabled) {
257
+ try {
258
+ openDb(cfg.dataDir);
259
+ }
260
+ catch (err) {
261
+ // eslint-disable-next-line no-console
262
+ console.error(`error: failed to open admin database at ${cfg.dataDir}: ${err.message}\n` +
263
+ `Pass --no-admin to disable persistence, or --data-dir <path> to choose a writable location.`);
264
+ process.exit(2);
265
+ }
266
+ }
197
267
  printStartupBanner(cfg);
198
268
  const server = startServer(cfg);
199
269
  server.on("listening", () => {
@@ -205,7 +275,15 @@ function main() {
205
275
  });
206
276
  const shutdown = (sig) => {
207
277
  log.info(`received ${sig}, shutting down`);
208
- server.close(() => process.exit(0));
278
+ server.close(() => {
279
+ try {
280
+ closeDb();
281
+ }
282
+ catch {
283
+ // ignore
284
+ }
285
+ process.exit(0);
286
+ });
209
287
  setTimeout(() => process.exit(1), 5000).unref();
210
288
  };
211
289
  process.on("SIGINT", () => shutdown("SIGINT"));
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -1,7 +1,8 @@
1
+ import { byShortcut, isProviderId, PROVIDER_LIST, PROVIDERS } from "./providers/registry.js";
2
+ import { resolveDataDir } from "./db/dataDir.js";
1
3
  const DEFAULTS = {
2
4
  host: "127.0.0.1",
3
5
  port: 8788,
4
- baseUrl: "https://api.xiaomimimo.com/v1",
5
6
  };
6
7
  export function parseArgv(argv) {
7
8
  const out = { positional: [], showHelp: false, showVersion: false };
@@ -31,6 +32,9 @@ export function parseArgv(argv) {
31
32
  case "--api-key":
32
33
  out.apiKey = next();
33
34
  break;
35
+ case "--model":
36
+ out.model = next();
37
+ break;
34
38
  case "--no-reasoning":
35
39
  out.exposeReasoning = false;
36
40
  break;
@@ -44,6 +48,12 @@ export function parseArgv(argv) {
44
48
  case "--env-key":
45
49
  out.envKey = true;
46
50
  break;
51
+ case "--data-dir":
52
+ out.dataDir = next();
53
+ break;
54
+ case "--no-admin":
55
+ out.noAdmin = true;
56
+ break;
47
57
  case "--help":
48
58
  case "-h":
49
59
  out.showHelp = true;
@@ -61,26 +71,98 @@ export function parseArgv(argv) {
61
71
  }
62
72
  return out;
63
73
  }
74
+ function resolveProviderRuntime(provider, isDefault, parsed, env) {
75
+ // CLI --api-key / --base-url apply only to the default provider.
76
+ const apiKeyFromCli = isDefault ? parsed.apiKey : undefined;
77
+ const baseUrlFromCli = isDefault ? parsed.baseUrl : undefined;
78
+ let apiKey = apiKeyFromCli;
79
+ if (!apiKey) {
80
+ for (const k of provider.envKeys) {
81
+ const v = env[k];
82
+ if (v) {
83
+ apiKey = v;
84
+ break;
85
+ }
86
+ }
87
+ }
88
+ if (!apiKey)
89
+ return null;
90
+ // Priority: CLI --base-url > env > key-based inference > defaultBaseUrl.
91
+ // Key-based inference handles MiMo's tp-* / sk-* tiers — using the wrong
92
+ // host with a tp-* key 401s, so this auto-switches to the right one when
93
+ // the user hasn't overridden it explicitly.
94
+ const baseUrl = baseUrlFromCli ??
95
+ env[provider.baseUrlEnv] ??
96
+ provider.inferBaseUrlFromKey?.(apiKey) ??
97
+ provider.defaultBaseUrl;
98
+ return {
99
+ apiKey,
100
+ baseUrl,
101
+ flags: provider.detectFlags(apiKey, baseUrl),
102
+ };
103
+ }
64
104
  export function buildConfig(parsed, env, version) {
65
105
  const exposeReasoningEnv = env.MIMO2CODEX_NO_REASONING ? false : true;
66
106
  const verboseEnv = !!env.MIMO2CODEX_VERBOSE;
67
- const apiKey = parsed.apiKey ?? env.MIMO_API_KEY ?? "";
68
- if (!apiKey) {
69
- throw new Error("missing MiMo API key — set MIMO_API_KEY env var or pass --api-key. " +
70
- "Get one at https://platform.xiaomimimo.com/#/console/api-keys");
107
+ // Resolve default provider. --model accepts either a known shortcut ("ds")
108
+ // or a full provider id ("deepseek"). Default = mimo.
109
+ let defaultProviderId = "mimo";
110
+ if (parsed.model) {
111
+ const p = byShortcut(parsed.model);
112
+ if (!p) {
113
+ const known = PROVIDER_LIST.map((x) => `${x.shortcut} (${x.id})`).join(", ");
114
+ throw new Error(`unknown --model "${parsed.model}". Known providers: ${known}`);
115
+ }
116
+ defaultProviderId = p.id;
117
+ }
118
+ else if (env.MIMO2CODEX_DEFAULT_PROVIDER) {
119
+ if (!isProviderId(env.MIMO2CODEX_DEFAULT_PROVIDER)) {
120
+ throw new Error(`MIMO2CODEX_DEFAULT_PROVIDER must be one of: ${PROVIDER_LIST.map((p) => p.id).join(", ")}`);
121
+ }
122
+ defaultProviderId = env.MIMO2CODEX_DEFAULT_PROVIDER;
123
+ }
124
+ // Resolve runtime for every provider; null when no key is available. We
125
+ // register all providers up-front so PR2's per-request routing can dispatch
126
+ // to a non-default provider when its key is present.
127
+ const providers = {
128
+ mimo: null,
129
+ deepseek: null,
130
+ };
131
+ for (const p of PROVIDER_LIST) {
132
+ providers[p.id] = resolveProviderRuntime(p, p.id === defaultProviderId, parsed, env);
133
+ }
134
+ const defaultRuntime = providers[defaultProviderId];
135
+ if (!defaultRuntime) {
136
+ const def = PROVIDERS[defaultProviderId];
137
+ const envHint = def.envKeys.join(" or ");
138
+ const docs = def.id === "mimo"
139
+ ? "Get one at https://platform.xiaomimimo.com/#/console/api-keys"
140
+ : "Get one at https://platform.deepseek.com/api_keys";
141
+ throw new Error(`missing API key for ${def.displayName} — set ${envHint} env var or pass --api-key. ${docs}`);
71
142
  }
72
143
  const portFromEnv = env.MIMO2CODEX_PORT ? Number(env.MIMO2CODEX_PORT) : undefined;
73
144
  if (portFromEnv !== undefined && Number.isNaN(portFromEnv)) {
74
145
  throw new Error("MIMO2CODEX_PORT must be a number");
75
146
  }
147
+ const adminEnabled = parsed.noAdmin
148
+ ? false
149
+ : env.MIMO2CODEX_NO_ADMIN
150
+ ? false
151
+ : true;
152
+ const dataDir = adminEnabled ? resolveDataDir(parsed.dataDir, env) : "";
76
153
  return {
77
154
  host: parsed.host ?? env.MIMO2CODEX_HOST ?? DEFAULTS.host,
78
155
  port: parsed.port ?? portFromEnv ?? DEFAULTS.port,
79
- baseUrl: parsed.baseUrl ?? env.MIMO_BASE_URL ?? DEFAULTS.baseUrl,
80
- apiKey,
156
+ baseUrl: defaultRuntime.baseUrl,
157
+ apiKey: defaultRuntime.apiKey,
81
158
  exposeReasoning: parsed.exposeReasoning ?? exposeReasoningEnv,
82
159
  verbose: parsed.verbose ?? verboseEnv,
83
160
  userAgent: `mimo2codex/${version}`,
161
+ defaultProviderId,
162
+ providers,
163
+ isTokenPlan: !!defaultRuntime.flags.isTokenPlan,
164
+ dataDir,
165
+ adminEnabled,
84
166
  };
85
167
  }
86
168
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ import { mkdirSync } from "node:fs";
4
+ const DEFAULT_DIR_NAME = ".mimo2codex";
5
+ // Resolve the data directory for sqlite + future config files. Priority:
6
+ // 1. explicit cliOverride (--data-dir)
7
+ // 2. MIMO2CODEX_DATA_DIR env var
8
+ // 3. ~/.mimo2codex
9
+ export function resolveDataDir(cliOverride, env = process.env) {
10
+ const dir = cliOverride ?? env.MIMO2CODEX_DATA_DIR ?? join(homedir(), DEFAULT_DIR_NAME);
11
+ mkdirSync(dir, { recursive: true });
12
+ return dir;
13
+ }
14
+ //# sourceMappingURL=dataDir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataDir.js","sourceRoot":"","sources":["../../src/db/dataDir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAEvC,yEAAyE;AACzE,yCAAyC;AACzC,mCAAmC;AACnC,qBAAqB;AACrB,MAAM,UAAU,cAAc,CAC5B,WAA+B,EAC/B,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,GAAG,GAAG,WAAW,IAAI,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACxF,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC"}