diff --git a/plugins/minimax-ai/minimax-pet/miniapp/client/pet-app.js b/plugins/minimax-ai/minimax-pet/miniapp/client/pet-app.js
index 960620b..3bd639b 100644
--- a/plugins/minimax-ai/minimax-pet/miniapp/client/pet-app.js
+++ b/plugins/minimax-ai/minimax-pet/miniapp/client/pet-app.js
@@ -242,7 +242,9 @@ let animationGate = null;
let workbenchView = null;
let workbenchWindow = null;
const reminders = createReminderStore();
-const compactBubbleSize = { width: 300, height: 340 };
+// Expanded card: the pet keeps its slot at the bottom and the card gets a readable
+// reply body, instead of the ~110px left in the compact window.
+const compactBubbleSize = { width: 300, height: 520 };
let notificationPreviews = null;
let askObserver = null;
let detailOpenToken = 0;
@@ -1912,7 +1914,7 @@ function renderReminders() {
function renderScale() {
root.style.setProperty('--minimax-pet-height', `${208 * prefs.scale}px`);
- compactBubbleSize.height = Math.max(340, Math.ceil(208 * prefs.scale) + 232);
+ compactBubbleSize.height = Math.max(380, Math.ceil(208 * prefs.scale) + 332);
syncSegmented(els.scaleGroup, prefs.scale);
}
diff --git a/plugins/minimax-ai/minimax-pet/miniapp/client/pet.css b/plugins/minimax-ai/minimax-pet/miniapp/client/pet.css
index f417bc5..cbcfa75 100644
--- a/plugins/minimax-ai/minimax-pet/miniapp/client/pet.css
+++ b/plugins/minimax-ai/minimax-pet/miniapp/client/pet.css
@@ -619,7 +619,9 @@ html.mode-window body {
justify-content: flex-end;
gap: 4px;
padding: 8px 8px 4px;
- overflow: hidden;
+ /* The window is transparent and frameless: the card may overflow it upward so a
+ long reply keeps a readable body instead of a single line. */
+ overflow: visible;
}
.desk-overlays {
@@ -821,8 +823,9 @@ html.mode-window .pet-sprite:focus-visible {
z-index: 5;
left: 8px;
right: 8px;
- bottom: calc(var(--minimax-pet-height, 104px) + 12px);
- max-height: 216px;
+ bottom: calc(var(--minimax-pet-height, 104px) + 8px);
+ /* Use the space the expanded window provides, up to what the desk leaves above the pet. */
+ max-height: max(216px, calc(100% - var(--minimax-pet-height, 104px) - 24px));
display: flex;
flex-direction: column;
border: 1px solid var(--mcode-border);
@@ -844,6 +847,12 @@ html.mode-window .pet-sprite:focus-visible {
.compact-button:disabled { opacity: .4; cursor: default; }
.compact-close { color: var(--mcode-text-muted); margin-left: auto; font-size: 17px; padding: 0 5px; min-width: 32px; min-height: 32px; }
.compact-body { min-height: 0; overflow: auto; padding: 2px 10px 8px; }
+/* The detail pane owns the height: head and footer are fixed, the reply is the only scroller. */
+.compact-detail { display: flex; flex-direction: column; gap: 4px; min-height: 0; padding: 2px 10px 8px; overflow: hidden; }
+.compact-detail-head { display: flex; align-items: baseline; gap: 6px; flex: none; min-width: 0; }
+.compact-detail-body { flex: 1; min-height: 0; overflow: auto; overscroll-behavior: contain; }
+.compact-detail .compact-footer { flex: none; margin-top: 0; padding-top: 4px; border-top: 1px solid var(--mcode-border); }
+.compact-detail .compact-hint { flex: none; }
.compact-hint { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; color: var(--mcode-text-muted); margin: 4px 0; font-size: 12px; line-height: 16px; }
.compact-hint[data-kind='error'] { color: var(--mcode-danger); }
.compact-footer { display: flex; justify-content: space-between; gap: 8px; margin-top: 4px; }
@@ -860,9 +869,9 @@ html.mode-window .pet-sprite:focus-visible {
.pet-notice-open { flex: 1; min-width: 0; border: 0; background: transparent; color: var(--mcode-text); text-align: left; font: inherit; font-size: 12px; line-height: 16px; padding: 0; cursor: pointer; }
.pet-notice-open strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
.pet-notice-preview { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 5; overflow: hidden; color: var(--mcode-text-muted); overflow-wrap: anywhere; }
-.compact-detail-title { margin: 0; font-size: 13px; line-height: 18px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
-.compact-detail-status { margin: 2px 0 2px 6px; font-size: 12px; line-height: 16px; color: var(--mcode-text-muted); }
-.compact-detail-reply { margin: 5px 0; max-height: 126px; overflow: auto; overscroll-behavior: contain; overflow-wrap: anywhere; user-select: text; -webkit-user-select: text; }
+.compact-detail-title { flex: 1; min-width: 0; margin: 0; font-size: 13px; line-height: 18px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.compact-detail-status { flex: none; font-size: 12px; line-height: 16px; color: var(--mcode-text-muted); }
+.compact-detail-reply { margin: 0; overflow-wrap: anywhere; user-select: text; -webkit-user-select: text; }
/* The desktop card is 280px wide; keep the same structure at a tighter scale. */
.compact-detail-reply.md { font-size: 12px; line-height: 17px; text-align: left; }
.compact-detail-reply.md .md-p,
diff --git a/sources/minimax-ai/minimax-pet/.minimax-plugin/plugin.json b/sources/minimax-ai/minimax-pet/.minimax-plugin/plugin.json
index db1d5a2..3451680 100644
--- a/sources/minimax-ai/minimax-pet/.minimax-plugin/plugin.json
+++ b/sources/minimax-ai/minimax-pet/.minimax-plugin/plugin.json
@@ -2,7 +2,7 @@
"schemaVersion": 1,
"name": "minimax-pet",
"displayName": "MiniMax Pet",
- "version": "0.8.0",
+ "version": "0.8.1",
"description": "轻量桌宠,聚合主窗口可见会话的任务状态、需要回答的提醒和最新结果,支持外观切换及图集导入。",
"author": "MiniMax",
"icon": "icon.png",
diff --git a/sources/minimax-ai/minimax-pet/README.md b/sources/minimax-ai/minimax-pet/README.md
index f29b9bd..794cc0b 100644
--- a/sources/minimax-ai/minimax-pet/README.md
+++ b/sources/minimax-ai/minimax-pet/README.md
@@ -15,6 +15,8 @@ A lightweight desktop companion for MiniMax Code, by **MiniMax**. It shows visib
The pet does not run Agent turns, create independent chats, write to chat inputs, comment on every session, stop tasks, or answer questionnaires. Selecting a task only reads its details; the main window switches only when you click **打开对话** or **去回答**.
+Version **0.8.1** fixes the desktop card: the title truncates to one line, only the reply scrolls, and the actions stay pinned, so a long title or reply no longer pushes 返回任务 / 打开对话 out of the card. Expanding the card also grows the window instead of squeezing the reply into one line.
+
Version **0.8.0** aligns the panel with the MiniMax Code design language: 24px page margins and section gaps, 14px/22px body copy with 12px/18px supporting text, 32px minimum control height, 12px cards and 8px controls, 0.5px borders on desktop overlays, and press/focus states. The desktop pet keeps its 280px layout with the same tokens.
Version **0.7.0** renders each task's latest reply as Markdown: headings, emphasis, lists, task lists, fenced code, tables, quotes and links, with raw HTML shown as inert text and images as a label instead of a remote request. Notification cards and reminder previews stay plain text. Parsing uses a vendored bundle of unified, remark-parse and remark-gfm (MIT) built by `npm run build:markdown`; the page never builds an HTML string from model output. The bundle makes no network request and runs entirely in the page.
diff --git a/sources/minimax-ai/minimax-pet/README.zh-CN.md b/sources/minimax-ai/minimax-pet/README.zh-CN.md
index 45f799b..24667dd 100644
--- a/sources/minimax-ai/minimax-pet/README.zh-CN.md
+++ b/sources/minimax-ai/minimax-pet/README.zh-CN.md
@@ -16,6 +16,8 @@
**0.5.11** 新增可选内置宠物 **MMX 章鱼娘**,是一位橙发、白背心、棕格纹短裙的 Q 版全身章鱼娘。在“外观 → 选择宠物”中选择她即可;薄荷色机器人仍为默认宠物。她采用 v1 图集,包含九种动作,不含十六个视线方向,因此鼠标跟随对她不生效;沿用六帧、6.6 秒一轮的慢速待机,不新增权限或改变播放器。图集已通过校验。创作流程和贡献者许可见[素材说明](ARTWORK.md)。
+**0.8.1** 修复桌面卡片:标题单行截断,只有回复区滚动,底部操作固定在卡片内;长标题或长回复不再把「返回任务 / 打开对话」顶出卡片。展开卡片时窗口同步变高,回复不会被压成一行。
+
**0.8.0** 按 MiniMax Code 的设计语言对齐面板:24px 页边距与区块间距、14px/22px 正文与 12px/18px 辅助文字、控件最小高度 32px、卡片 12px 与控件 8px 圆角、桌面浮层 0.5px 描边,并补齐按下与焦点状态。桌面宠物保持 280px 布局,沿用同一套 token。
**0.7.0** 把任务最近回复按 Markdown 渲染:标题、强调、列表、任务清单、代码块、表格、引用和链接;回复里的原始 HTML 只作为文本显示,图片显示为文字标签而不发起网络请求。通知卡片和提醒预览仍为纯文本。解析使用 `npm run build:markdown` 打包的 unified + remark-parse + remark-gfm(MIT);页面不会把模型输出拼成 HTML 字符串。
diff --git a/sources/minimax-ai/minimax-pet/dev/compact-pet-view.test.mjs b/sources/minimax-ai/minimax-pet/dev/compact-pet-view.test.mjs
index 7294d14..7fa3047 100644
--- a/sources/minimax-ai/minimax-pet/dev/compact-pet-view.test.mjs
+++ b/sources/minimax-ai/minimax-pet/dev/compact-pet-view.test.mjs
@@ -314,3 +314,25 @@ domTest('a markdown reply renders as structure in the detail, previews stay flat
h.update({ taskSelection: selection(1, reply) });
assert.equal(node.querySelector('.md-heading').textContent, '结论');
});
+
+domTest('a long title truncates on one line and a long reply cannot push the footer out', (t) => {
+ const h = harness(t);
+ const longTitle = '确认 mcode-data-analytics 数据获取状态并核对安全边界与聚合口径的最终结论';
+ const longReply = Array.from({ length: 40 }, (_, n) => `第 ${n + 1} 行很长的回复正文,用来把卡片撑满`).join('\n\n');
+ h.update({ taskSelection: { availability: 'ready', selectedSessionId: 'task-1', session: { sessionId: 'task-1', title: longTitle, status: 'idle' },
+ detail: { sessionId: 'task-1', title: longTitle, status: 'idle', lastAssistantText: longReply } } });
+ h.view.open('detail');
+ const title = h.container.querySelector('.compact-detail-title');
+ const head = h.container.querySelector('.compact-detail-head');
+ const body = h.container.querySelector('.compact-detail-body');
+ const reply = h.container.querySelector('.compact-detail-reply');
+ const footer = h.container.querySelector('.compact-detail .compact-footer');
+ assert.equal(title.textContent, longTitle);
+ assert.equal(head.contains(title) && head.contains(h.container.querySelector('.compact-detail-status')), true);
+ // The title and the footer sit outside the scrolling body, and only the body scrolls.
+ assert.equal(head.parentNode, h.container.querySelector('.compact-detail'));
+ assert.equal(body.contains(reply), true);
+ assert.equal(body.contains(footer), false);
+ assert.equal(footer.parentNode, h.container.querySelector('.compact-detail'));
+ assert.equal(reply.textContent.includes('第 40 行'), true);
+});
diff --git a/sources/minimax-ai/minimax-pet/miniapp/client/compact-pet-view.mjs b/sources/minimax-ai/minimax-pet/miniapp/client/compact-pet-view.mjs
index ba2f2db..5c41cee 100644
--- a/sources/minimax-ai/minimax-pet/miniapp/client/compact-pet-view.mjs
+++ b/sources/minimax-ai/minimax-pet/miniapp/client/compact-pet-view.mjs
@@ -65,11 +65,17 @@ export function createCompactPetView({
const allTasks = button('全部任务', 'compact-link', () => api.open('allTasks'));
tasksFooter.append(allTasks); tasksPane.append(taskList, tasksFooter);
- const detailPane = element('div', 'compact-detail compact-body');
+ const detailPane = element('div', 'compact-detail');
+ const detailHead = element('div', 'compact-detail-head');
const detailTitle = element('strong', 'compact-detail-title');
const detailStatus = element('span', 'compact-detail-status'); detailStatus.setAttribute('role', 'status');
+ detailHead.append(detailTitle, detailStatus);
+ // Only the reply scrolls; the title and the actions stay pinned so a long title or a
+ // long reply can never push the buttons out of the 280px card.
+ const detailBody = element('div', 'compact-detail-body');
const detailReply = element('div', 'compact-detail-reply md');
detailReply.setAttribute('aria-label', '任务最近回复'); detailReply.tabIndex = 0;
+ detailBody.append(detailReply);
const detailFooter = element('div', 'compact-footer');
const back = button('返回任务', 'compact-detail-back compact-link', () => api.open(detailBackView));
const openHint = element('p', 'compact-hint'); openHint.setAttribute('role', 'status'); openHint.hidden = true;
@@ -87,7 +93,8 @@ export function createCompactPetView({
setHint(textOf(result?.text) || (failed ? `没能打开对话(${failureCode(result)})。` : ''), textOf(result?.kind) || (failed ? 'error' : 'info'));
});
});
- detailFooter.append(back, openSession); detailPane.append(detailTitle, detailStatus, detailReply, detailFooter, openHint);
+ detailFooter.append(back, openSession);
+ detailPane.append(detailHead, detailBody, detailFooter, openHint);
container.append(header, tasksPane, detailPane);
function paintTasks() {
@@ -152,7 +159,7 @@ export function createCompactPetView({
}
detailPane.setAttribute('aria-busy', String(available && !needsAnswer && taskSelection.detailLoading === true));
if (paintedDetailId !== id) {
- detailReply.scrollTop = 0; detailPane.scrollTop = 0; paintedDetailId = id;
+ detailReply.scrollTop = 0; detailBody.scrollTop = 0; paintedDetailId = id;
openToken++; openSession.disabled = false; setHint('');
}
openSession.hidden = typeof onOpenSession !== 'function' || !available || !id;
diff --git a/sources/minimax-ai/minimax-pet/miniapp/client/index.html b/sources/minimax-ai/minimax-pet/miniapp/client/index.html
index 5f6a102..242d60b 100644
--- a/sources/minimax-ai/minimax-pet/miniapp/client/index.html
+++ b/sources/minimax-ai/minimax-pet/miniapp/client/index.html
@@ -157,7 +157,7 @@
任务连接
版本与帮助
-
MiniMax Pet 0.8.0
+
MiniMax Pet 0.8.1
diff --git a/sources/minimax-ai/minimax-pet/miniapp/client/pet-app.js b/sources/minimax-ai/minimax-pet/miniapp/client/pet-app.js
index 960620b..3bd639b 100644
--- a/sources/minimax-ai/minimax-pet/miniapp/client/pet-app.js
+++ b/sources/minimax-ai/minimax-pet/miniapp/client/pet-app.js
@@ -242,7 +242,9 @@ let animationGate = null;
let workbenchView = null;
let workbenchWindow = null;
const reminders = createReminderStore();
-const compactBubbleSize = { width: 300, height: 340 };
+// Expanded card: the pet keeps its slot at the bottom and the card gets a readable
+// reply body, instead of the ~110px left in the compact window.
+const compactBubbleSize = { width: 300, height: 520 };
let notificationPreviews = null;
let askObserver = null;
let detailOpenToken = 0;
@@ -1912,7 +1914,7 @@ function renderReminders() {
function renderScale() {
root.style.setProperty('--minimax-pet-height', `${208 * prefs.scale}px`);
- compactBubbleSize.height = Math.max(340, Math.ceil(208 * prefs.scale) + 232);
+ compactBubbleSize.height = Math.max(380, Math.ceil(208 * prefs.scale) + 332);
syncSegmented(els.scaleGroup, prefs.scale);
}
diff --git a/sources/minimax-ai/minimax-pet/miniapp/client/pet.css b/sources/minimax-ai/minimax-pet/miniapp/client/pet.css
index f417bc5..cbcfa75 100644
--- a/sources/minimax-ai/minimax-pet/miniapp/client/pet.css
+++ b/sources/minimax-ai/minimax-pet/miniapp/client/pet.css
@@ -619,7 +619,9 @@ html.mode-window body {
justify-content: flex-end;
gap: 4px;
padding: 8px 8px 4px;
- overflow: hidden;
+ /* The window is transparent and frameless: the card may overflow it upward so a
+ long reply keeps a readable body instead of a single line. */
+ overflow: visible;
}
.desk-overlays {
@@ -821,8 +823,9 @@ html.mode-window .pet-sprite:focus-visible {
z-index: 5;
left: 8px;
right: 8px;
- bottom: calc(var(--minimax-pet-height, 104px) + 12px);
- max-height: 216px;
+ bottom: calc(var(--minimax-pet-height, 104px) + 8px);
+ /* Use the space the expanded window provides, up to what the desk leaves above the pet. */
+ max-height: max(216px, calc(100% - var(--minimax-pet-height, 104px) - 24px));
display: flex;
flex-direction: column;
border: 1px solid var(--mcode-border);
@@ -844,6 +847,12 @@ html.mode-window .pet-sprite:focus-visible {
.compact-button:disabled { opacity: .4; cursor: default; }
.compact-close { color: var(--mcode-text-muted); margin-left: auto; font-size: 17px; padding: 0 5px; min-width: 32px; min-height: 32px; }
.compact-body { min-height: 0; overflow: auto; padding: 2px 10px 8px; }
+/* The detail pane owns the height: head and footer are fixed, the reply is the only scroller. */
+.compact-detail { display: flex; flex-direction: column; gap: 4px; min-height: 0; padding: 2px 10px 8px; overflow: hidden; }
+.compact-detail-head { display: flex; align-items: baseline; gap: 6px; flex: none; min-width: 0; }
+.compact-detail-body { flex: 1; min-height: 0; overflow: auto; overscroll-behavior: contain; }
+.compact-detail .compact-footer { flex: none; margin-top: 0; padding-top: 4px; border-top: 1px solid var(--mcode-border); }
+.compact-detail .compact-hint { flex: none; }
.compact-hint { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; color: var(--mcode-text-muted); margin: 4px 0; font-size: 12px; line-height: 16px; }
.compact-hint[data-kind='error'] { color: var(--mcode-danger); }
.compact-footer { display: flex; justify-content: space-between; gap: 8px; margin-top: 4px; }
@@ -860,9 +869,9 @@ html.mode-window .pet-sprite:focus-visible {
.pet-notice-open { flex: 1; min-width: 0; border: 0; background: transparent; color: var(--mcode-text); text-align: left; font: inherit; font-size: 12px; line-height: 16px; padding: 0; cursor: pointer; }
.pet-notice-open strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
.pet-notice-preview { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 5; overflow: hidden; color: var(--mcode-text-muted); overflow-wrap: anywhere; }
-.compact-detail-title { margin: 0; font-size: 13px; line-height: 18px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
-.compact-detail-status { margin: 2px 0 2px 6px; font-size: 12px; line-height: 16px; color: var(--mcode-text-muted); }
-.compact-detail-reply { margin: 5px 0; max-height: 126px; overflow: auto; overscroll-behavior: contain; overflow-wrap: anywhere; user-select: text; -webkit-user-select: text; }
+.compact-detail-title { flex: 1; min-width: 0; margin: 0; font-size: 13px; line-height: 18px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.compact-detail-status { flex: none; font-size: 12px; line-height: 16px; color: var(--mcode-text-muted); }
+.compact-detail-reply { margin: 0; overflow-wrap: anywhere; user-select: text; -webkit-user-select: text; }
/* The desktop card is 280px wide; keep the same structure at a tighter scale. */
.compact-detail-reply.md { font-size: 12px; line-height: 17px; text-align: left; }
.compact-detail-reply.md .md-p,
diff --git a/sources/minimax-ai/minimax-pet/package-lock.json b/sources/minimax-ai/minimax-pet/package-lock.json
index 4beea79..c2408ca 100644
--- a/sources/minimax-ai/minimax-pet/package-lock.json
+++ b/sources/minimax-ai/minimax-pet/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "minimax-pet-source",
- "version": "0.8.0",
+ "version": "0.8.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "minimax-pet-source",
- "version": "0.8.0",
+ "version": "0.8.1",
"devDependencies": {
"esbuild": "0.25.12",
"jsdom": "24.1.3",
@@ -715,7 +715,7 @@
}
},
"node_modules/cssstyle/node_modules/rrweb-cssom": {
- "version": "0.8.0",
+ "version": "0.8.1",
"resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
"integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
"dev": true,
diff --git a/sources/minimax-ai/minimax-pet/package.json b/sources/minimax-ai/minimax-pet/package.json
index 323275f..3c3f582 100644
--- a/sources/minimax-ai/minimax-pet/package.json
+++ b/sources/minimax-ai/minimax-pet/package.json
@@ -1,6 +1,6 @@
{
"name": "minimax-pet-source",
- "version": "0.8.0",
+ "version": "0.8.1",
"private": true,
"type": "module",
"description": "桌宠插件的开发与验证工具,不进入分发包。",