# Tag Log

<p>
  <a href="./tag-log.md"><strong>English</strong></a> ·
  <a href="./tag-log.zh.md">简体中文</a>
</p>

Release history of mimo2codex, newest first.

**Category tags**

- **[new]** / **[feat]**: new features
- **[fix]**: bug fixes
- **[opt]** / **[refactor]**: optimization / refactor
- **[doc]**: documentation
- **[test]**: tests

---

## (v0.4.10 — 2026-05-24)

- **[fix]** **Codex Desktop namespace tools reporting `unsupported call` ([PR #34](https://github.com/7as0nch/mimo2codex/pull/34), [issue #33](https://github.com/7as0nch/mimo2codex/issues/33), thanks @meesii)**: Codex Desktop's namespace-wrapped tools (e.g. `spawn_agent` under `multi_agent_v1`) failed with `unsupported call` when routed through mimo2codex — the client uses the `namespace` field on each `function_call` output item to dispatch to the correct local handler, and the proxy was dropping it during translation. The fix builds a `toolName → namespaceName` map from the request's `tools` array and re-attaches `namespace` on both non-streaming (`respToResponses`) and streaming (`streamToSse`) outputs. Requests without namespace tools (MiMo / DeepSeek / plain Codex CLI) stay byte-identical.

---

## (v0.4.8 — 2026-05-23)

- **[new]** **Desktop preview (beta) — Windows tray / macOS menu-bar app**: optional Electron companion that runs mimo2codex in the background — no terminal window required. First launch shows a small settings window to pick a provider + paste an API key; after that the tray / menu-bar icon opens the embedded admin UI (either in a window or in your default browser). The sidecar lifecycle (start / stop / restart on settings change) is fully managed; menu **Quit** stops it cleanly. Includes an opt-in "Start on system boot" toggle. The CLI install (`npm install -g mimo2codex`) is unchanged and can coexist on the same machine — the desktop build ships as a separate `v*-desktop` artifact. This is a **beta** — installer, launch, sidecar, and auto-update flows still need real-world miles, so please report friction. Downloads + install guide: <https://mimodoc.chengj.online/download>.
- **[fix]** **CodeX Desktop string-input misidentified as probe ([PR #31](https://github.com/7as0nch/mimo2codex/pull/31), thanks @85339098-afk)**: the OpenAI Responses API allows `input` to be either a string or an array of items; the probe-shape detector in `handleResponses` only matched the array form, so requests like `{model, input: "write hello world"}` (CodeX Desktop's natural shape) were short-circuited to a synthetic 200 with empty `output: []` — looked like the model said nothing, with **no error signal**. The check now also recognizes non-empty string `input`. Logic extracted into an exported `isResponsesProbe()` helper with a focused unit-test suite (`test/server.probe.test.ts`) so this rule can't silently regress.

---

## (v0.4.6 — 2026-05-23)

- **[fix]** **DeepSeek V4 400 `Invalid assistant message: content or tool_calls must be set` ([issue #29](https://github.com/7as0nch/mimo2codex/issues/29))**: when an assistant turn was assembled from a reasoning item + function_call without any visible text part (Codex Chrome plugin pattern), the wire shape became `{role:"assistant", content: null, tool_calls:[…], reasoning_content:"…"}`. DeepSeek's strict validator treats explicit `null` as "neither field present" and rejects. The OpenAI Chat Completions spec says `content` is optional when `tool_calls` is set, so we now OMIT the field instead of setting it to null. Reasoning-only fallback turns (rare: no text, no tools) get `content: ""` to satisfy the spec.
- **[fix]** **Windows / pnpm-global / Node 22 startup crash ([issue #30](https://github.com/7as0nch/mimo2codex/issues/30))**: `mimo2codex` no longer exits when the admin sqlite database can't be opened at startup. Typical cause: pnpm's global install layout didn't fetch a prebuilt `better-sqlite3` binary for the user's Node ABI (`node-v127-win32-x64`), so `new Database()` throws `Could not locate the bindings file`. The proxy now logs a clear, multi-line warning (with the underlying error and a Windows/pnpm-specific hint) and starts with admin DISABLED. Core Codex ↔ Chat-Completions translation never needed the DB and now works out-of-the-box on the install setups that hit this binding gap.

---

## v0.4.5 — 2026-05-22

- **[new]** **Proxy support**: mimo2codex's outbound calls honor `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` env vars — same behavior as `curl` / `git`. Declare them in `docker-compose.yml`'s `environment:` for Docker, or `export` from your shell / `.env` for local runs. The startup banner gains a `proxy:` line that echoes the active proxy so env-detection is verifiable at a glance. `MIMO2CODEX_NO_PROXY_FROM_ENV=1` opts out (for users whose shell keeps `HTTPS_PROXY` set for `curl`/`git` but don't want mimo2codex to follow).
- **[opt]** Upstream connect-failure logs carry the underlying cause's `code` and `message` (e.g. `ECONNREFUSED` / `ENOTFOUND` / `ETIMEDOUT`); the same detail flows into the 502 `UpstreamError.message`, making proxy-port typos, DNS failures, and timeouts distinguishable at a glance.
- **[doc]** Proxy FAQ §1 rewritten to spell out "system proxy ≠ process proxy" — Clash / Surge's "system proxy" toggle doesn't auto-export env vars. New 🩺 self-check callout turns the banner's `proxy:` line into a one-glance diagnostic. §5 gains an `ECONNREFUSED <proxy-host>:<proxy-port>` row (including the Docker `127.0.0.1` gotcha).

---

## v0.4.4 — 2026-05-21

- **[new]** **AI documentation assistant on the official docs site ([mimodoc.chengj.online](https://mimodoc.chengj.online/))**: click the bottom-right robot float — drop any common configuration question (first-time setup, why-502, generic-provider wiring, etc.) and the assistant runs a tool-calling agent loop over the project's `doc/*.md` corpus, returning a streamed markdown answer. The reasoning trace is shown in a collapsible "thinking" panel above the answer (auto-collapses once the answer starts). MiMo V2.5 multimodal is wired in — paste / drag / click the paperclip to upload a config screenshot and the AI looks at it before answering. Chat history lives in localStorage per anonymous browser id; clear-conversation button in the drawer header. 

---

## v0.4.2 — 2026-05-21

- **[new]** **Migrate the data directory from the admin UI**: top-right ⚙️ Settings → Local data directory → Migrate. Pick a target path, preview file count + total size, then a live progress bar copies SQLite + `.env` + `providers.json`. The server enters maintenance mode (503) while copying; the original directory is preserved so users can verify the new location before deleting. Auto-rollback on failure (partially-written destination is wiped + the old location is reopened). A persistent banner reminds the user to restart so the new directory takes effect; the resolver priority becomes CLI > env > pointer file (`~/.mimo2codex-pointer.json`) > default `~/.mimo2codex/`.
- **[doc]** **Official docs site goes live at [mimodoc.chengj.online](https://mimodoc.chengj.online/)**: single home for docs and tutorials. The admin footer now points at it directly with a tooltip nudge for stuck users.
- **[fix]** **Hide server-only Codex entries in local mode**: the "Export to local" / "Import from local" buttons and the `History` tab on the Codex 接入 page only make sense in Docker auth deployments (`authMode=on`), where operators ship rendered `auth.json` + `config.toml` bundles between machines. Local single-user runs already write those files directly to `~/.codex/`, so the buttons were noise. Now gated on `authMode === "on"`.

---

## (v0.3.0 — coming)

- **[new]** **Docker auth deployment goes GA**: after v0.2.17 served as the preview, the **Docker auth mode** is now a stable feature — user registration / login, per-user m2c proxy API keys, BYOK (bring-your-own upstream key), Gitee / GitHub OAuth, downloadable Codex client config bundles. Put mimo2codex behind Docker / an internal network / a small private circle without leaking the upstream key. Local single-user runs (`authMode` defaults to `off`) are unaffected. Full guide: [doc/auth-deployment.md](./auth-deployment.md) — covers Docker compose, first-run bootstrap, OAuth setup, and troubleshooting.
- **[fix]** **Tool list dedup defense ([issue #20](https://github.com/7as0nch/mimo2codex/issues/20))**: newer Codex CLI / Desktop / DeX builds emit duplicate tool names (typical shape: a top-level `_fetch` function plus a `namespace`-wrapped `_fetch` that flattens to a second copy), causing MiMo to 400 with `"tools contains duplicate names: _fetch"`. reqToChat now dedupes by `function.name` / builtin `type` keep-first after the merge step; duplicates are logged at `WARN` so users can spot the client-side bug.
- **[new]** **Mixed-mode thinking history defense**: when conversation history contains assistant messages without `reasoning_content` (typical scenario: user toggled the thinking switch mid-session), automatically backfill those messages with the placeholder `"(this turn ran without thinking mode)"`. **Thinking stays ON** — avoids upstream MiMo / DeepSeek 400 `"reasoning_content must be passed back"`. Logs a paired INFO line.
- **[opt]** Quieter console log: `WARN client model rewritten on the way upstream` → `INFO model fallback applied — client sent unknown model id, request continues with provider default`. Demoted to INFO + rephrased; it was always a graceful fallback (request succeeds), not an error.
- **[doc]** New bilingual [Proxy / Network FAQ](./proxy-faq.md): mac & win proxy setup, error-code lookup (502 / ECONNREFUSED / DNS / TLS-MITM, etc.), origin of the `gpt-5.4` placeholder, mixed-mode thinking history explainer.
- **[doc]** New bilingual [Tag Log](./tag-log.md): migrated out of the README's `<details>` changelog block; sorted newest-first with `[new]/[fix]/[opt]/[doc]` categorization across all 44 historical tags.

---

## v0.2.17 — 2026-05-19

- **[new]** **Docker auth mode (preview)**: users can register, log in, and generate their own m2c (mimo2codex proxy) API key. For Docker / intranet / small private deployments, replace `OPENAI_API_KEY`'s `mimo2codex-local` placeholder with the generated m2c key — protects the upstream key from being abused. Single-user local runs (`authMode` defaults to `off`) are unaffected.

> ⚠️ **v0.2.17 is a preview release** — the first cut of the Docker auth deployment. **v0.3.0 is the GA**. For production use, please run v0.3.0+. See [Auth & deployment](./auth-deployment.md).

## v0.2.16 — 2026-05-19

- **[opt]** Admin UI tightening: denser layout, dropped redundant displays, reduced visual noise.

## v0.2.15 — 2026-05-18

> Includes betas `v0.2.15-beta.0/1/2` (SenseNova model adaptation + thinking fine-tuning + Kimi adaptation).

- **[new]** **Thinking mode admin UI**: the "Codex Enable" page gains a global **Thinking** card.
  - **Thinking ON/OFF**: persists into the settings DB; no more `--disable-thinking` restart. Takes effect immediately on the next request. OFF makes every provider skip thinking (`thinking:{type:"disabled"}` for mimo / deepseek, `reasoning_effort:"none"` for sensenova / other generic).
  - **Force high reasoning effort**: when Codex didn't pass `reasoning.effort`, mimo2codex fills in `reasoning_effort:"high"`. Disabled by default with a visible side-effect warning (billing can spike). CLI `--disable-thinking` still wins.
- **[new]** **Kimi (Moonshot) preset**: typing `https://api.moonshot.cn/v1` (or `moonshot.ai`) as baseUrl is auto-recognized and applies `dropReasoningEffort: true`, so Kimi (which uses `thinking:{enabled/disabled}` instead of `reasoning_effort`) doesn't 400 on the unknown field. Models: `kimi-k2.6` / `kimi-k2.5` / `kimi-k2-thinking` / `kimi-k2-thinking-turbo` / `moonshot-v1-{8k,32k,128k}`. See [doc/kimi.md](./kimi.md).
- **[new]** **Docker deployment**: new `Dockerfile` (multi-stage alpine, ~70MB), `.dockerignore`, GitHub Actions workflow that auto-builds **multi-arch `linux/amd64 / linux/arm64` images and pushes to ghcr.io/7as0nch/mimo2codex**; bundled `docker-compose.yml` for one-command launch with **the data dir bind-mounted to local `./.mimo2codex/`** (sqlite + providers.json + admin UI config persist across container rebuilds); env supports both `.env` mount and `-e` / `environment:` injection. macOS / Windows / Linux. Based on [#15](https://github.com/7as0nch/mimo2codex/pull/15) (thanks @hufang360).
- **[new]** SenseNova model adaptation (from betas).

## v0.2.14 — 2026-05-15

- **[fix]** Added inline comments to `.env.example` so first-time users don't miss what each field means.

## v0.2.13 / v0.2.12 / v0.2.11 / v0.2.10 — 2026-05-15

- **[new]** Version-update check (queries the upstream npm registry for newer releases). Iterated through four patches to refine network tolerance, caching, and message phrasing.

## v0.2.9 — 2026-05-15

- **[new]** Universal `.env` config: `mimo2codex init` then fill in keys — same config across platforms.

## v0.2.8 — 2026-05-15

> MiniMax / strict OpenAI-compatible upstream support patchset (PR #12).

- **[fix]** `reqToChat`: no longer sends `strict: null` upstream (MiMo's Pydantic schema rejects null and 400s with `"Input should be a valid boolean"`). Fixes [issue #11](https://github.com/7as0nch/mimo2codex/issues/11).
- **[fix]** `minimax-compat`: one-click preset no longer strips `stream_options` / `parallel_tool_calls` by default.
- **[feat]** `minimax-compat`: inline `<think>...</think>` on the response side is split into `reasoning_content`.
- **[feat]** Admin webui providers form: new "Strict OpenAI compat" switch group (covers minimaxCompat etc.).
- **[feat]** Generic provider gains the MiniMax-compat patch ([issue #7](https://github.com/7as0nch/mimo2codex/issues/7)).

## v0.2.7 — 2026-05-15

- **[new]** Full admin webui rewrite on **Ant Design 5**: dark/light themes, EN/中文 i18n, viewport-locked sider + footer, smoothed Token-usage curves.
- **[new]** `.env.example` + **Bash / PowerShell one-liner key-loader scripts** (`.env` is gitignored).
- **[new]** Per-model **⚡Probe** button on "Codex Enable": fires a minimal ping to validate key / baseUrl / model id end-to-end.
- **[new]** Token-usage chart folds in **cache-hit bars** (green = hits, gray ghost = prompt totals) plus a window-wide hit-rate summary.
- **[new]** Customizable Codex dir via settings or the `CODEX_HOME` env var.

> Includes betas `v0.2.6-beta.1/2/3`: MiMo models' `contextWindow` 128K → 1M (matching DeepSeek; fixes Codex 256K-config 400); webui refactor PR #1~#6 (antd 5 base, Setup/Models/CodexEnable theming, Logs table, Dashboard cache-hit overlay, viewport lockdown, etc.).

## v0.2.6 — 2026-05-14

- **[new]** **"Codex Enable" page** (**replaces cc-switch**): admin webui writes `~/.codex/auth.json` + `config.toml` in one click.
- **[new]** **Runtime override**: swap upstream models without restarting Codex.
- **[new]** Permanent backup retention + half-broken pair recovery + manual deletion: originals are auto-backed-up, and **the first backup capturing your real external auth.json is permanently preserved** — switch models 100 times and you can still restore the original Codex config.
- **[fix]** `removeOrphanToolMessages`: drops orphan tool messages on DeepSeek V4 session desync, preventing 400 `"Messages with role 'tool' must be a response to..."` ([PR #10](https://github.com/7as0nch/mimo2codex/pull/10) / [issue #8](https://github.com/7as0nch/mimo2codex/issues/8)).
- See [doc/codex-enable.md](./codex-enable.md).

## v0.2.5 — 2026-05-14

> Includes beta `v0.2.5-beta.1`.

- **[feat]** MiMo / DeepSeek docs aligned.
- **[fix]** DeepSeek `tool_calls` 400 fix.
- **[feat]** Friendly context-overflow error: surfaces a readable `/compact` hint instead of a raw 400.
- **[feat]** Beta release workflow (`npm run release:beta`).

## v0.2.4 — 2026-05-13

- **[test]** Added two-stage priority regression tests for `selectProvider`.
- **[doc]** Generic-provider routing-priority docs updated to match.

## v0.2.3 — 2026-05-13

- **[fix]** Fixed MiMo `reasoning_content` round-trip per Xiaomi's [official guidance](https://platform.xiaomimimo.com/docs/zh-CN/usage-guide/passing-back-reasoning_content).

## v0.2.2 — 2026-05-13

- **[fix]** GitHub Actions workflow fix.

## v0.2.1 — 2026-05-12

- **[new]** Added `mimoskill` — Python helpers for image generation, OCR, etc. (stdlib only, no pip).

## v0.1.16 ~ v0.1.19 — 2026-05-12

- **[new]** Early `mimoskill` iteration (v0.1.17 ~ v0.1.19): image gen / OCR / pet generation, polished step by step.
- **[new]** v0.1.16: support for additional models with `wireApi="responses"` direct passthrough (in addition to the default mimo / deepseek chat-translation path).

## v0.1.15 — 2026-05-12

- **[fix]** Registered `mimo-v2.5` vision model in the builtin catalog so it no longer silently falls back to `mimo-v2.5-pro` (which would drop images).

## v0.1.1 ~ v0.1.14 — 2026-05-09 ~ 2026-05-10

Early-project iteration (v0.1.1 was the first public release on 2026-05-09). No detailed changelog kept for this phase; main work:

- mimo / deepseek dual-provider scaffolding.
- Responses API ↔ Chat Completions bidirectional translation core (`reqToChat` / `respToResponses` / `streamToSse`).
- First-cut admin webui (Tokens / Logs / Settings pages).
- SQLite persistence (chat logs, model catalog, runtime settings).
- CLI: `mimo2codex init` / `update` / `print-config` / `print-cc-switch`.

Browse the full commit stream with `git log v0.1.1..v0.1.14 --oneline`.

---

## Release commands

Defined in [package.json](../package.json):

```bash
npm run release:patch    # x.y.Z+1
npm run release:minor    # x.Y+1.0
npm run release:major    # X+1.0.0
npm run release:beta     # pre-release
```

Full runbook: [PUBLISHING.md](../PUBLISHING.md) (repo root).
