Skip to content

feat(acp): add native MiniMax Code support via ACP - #1028

Merged
xintaofei merged 13 commits into
spacering-net:mainfrom
xy3xy3:feat/minimax-code-acp
Oct 27, 2026
Merged

xintaofei merged 13 commits into
spacering-net:mainfrom
xy3xy3:feat/minimax-code-acp

Conversation

@xy3xy3

@xy3xy3 xy3xy3 commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Related to #1026.

  • Add built-in MiniMax Code, launching the installed mcode acp; detect official POSIX and Windows launcher paths.
  • Reuse native login/provider configuration. Add agent identity, localized setup, selection, mentions and MCP assignment UI.
  • Reuse ACP streaming, permissions, opaque model options, Codeg-owned transcripts/reconnect and multi-agent delegation.
  • Store MCP assignments in Codeg-owned mcp/minimax_code.json and forward stdio/HTTP/SSE overlays without modifying native credentials/config.
  • Add regression tests and cross-platform setup documentation.

Validation

  • Frontend: 714 files / 10,566 tests passed; ESLint, TypeScript, production static export and browser-agent checks passed.
  • Rust server-mode cargo check and clippy (-D warnings) passed.
  • Official @minimax-ai/code 0.6.13: isolated unauthenticated ACP initialize smoke passed, with no credentials or model calls. Advertises session loading, image support and HTTP/SSE MCP.
  • Rust unit tests could not execute: compiling the lib-test binary exceeded local memory (SIGKILL), including a serial non-incremental retry. Cross-platform CI and authenticated prompt/tool/image workflows remain unverified.

Scope

Historical native CLI session import and Codeg-managed skill installation are deferred. Existing custom registrations and native skills/configuration remain separate and untouched. No dependency or lockfile changes.

Cross-platform CI passed: all 13 jobs succeeded.

@xy3xy3 xy3xy3 changed the title feat: add native MiniMax Code support via ACP feat(acp): add native MiniMax Code support via ACP Oct 27, 2026
xy3xy3 and others added 9 commits October 27, 2026 10:13
MiniMax Code asks for permission under its own perm_<hex> id, never the
call_<n> id of the tool call it gates. Codeg then filed the approval under
an id no transcript row carries, so the approval chip never showed in
history, and the live view grew a second, never-settling row for the call.

Rewrite the card's toolCallId to the single unsettled call whose input
matches the request's rawInput. The request can overtake the call's
in_progress update, which the turn loop applies on its own task, so wait
up to 250 ms for that call before keeping the agent's id.
The ACP registry publishes MiniMax Code as minimax-code, while the built-in
uses codeg-minimax-code. Without an alias the add-agent picker offered the
registry entry as a second, redundant MiniMax Code next to the built-in.
The test read mcp_json_path() outside temp_env's lock, so a parallel test
changing CODEG_HOME or CODEG_DATA_DIR could make the two reads disagree.
Note the installer-directory fallback, the 0.7.0 prompt capabilities, the
offline end-to-end run through codeg-server, and that mcode sends codeg no
fs/* or terminal/* requests.
Every other built-in agent in the ten READMEs shows its icon; the MiniMax
Code entry was text only. The SVG mirrors the in-app MiniMaxCodeColorIcon.
The PR keeps generic provider fields off MiniMax Code's launch env, but the
bind path still ran parse_provider_model, whose fallback maps the provider's
model to OPENAI_MODEL and saves it in the agent's explicit env, which the
launch passes through. The UI offers no provider for MiniMax Code, yet the
API accepts one for any agent type. Refuse the bind like a cross-type one.
A unique in-progress call with the same input could be stale: an earlier
call that was already asked about and answered, whose completion is still
queued behind the newer call's announcement. The card and its approval then
landed on the older call.

An agent asks about a call once, so exclude calls with an unanswered card
or a recorded approval. Both are read under the permission queue lock,
which resolve_permission also holds while it retires a card and records the
approval, so a call is never in neither.
Deriving already-asked-about calls from the permission queue and the
approval log left gaps: a card withdrawn, drained or answered with an
option it did not offer records no approval, and the 256-entry approval
cap can evict a still-running call. Either let a later request with the
same input match the stale call again.

Record each match in SessionState::permission_matched_calls instead, under
the same write lock as the lookup, and clear it with active_tool_calls.
@xintaofei

Copy link
Copy Markdown
Collaborator

codeg work task 430 is done — #1028 (18 files, +488/-23).

@xintaofei
xintaofei merged commit d07f215 into spacering-net:main Oct 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants