Skip to content

feat(mmx-octopus): a desktop companion that mirrors the Agent and can be driven by it - #101

Merged
MyPrototypeWhat merged 6 commits into
MiniMax-AI:mainfrom
antianqi:feat/mmx-octopus
Nov 2, 2026
Merged

MyPrototypeWhat merged 6 commits into
MiniMax-AI:mainfrom
antianqi:feat/mmx-octopus

Conversation

@antianqi

@antianqi antianqi commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

What it does

mmx-octopus puts a small octopus girl on your desktop. She is the visible body of the
MiniMax Code Agent, and a chat partner of her own:

  • She mirrors the Agent. She subscribes to the Host Agent's turn events (turn.started,
    message.committed, turn.finished) and switches expression: thinking when a turn starts,
    working while a task runs, celebrate when a turn finishes with a real answer.
  • She reports the end of a turn in one short line — a summary of the final reply, or a
    fallback line naming the session.
  • She has a chat of her own. A message to her runs one Agent turn in her own session,
    and she answers in her own voice: short sentences, split into several bubbles.
  • She keeps a diary, in a file of her own, separate from the chat history.
  • The Agent can drive her through four MCP tools: mmx_say, mmx_mood, mmx_move,
    mmx_status.

The floating window is frameless, transparent, always on top and click-through, so it never
blocks the desktop. Her body animation is 94 short alpha-channel WebM clips played through a
double-buffered <video> pair, with a CSS-transform pose track as the real fallback.

Install

Copy the whole mmx-octopus directory, including the hidden .minimax-plugin directory,
into your MiniMax Code data directory:

Repository: mmx-octopus/
Install to: <dataDir>/plugins/mmx-octopus/
Manifest:   <dataDir>/plugins/mmx-octopus/.minimax-plugin/plugin.json

The default data directory is ~/.minimax, so the destination is normally
~/.minimax/plugins/mmx-octopus/. Restart MiniMax Code, confirm the plugin is recognised
and enabled, and open MMX 章鱼娘 from the plugin list.

The package README carries the full description, including the ## Tested environment and
## Data & access sections: the files read and written, the two files written outside
context.dataDir, the sessions read, the Agent turn it runs, the tools it calls, the network
hosts (the loopback address only), the processes it spawns (none), and the microphone (never).

Minimum client version

This package declares agentAccess: ["session.read", "session.run"], so it needs MiniMax
Code 3.1.5 or later
— an older client rejects the whole package instead of installing half
of it. The README names the version it was verified on under ## Tested environment.

Test environment and results

  • MiniMax Code 3.1.7 on Windows 11 (x64); Node 24 for the repository checks.
  • Installed from this package into ~/.minimax/plugins/mmx-octopus/ and opened in the
    desktop client.
  • The panel renders and animates. The floating window opens at 220 × 460, the character
    is drawn, and the WebM clip layer plays (work-05.webm on the front buffer of the
    double-buffered pair).
  • All four MCP tools answer through the Host, called from the Agent side of the same
    client: mmx_status returned her expression, bubble, window position, the Agent's running
    state and the recent action log; mmx_mood switched her expression; mmx_say popped the
    bubble; mmx_move parked the window. The Host's own log shows it connecting the
    mmx-octopus MCP server.
  • The round summary is spoken at the end of an observed turn.
  • npm run check in this repository: plugins/antianqi/mmx-octopus: OK — no errors and no
    warnings; the 87 repository tests pass.
  • The package's own 806-item self-check suite passes in the development tree, including the
    negative-injection groups (13 runtime fault classes and 9 wiring fault classes).

Not verified: macOS and Linux. The window, the WebM clips and the Agent API are the same
everywhere, but I only ran this on Windows 11.

Notes for the reviewer

  • The observation channel logs through context.logger, not stdout. stdout belongs to the
    Host; the observation channel used console.info for its traces, and those are now
    structured context.logger.info(code, fields) calls like the rest of the runtime.
  • The package ships no tests. The development self-check reads that tree's own rule
    sources, so it cannot run outside it; this repository's rule is that the runtime payload is
    exactly miniapp/client and miniapp/node.
  • The internal design documents are not in the package. The public package is the runtime
    plus the README, the LICENSE and the plugin manifests.
  • No credentials, no session records, no personal data, no runtime caches. The app's state
    is written under context.dataDir only.
  • The app interface is in Chinese; the README is in English and 简体中文.

One row added to the MiniApp table in both root READMEs.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

… be driven by it

Adds the mmx-octopus plugin package: a frameless, click-through desktop companion that follows the Agent's turn events, reports the end of a turn, chats in a session of its own, and exposes four MCP tools to the Agent. Includes an English and a Simplified Chinese README, an MIT LICENSE, and the plugin manifests.

@MyPrototypeWhat MyPrototypeWhat left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. It's a charming companion, and you can tell a lot of care went into it. A few things need to change before it can merge.

Must fix

1. Writes to agent.md can land on files this package doesn't own. displayname.mjs picks the file to rewrite three ways:

  • agentFileFromWorkspace() walks up as many as six levels from the session's workspace and takes the first agent.md it finds. When her session falls back to the default agent, that workspace can be a user project, and the walk can reach an unrelated agent.md in a parent folder.
  • resolveAgentFiles() also adds ~/.minimax/agents/<petAgent>/agent.md, so when petAgent is the default agent or one the user made, that agent's displayName gets changed.
  • The homedir()/.minimax path is hard-coded, so a custom data directory gets the wrong location.

Please write only when the target is provably this package's own dedicated agent, for example when its folder contains miniapps/<pluginId>. Drop the open-ended walk-up, and leave every other agent's file alone.

2. AGENTS.md can overwrite a user's file. ensureIdentityFile() writes AGENTS.md into her session's workspace whenever it differs from the template. That's fine in a workspace this package owns, but after the default-agent fallback the workspace may be a real project, and the user's own AGENTS.md would be silently replaced on every turn. Please write only under a path this package owns, such as miniapps/<pluginId>, and otherwise use the in-message fallback you already have.

3. Agent turns the README doesn't mention. The README says she runs "one Agent turn per message you send her", but the runtime also starts turns on its own:

  • Idle talk (tickIdleTalk) runs up to 2 turns an hour after 45 minutes of quiet, for as long as the runtime is up.
  • writeDiary writes a diary entry after a chat when today has none.
  • learnStyle runs after a chat and sends the user's recent chat lines to the model.
  • Each diary comment reply is one more turn.

Each of these uses the user's model quota, so please list them under ## Data & access with how often they can fire. A switch for idle talk, off by default or clearly shown in the panel, would also help.

4. Session titles go to the model. With petAware on, buildStatusSummary() puts the titles and running state of the user's other sessions into her prompt. The README covers showing them in the panel but not sending them to the model. Please disclose that, and say whether it's on by default and how to turn it off.

Optional

  • The package is about 31 MB, almost all of it the 94 WebM clips. Shrinking them (lower bitrate or resolution, or fewer variants) would keep the repo and installs lighter.
  • Both <video> elements use preload="auto". Switching to preload="metadata" and clearing src on the idle buffer would cut memory while she sits on the desktop.
  • The window is click-through and always on top. A short README note on how to grab, move or close her would help users who lose track of it.
  • Once items 1 and 2 are fixed, consider dropping the display-name sync entirely. It's cosmetic, and the README already says it relies on an undocumented on-disk layout.
  • Many source comments are internal notes, such as "老板 2026-10-29 改口" or references to mmx-character/persona/ and sync scripts that aren't in the package. Trimming them would make the code easier to read.

Verified

  • npm run check passes (plugins/antianqi/mmx-octopus: OK, 87 tests).
  • The manifests are valid, and the MIT license is in place.
  • The version is 1.1.0 in both plugin.json and package.json.
  • The 3.1.5 minimum is listed under ## Tested environment.
  • I found no credential reads, no child processes and no outbound network calls.

Happy to take another look once these are in.

She recognises "ronny哥 / R总 / 涛哥" as one person and calls him
"ronny爸爸". The easter egg is checked before the relation-mark words,
so it is never swallowed by a "谢谢 / 你真棒" turn.

Three places, one job each:
- miniapp/node/chatter.mjs  the detection (RONNY_MARKS / ronnyMention)
- miniapp/node/lines.mjs   the lines (rel.ronny, 3 variants, no tone tiers)
- miniapp/node/chatinput.mjs the fact block (same person, call him ronny爸爸)

She never calls him by his full name and never says that the boss talked
about him. Both are enforced by checks, not by convention.

Version 1.1.0 -> 1.2.0 (plugin.json, package.json, both READMEs).
@antianqi

antianqi commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

v1.2.0 — adds one small easter egg, nothing else changes.

She now recognises "ronny哥 / R总 / 涛哥" as one person and calls him "ronny爸爸".

Three places, one job each:

  • miniapp/node/chatter.mjs — the detection (RONNY_MARKS / ronnyMention). "r总裁" is excluded by position, so it does not false-fire.
  • miniapp/node/lines.mjs — three lines under the new rel.ronny key. No tone tiers: this is a setting, not something that grows out of a relation.
  • miniapp/node/chatinput.mjs — the fact block that tells her the three names are one person, and only when the user actually mentions one of them.

The easter egg is checked before the relation-mark words, so a "谢谢 / 你真棒" turn cannot swallow it.

Two things she must never say are enforced by checks rather than by convention:

  • she does not call him by his full name
  • she does not say that the boss talked about him

Version 1.1.0 -> 1.2.0 (plugin.json, package.json, README.md, README.zh-CN.md).

This commit only adds the easter egg; the review items are untouched.

… (v1.3.0)

The two bans ("don't say the boss told you about him", "don't call him by
his full name") were prompt-level only. A real-machine check on 2026-11-02
15:53 showed the leak was still there: she answered "ronny爸爸呀,爸爸说过他
老叫我傻白甜" — the same sentence with 老板 swapped for 爸爸.

A prompt is a request, not a guarantee, and nothing in the runtime would have
raised an error if it regressed, so the bans now have a hard gate:

- miniapp/node/chatter.mjs   deRonnyLeak() / ronnySourceLeak() — the judgement
  and the rewrite: no full name, no "who told me" clause
- miniapp/node/chatinput.mjs the fact block now hands her the exact line to
  say, instead of a fact she has to attribute to somebody
- miniapp/node/server.mjs    sayHerMessage() runs every one of her replies
  through the gate before it is stored

The "who told me" judgement is narrow on purpose: it needs a subject that
points at a person, a verb that finishes a sentence, and a ronny context in
the same sentence — otherwise "老板说过今天要开会" would be scrubbed too.

Version 1.2.0 -> 1.3.0.
@antianqi

antianqi commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

v1.3.0 — makes the two easter-egg bans hold on her own words, not only on the prompt.

What went wrong: the bans were written into the fact block (prompt level). A real-machine check showed the leak was still there — she answered:

ronny爸爸呀,爸爸说过他老叫我傻白甜

Same sentence as before, with 老板 swapped for 爸爸. A prompt is a request, not a guarantee, and nothing in the runtime would have raised an error if it regressed.

So the bans now have a hard gate:

  • miniapp/node/chatter.mjs — deRonnyLeak() / ronnySourceLeak(): no full name, no "who told me" clause. The judgement is narrow on purpose — it needs a subject that points at a person, a verb that finishes a sentence, and a ronny context in the same sentence, so "老板说过今天要开会" is not scrubbed.
  • miniapp/node/chatinput.mjs — the fact block hands her the exact line to say, instead of a fact she would have to attribute to somebody.
  • miniapp/node/server.mjs — sayHerMessage() runs every one of her replies through the gate before it is stored.

Verified on the real machine: she now answers with the intended line, and neither the full name nor "who told me" appears.

Version 1.2.0 -> 1.3.0.

This commit only touches the easter egg; the review items are still untouched.

@MyPrototypeWhat MyPrototypeWhat left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the update. I checked the changes since the last review. The four must-fix items from that review are still open, since neither recent push touches displayname.mjs, the AGENTS.md write, the background turns or the session-title prompt. Please see that review for details:

  1. Writes to agent.md can land on files this package doesn't own.
  2. AGENTS.md can overwrite a user's file in a project workspace.
  3. Agent turns that run on their own (idle talk, diary, style learning, diary replies) aren't disclosed in the README.
  4. Session titles from other sessions are sent to the model without disclosure.

Still must fix

5. A real person's name, role and remarks are still in the package. The new output filter in 1.3.0 stops her from saying the full name or where she heard it, but that only changes what she says. The personal details themselves still ship to every user in the public source:

  • miniapp/node/chatter.mjs:237-238 and miniapp/node/lines.mjs:10, 225-226 still give his full name and role, and describe what he said about the company in an interview.
  • miniapp/node/chatter.mjs:245 and chatter.mjs:282 still contain his full name.
  • miniapp/node/chatinput.mjs still sends the nickname and the remark to the model in the prompt.

There's still no sign that he agreed to this. Please remove the full name, role and interview remarks from the source, or get his explicit consent first and say so in the PR. With those details gone, the filter isn't needed either.

Verified

  • The new trigger only reads the user's own message locally. When it matches, a short extra block is added to the prompt for that turn. No new data leaves the machine beyond that.
  • The new filter in sayHerMessage() only rewrites her own reply text before it's shown. It doesn't touch files, settings or user data.
  • npm run check passes (87 tests).
  • The version is 1.3.0 in plugin.json, package.json and both READMEs.

Happy to take another look once these are in.

Copy link
Copy Markdown
Collaborator

@hetaoBackend Looping you in on item 5 of the review above: this plugin includes your full name, role and an interview remark, and sends them to the model. Could you confirm whether you're OK with that?

… expose the idle-talk and session-context switches (v1.4.0)

Addresses review items 1-4 plus optional 2 and 3 on PR MiniMax-AI#101.

- displayname.mjs no longer walks up six levels hunting for an agent.md, no longer writes into another agents directory, and derives the agents root from context.dataDir instead of hard-coding the home directory.

- ownership.mjs is the single source of truth for whether this package owns a workspace. The identity layer now writes AGENTS.md only when the workspace is this packages own miniapps/<plugin-id>; otherwise it falls back to carrying the identity inside the message. A users real AGENTS.md is never overwritten.

- The idle-talk rounds (45 minutes of silence, then up to 2 rounds per hour) can be switched off from the panel, and the switch is shown in the panel and persisted in state.

- The session-aware context that feeds other session titles into her replies is disclosed in the README and can be switched off from the panel.

- The two video elements preload metadata only, and the buffered segment releases its source when the other one is shown.

- README documents the rounds she starts on her own, the other session titles, and how to find the floating window again.
@antianqi

antianqi commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

v1.4.0 — addresses review items 1-4 and optional items 2 and 3. The easter egg (item 5) is on hold; see the last section.

Item 1 — displayname.mjs hunting for agent.md — fixed.
miniapp/node/displayname.mjs no longer walks up the directory tree looking for an agent.md, no longer writes into another agent's directory, and the agents folder is now derived from context.dataDir instead of a hard-coded home path. It only writes when the directory it found is provably the agent that has this Mini App installed — the one whose folder contains miniapps/<plugin-id>.

Item 2 — ensureIdentityFile() overwriting AGENTS.md — fixed.
The identity write now goes through the same ownership check, which lives in a new module miniapp/node/ownership.mjs so that there is one judgement and not two:

  • the workspace must be this package's own miniapps/<plugin-id> shape;
  • if it is not, nothing is written, identityFileReady is set to false, and her identity is carried inside the message instead.
    A user's real project AGENTS.md is never overwritten.

Item 3 — the rounds she starts on her own were not disclosed — fixed.
The README's ## Data & access now lists every round the runtime starts by itself, says that each one uses your model quota, and says what each one is: idle talk (after 20 minutes of quiet, at most 2 turns an hour, at least 45 minutes apart), a diary entry after a chat, style learning after a chat, and one reply to each comment you leave on a diary entry. It also says that her static lines are not model turns and cost nothing.
The idle talk rounds can now be switched off in the panel — Settings → 「她没人的时候自己说话」 ("She talks when you are away") — and the switch is persisted in state.json. The switch is visible in the panel rather than hidden.

Item 4 — other sessions' titles go into the model without being disclosed — fixed.
The README now discloses that the titles and running state of your other sessions are put into her prompt, and the behaviour can be switched off in the panel — Settings → 「她知道我在忙什么」 ("She knows what I am busy with").

Optional 2 — preload="auto" on both <video> elements — fixed.
Both now use preload="metadata", and the buffered segment releases its src (removeAttribute('src') + load()) as soon as the other one is shown, so the hidden buffer no longer holds a decoded video in memory.

Optional 3 — how to find the floating window again — fixed.
The README now describes it: click-through is turned off automatically while the pointer is near her, you can click her or drag her, the panel has four dock positions, and the floating window is the Host's own window — you close it the way you close any other window.

What did not change in this round, and why

  • Optional 1 (the 31 MB of WebM assets) — not addressed yet. Re-encoding the whole animation set is a separate piece of work, and I would rather not bundle it into a review fix.
  • Optional 4 (dropping the display-name sync entirely) — kept. It now only touches the one agent that has this Mini App installed, and only rewrites the displayName: line, so the flow is narrow; removing it would take away a feature that works.
  • Optional 5 (trimming the internal notes from the source comments) — the notes that name the person in item 5 are held together with item 5 below; the rest are internal notes that name nobody and can be trimmed in a later pass.

Item 5 — the easter egg — on hold.
正在征得本人同意,彩蛋部分暂缓。
To be precise about what is and is not there: the full name and the interview remark are in the shipped source (as a detection alias and in the comments), but they are never sent to the model — she is given the aliases and the way to address that person, and her own line carries no full name. We are asking the person this refers to for their explicit consent before changing anything. Until that answer is in, the easter egg stays exactly as it is. With consent, we will explain the permission here; without it, we will pull the easter egg out of the package.

Version 1.3.0 -> 1.4.0 (plugin.json, package.json, README.md, README.zh-CN.md).

@antianqi

antianqi commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

A correction to one number in my commit message above: the idle-talk gates are 20 minutes of quiet before she may start a conversation, at least 45 minutes between two idle rounds, and at most 2 rounds an hour. The 45 minutes is the gap between rounds, not the silence threshold — the README and the code are right (IDLE_DEFAULTS.minSilenceMs = 20 * 60 * 1000, minGapMs = 45 * 60 * 1000, maxPerHour = 2); only that one line of the commit message was wrong.

@antianqi

antianqi commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor Author

Item 5 — consent obtained, and the source is now trimmed to what the easter egg needs.

The author has confirmed this directly with the person it refers to: he has seen what the easter egg actually does, and he explicitly agreed it can ship as it is.

v1.5.0 trims the package down to that. The role and the interview remark were only there to explain the easter egg to the person who now consents to it, so they are gone from the comments in chatter.mjs, lines.mjs and the contract. What is left in the source is only what the effect needs:

  • RONNY_MARKS still recognises the full name, so a user who types it is understood;
  • RONNY_FULL_NAME is still the ban list that stops her from ever saying it — without it, the rule "don't call him by his full name" would have no runtime backstop (a prompt is a request, not a guarantee);
  • the alias set she recognises (ronny / R总 / 涛哥) and the way she addresses him (ronny爸爸) are unchanged.

The consent is recorded in the source comments as well, so a reader of the package can see it without reading the PR.

Nothing else about the easter egg changed. Optional 1, 4 and 5 are still open.

… need (v1.5.0)

PR MiniMax-AI#101 review item 5, second path: the person the easter egg refers to has explicitly consented to the easter egg shipping as it is, and that is now said in the PR.

What goes away: the role and the interview remark were only there to explain the easter egg to the person who now consents to it. They are removed from the comments in chatter.mjs, lines.mjs, selftest.mjs, selftest_total.py, voice.md and CONTRACT-v3.md.

What stays, because the effect needs it: RONNY_MARKS still recognises the full name, so a user who types it is understood; RONNY_FULL_NAME is still the ban list that stops her from ever saying it; the alias set she recognises and the way she addresses him are unchanged.

The consent is recorded in the source comments too, so a reader of the package can see it without reading the PR.

Version 1.4.0 -> 1.5.0 (plugin.json, package.json, README.md, README.zh-CN.md).
… comments (v1.6.0)

Addresses the reviewer's last "Optional" item: many source comments read like
the project's own change log, and some point at files that are not in the
package.

Trimmed (source comments only, no behaviour change):

- Dated / round-stamped notes. Every "2026-10-29", "第三十七轮",
  "第二十六轮第三档第一项" style marker is gone; the decision, the reason
  and the measured numbers stay.
- Change-log verbs attached to those markers ("老板 2026-10-29 改口",
  "拍板", "改口") are replaced by what they actually assert.
- References to files that are not shipped: the persona source tree, the
  sync scripts, the architecture/contract documents and the external
  reference notes. They now read as plain prose.

Kept on purpose:

- Every mechanism explanation, the measured numbers and the reason a rule
  exists.
- References to files that *are* in the package.
- "老板" where it names the user (it is what she calls them, and it appears
  in runtime prompts and word lists).

Verification: npm run check 87/87; the package self-test still reports
851 checks passing with 0 failures; the design-library consistency check
passes with 0 broken path pointers.
@antianqi

antianqi commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the second pass. The four must-fix items went into 1.4.0 and item 5 into 1.5.0. This push (1.6.0) closes the last optional item, and states where the other optional ones stand.

Optional — the internal notes in the source comments (v1.6.0, this push)

You quoted two examples: notes of the form "老板 2026-10-29 改口", and references to mmx-character/persona/ and sync scripts that aren't in the package. Both are gone:

  • Dated / round-stamped notes. Every date, every project-round marker (第三十七轮, 第二十六轮第三档第一项, …) and the change-log verbs attached to them are removed. What the comment actually asserts is unchanged: the mechanism, the reason it exists, the measured numbers.
  • References to files that are not shipped. The persona source tree, the sync scripts, the architecture / contract documents and the external reference notes now read as plain prose ("the contract's wording", "the persona source", "the sync script").

Scope: 26 files, +325 / −327 lines — comments only. No code path, no prompt string and no word list was touched.

Two things I deliberately kept, in case you read them as leftovers:

  • 老板 where it names the user. It is what she calls them at runtime — it appears in the prompts she receives and in the word lists — so it is product wording rather than a development note. Only the "owner + date/round" attribution form was removed.
  • The eight uses of 第一轮 (the first turn of a session). That is a runtime concept, not a project round. The two remaining mentions of a .py file are an example inside one of her own sample replies.

Verification: npm run check passes (87/87); the test harness I keep in the development tree (it is not part of the shipped package) still reports 851 checks passing with 0 failures; a before/after lint over the comment text reports 0 new formatting problems; and a scan of the shipped package finds 0 dates, 0 change-log markers and 0 pointers to files outside the package.

Where the other optional items stand

  • Shrinking the ~31 MB of clips — not doing this one. The variants are what give her distinct reactions, and the brief here is that the feel of the interaction matters more than the install size. Say the word if you would rather have the smaller download and I will look at bitrate / resolution / variant count.
  • preload="auto" on both <video> elements — done in 1.4.0: both are now preload="metadata", and the idle buffer's src is released when the other buffer takes over, so only one clip stays resident while she sits on the desktop.
  • A README note on how to grab, move or close her — done in 1.4.0: the README now says how to find the window again and how to move or close it.
  • Dropping the display-name sync entirely — keeping it, because after the ownership fix in 1.4.0 it is narrow enough to be safe: it only writes to the agent directory this package owns (a folder containing miniapps/<pluginId>), and only edits that agent's displayName frontmatter line. It never writes to an agent.md in a user project and never touches another agent. If you would still rather have it gone, tell me and I will pull it.

Version 1.6.0 (plugin.json, package.json and both READMEs).

@MyPrototypeWhat MyPrototypeWhat left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the follow-up. 1.6.0 only changes source comments and the version, so items 1 to 4 stay fixed. On item 5, his role and the interview notes are gone. What's left is his full name in the recognition list and the blocklist, plus the nickname and the 傻白甜 line in the prompt and spoken lines. With his consent, that's fine.

npm run check passes (plugins/antianqi/mmx-octopus: OK, 87 tests). Approving. Thanks for working through all of this.

@MyPrototypeWhat
MyPrototypeWhat merged commit 0f2183f into MiniMax-AI:main Nov 2, 2026
1 check passed
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