@geminilight/mindos 0.6.38 → 0.6.39

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.
Files changed (142) hide show
  1. package/README.md +14 -2
  2. package/README_zh.md +14 -2
  3. package/_standalone/.mindos-build-version +1 -1
  4. package/_standalone/.next/BUILD_ID +1 -1
  5. package/_standalone/.next/app-path-routes-manifest.json +17 -17
  6. package/_standalone/.next/build-manifest.json +2 -2
  7. package/_standalone/.next/cache/.previewinfo +1 -1
  8. package/_standalone/.next/cache/.rscinfo +1 -1
  9. package/_standalone/.next/cache/config.json +3 -3
  10. package/_standalone/.next/prerender-manifest.json +3 -3
  11. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/_standalone/.next/server/app/_global-error.html +2 -2
  14. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  22. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js +1 -1
  28. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/ask/route.js +29 -29
  41. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  49. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  60. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/changes/page.js +1 -1
  83. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  84. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  86. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  87. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/echo/page.js +1 -1
  89. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  90. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/explore/page.js +1 -1
  92. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  93. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/help/page.js +1 -1
  95. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  96. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/login/page.js +1 -1
  98. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  99. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/page.js +1 -1
  101. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  102. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/setup/page.js +1 -1
  104. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  105. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/trash/page.js +2 -2
  107. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  109. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  110. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app-paths-manifest.json +17 -17
  112. package/_standalone/.next/server/chunks/{8407.js → 1473.js} +2 -2
  113. package/_standalone/.next/server/chunks/4931.js +24 -24
  114. package/_standalone/.next/server/pages/500.html +2 -2
  115. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  117. package/_standalone/.next/static/chunks/{1263-79beb8734dee7bbd.js → 1263-6df1734e4273adb1.js} +2 -2
  118. package/_standalone/.next/static/chunks/app/{layout-aab90c2b4faf8d57.js → layout-d91cdbe2ecf135e1.js} +20 -20
  119. package/_standalone/.next/static/chunks/app/{page-9a15cf85f0962c59.js → page-718fdf170428b43c.js} +2 -2
  120. package/_standalone/.next/static/chunks/app/trash/page-89b1430cc8a16f18.js +1 -0
  121. package/_standalone/.next/static/chunks/app/view/[...path]/{page-35811d7e49e08157.js → page-6e3dc47699a01de1.js} +2 -2
  122. package/_standalone/.next/trace +53 -53
  123. package/_standalone/components/ask/AskContent.tsx +6 -6
  124. package/_standalone/components/settings/UpdateTab.tsx +371 -107
  125. package/_standalone/data/skills/mindos/SKILL.md +24 -9
  126. package/_standalone/data/skills/mindos-zh/SKILL.md +24 -9
  127. package/_standalone/lib/i18n/modules/settings.ts +32 -0
  128. package/app/app/api/ask/route.ts +12 -2
  129. package/app/components/ask/AskContent.tsx +6 -6
  130. package/app/components/settings/UpdateTab.tsx +371 -107
  131. package/app/data/skills/mindos/SKILL.md +24 -9
  132. package/app/data/skills/mindos-zh/SKILL.md +24 -9
  133. package/app/lib/i18n/modules/settings.ts +32 -0
  134. package/package.json +1 -1
  135. package/scripts/build-runtime-archive.sh +113 -0
  136. package/skills/mindos/SKILL.md +24 -9
  137. package/skills/mindos/references/write-supplement.md +46 -4
  138. package/skills/mindos-zh/SKILL.md +24 -9
  139. package/skills/mindos-zh/references/write-supplement.md +47 -5
  140. package/_standalone/.next/static/chunks/app/trash/page-7df0139c6b0f87e0.js +0 -1
  141. /package/_standalone/.next/static/{VAb8MoUUpoXjVJalRJogO → ushZ_NJ8rE3rG5hZfaYOX}/_buildManifest.js +0 -0
  142. /package/_standalone/.next/static/{VAb8MoUUpoXjVJalRJogO → ushZ_NJ8rE3rG5hZfaYOX}/_ssgManifest.js +0 -0
@@ -6,11 +6,15 @@ description: >
6
6
  update notes, search knowledge base, organize, SOP, retrospective, CSV, handoff, route notes, distill experience.
7
7
  仅 mindRoot 知识库内任务。不用于:改代码仓库/项目文档/KB 外路径。
8
8
  核心概念:空间、指令(INSTRUCTION.md)、技能(SKILL.md);笔记可承载指令与技能。
9
+ 当用户说"帮我记下来"、"搜一下我的笔记"、"更新知识库"、"整理文件"、"执行工作流"、
10
+ "记录这次会议的决策"、"追加到表格"、"交接给下一个 Agent" 时触发。
11
+ 也适用于:save/record a note, search KB, update/edit files, run SOP, capture decisions,
12
+ append CSV rows, cross-agent handoff — 所有 mindRoot 知识库内的读写操作。
9
13
  ---
10
14
 
11
15
  # MindOS Skill
12
16
 
13
- <!-- version: 1.3.1 -->
17
+ <!-- version: 1.3.2 -->
14
18
 
15
19
  **每次任务前,内化这 5 条规则:**
16
20
 
@@ -82,8 +86,7 @@ description: >
82
86
  └─ 先问清楚。基于 KB 状态提出 2-3 个具体选项。不要开始编辑。
83
87
  ```
84
88
 
85
- **以上任何写入 / SOP / 结构路径 → 先读 [references/write-supplement.md](./references/write-supplement.md)。**
86
- 包含:启动协议、写工具选型、各路径详细执行步骤。
89
+ **以上任何写入 / SOP / 结构路径 → 写入补充已加载到上下文(见下方或下一个上下文块中的 `## 写入与工作流补充` 章节)。**
87
90
 
88
91
  ---
89
92
 
@@ -96,7 +99,7 @@ description: >
96
99
  | 找文件 | `mindos_search_notes`(2-4 条并行关键词变体)| 单关键词搜索 |
97
100
  | 读内容 | `mindos_read_file` 或 `mindos_read_lines`(大文件) | 只需 10 行却读整文件 |
98
101
 
99
- 写入、结构变更、历史工具 → [references/write-supplement.md](./references/write-supplement.md)。
102
+ 写入、结构变更、历史工具 → 见写入与工作流补充(已加载到下方或下一个上下文块)。
100
103
 
101
104
  ### 回退
102
105
 
@@ -111,15 +114,27 @@ description: >
111
114
  |------|----------|----------|
112
115
  | **只读问答** | 查找 / 总结 / 引用 | 目录树推断 → 搜索 → 读取 → 标注来源 → 明确说信息缺口 |
113
116
 
114
- 写入模式详细执行步骤 → [references/write-supplement.md](./references/write-supplement.md)。
117
+ 写入模式详细执行步骤 → 见写入与工作流补充(已加载到下方或下一个上下文块)。
115
118
 
116
119
  ---
117
120
 
118
- ## 交互规则
121
+ ## 判断启发式规则
119
122
 
120
- - **模糊请求?** 先问。基于 KB 现状提出 2-3 个选项。不要在没理解范围前开始编辑。
121
- - **标注来源。** KB 中的事实附带文件路径,便于验证。
122
- - **简洁优先。** 展示最可能的匹配,不列全部。
123
+ **保存意图 读写边界识别**
124
+ - "帮我记下来" / "记录一下" / "保存这个" = 写入
125
+ - "搜一下有没有关于 X 的笔记" / "总结上周的工作" = 只读
126
+ - 模糊边界("整理一下这些内容")→ 先问:是读取展示,还是写回 KB?
127
+
128
+ **文件位置不确定时**
129
+ - 扫目录树 5 秒内定不下来 → 不要自创新目录;放语义最近的已有目录,告知用户
130
+ - 用户说"随便放个地方" → 放 inbox 或最顶层通用目录,任务后提议归类(触发 Structure classification hook)
131
+
132
+ **范围蔓延信号**
133
+ - 单条输入导致路由表 > 5 个文件 → 暂停,先确认范围;用户鲜少意图批量重写
134
+ - "把这些都更新一下" + 内容跨越多个主题 → 拆成批次确认,不一次性执行
135
+
136
+ **引用纪律**
137
+ - KB 中引用的事实必须附带文件路径,便于用户核查
123
138
 
124
139
  ---
125
140
 
@@ -271,6 +271,22 @@ export const settingsEn = {
271
271
  desktopReady: 'Update downloaded. Restart to apply.',
272
272
  desktopRestart: 'Restart Now',
273
273
  desktopHint: 'Updates are delivered through the Desktop app auto-updater.',
274
+ // Core Hot Update (Desktop only)
275
+ coreTitle: 'MindOS Core',
276
+ coreUpToDate: 'Core is up to date',
277
+ coreAvailable: (size: string) => `Update available (${size})`,
278
+ coreDownloading: 'Downloading...',
279
+ coreCancel: 'Cancel',
280
+ coreReady: 'Ready — restart services to apply',
281
+ coreRestartServices: 'Restart Services',
282
+ coreApplying: 'Applying update...',
283
+ coreApplied: 'Updated! Reloading...',
284
+ coreError: 'Core update failed.',
285
+ coreRetry: 'Retry',
286
+ coreDesktopTooOld: (version: string) => `v${version} requires a newer Desktop version.`,
287
+ coreDesktopTooOldHint: 'Please update MindOS Desktop first.',
288
+ coreHint: 'Core updates only restart services — no app restart needed.',
289
+ shellTitle: 'MindOS Desktop',
274
290
  },
275
291
  uninstall: {
276
292
  title: 'Uninstall MindOS',
@@ -569,6 +585,22 @@ export const settingsZh = {
569
585
  desktopReady: '更新已下载,重启后生效。',
570
586
  desktopRestart: '立即重启',
571
587
  desktopHint: '更新通过桌面端自动更新推送。',
588
+ // Core Hot Update
589
+ coreTitle: 'MindOS Core',
590
+ coreUpToDate: 'Core 已是最新',
591
+ coreAvailable: (size: string) => `有新版本可用(${size})`,
592
+ coreDownloading: '下载中...',
593
+ coreCancel: '取消',
594
+ coreReady: '已就绪 — 重启服务即可生效',
595
+ coreRestartServices: '重启服务',
596
+ coreApplying: '正在应用更新...',
597
+ coreApplied: '更新成功!正在刷新...',
598
+ coreError: 'Core 更新失败。',
599
+ coreRetry: '重试',
600
+ coreDesktopTooOld: (version: string) => `v${version} 需要更新版本的 Desktop。`,
601
+ coreDesktopTooOldHint: '请先更新 MindOS Desktop。',
602
+ coreHint: 'Core 更新只需重启服务,无需重启应用。',
603
+ shellTitle: 'MindOS Desktop',
572
604
  },
573
605
  uninstall: {
574
606
  title: '卸载 MindOS',
@@ -383,7 +383,11 @@ export async function POST(req: NextRequest) {
383
383
  ? path.join(process.env.MINDOS_PROJECT_ROOT, 'app')
384
384
  : process.cwd();
385
385
  const skillPath = path.join(appDir, `data/skills/${skillDirName}/SKILL.md`);
386
+ const skillWritePath = path.join(appDir, `data/skills/${skillDirName}/references/write-supplement.md`);
386
387
  const skill = readAbsoluteFile(skillPath);
388
+ const skillWrite = readAbsoluteFile(skillWritePath);
389
+
390
+ console.log(`[ask] SKILL skill=${skill.ok}, write-supplement=${skillWrite.ok}`);
387
391
 
388
392
  const userSkillRules = readKnowledgeFile('user-skill-rules.md');
389
393
 
@@ -423,11 +427,12 @@ export async function POST(req: NextRequest) {
423
427
  if (tm.ok && tm.content.trim().length > MIN_USEFUL_CONTENT_LENGTH) bootstrap.target_config_md = tm;
424
428
  }
425
429
 
426
- // Only report failures + truncation warnings for loaded files
427
430
  const initFailures: string[] = [];
428
431
  const truncationWarnings: string[] = [];
429
432
  if (!skill.ok) initFailures.push(`skill.mindos: failed (${skill.error})`);
430
433
  if (skill.ok && skill.truncated) truncationWarnings.push('skill.mindos was truncated');
434
+ if (!skillWrite.ok) initFailures.push(`skill.mindos-write-supplement: failed (${skillWrite.error})`);
435
+ if (skillWrite.ok && skillWrite.truncated) truncationWarnings.push('skill.mindos-write-supplement was truncated');
431
436
  if (userSkillRules.ok && userSkillRules.truncated) truncationWarnings.push('user-skill-rules.md was truncated');
432
437
  if (!bootstrap.instruction.ok) initFailures.push(`bootstrap.instruction: failed (${bootstrap.instruction.error})`);
433
438
  if (bootstrap.instruction.ok && bootstrap.instruction.truncated) truncationWarnings.push('bootstrap.instruction was truncated');
@@ -445,7 +450,12 @@ export async function POST(req: NextRequest) {
445
450
  : `Initialization issues:\n${initFailures.join('\n')}\nmind_root=${getMindRoot()}${targetDir ? `, target_dir=${targetDir}` : ''}${truncationWarnings.length > 0 ? `\n⚠️ Warnings:\n${truncationWarnings.join('\n')}` : ''}`;
446
451
 
447
452
  const initContextBlocks: string[] = [];
448
- if (skill.ok) initContextBlocks.push(`## mindos_skill_md\n\n${skill.content}`);
453
+ const skillParts: string[] = [];
454
+ if (skill.ok) skillParts.push(skill.content);
455
+ if (skillWrite.ok) skillParts.push(skillWrite.content);
456
+ if (skillParts.length > 0) {
457
+ initContextBlocks.push(`## mindos_skill_md\n\n${skillParts.join('\n\n---\n\n')}`);
458
+ }
449
459
  if (userSkillRules.ok && !userSkillRules.truncated && userSkillRules.content.trim()) {
450
460
  initContextBlocks.push(`## user_skill_rules\n\nUser personalization rules (user-skill-rules.md):\n\n${userSkillRules.content}`);
451
461
  }
@@ -544,25 +544,25 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
544
544
  {isPanel ? 'MindOS Agent' : t.ask.title}
545
545
  </span>
546
546
  </div>
547
- <div className="flex items-center gap-1">
548
- <button type="button" onClick={() => setShowHistory(v => !v)} aria-pressed={showHistory} className={`p-1.5 rounded transition-colors ${showHistory ? 'bg-muted text-foreground' : 'text-muted-foreground hover:text-foreground hover:bg-muted'}`} title={t.hints.sessionHistory}>
547
+ <div className="flex items-center gap-1 shrink-0">
548
+ <button type="button" onClick={(e) => { e.stopPropagation(); setShowHistory(v => !v); }} aria-pressed={showHistory} className={`p-2 rounded transition-colors ${showHistory ? 'bg-muted text-foreground' : 'text-muted-foreground hover:text-foreground hover:bg-muted'}`} title={t.hints.sessionHistory}>
549
549
  <History size={iconSize} />
550
550
  </button>
551
- <button type="button" onClick={handleResetSession} disabled={isLoading} className="p-1.5 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors disabled:opacity-40" title={t.hints.newSession}>
551
+ <button type="button" onClick={(e) => { e.stopPropagation(); handleResetSession(); }} disabled={isLoading} className="p-2 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors disabled:opacity-40" title={t.hints.newSession}>
552
552
  <SquarePen size={iconSize} />
553
553
  </button>
554
554
  {isPanel && onMaximize && (
555
- <button type="button" onClick={onMaximize} className="p-1.5 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={maximized ? t.hints.restorePanel : t.hints.maximizePanel}>
555
+ <button type="button" onClick={(e) => { e.stopPropagation(); onMaximize(); }} className="p-2 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={maximized ? t.hints.restorePanel : t.hints.maximizePanel}>
556
556
  {maximized ? <Minimize2 size={iconSize} /> : <Maximize2 size={iconSize} />}
557
557
  </button>
558
558
  )}
559
559
  {onModeSwitch && (
560
- <button type="button" onClick={onModeSwitch} className="p-1.5 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={askMode === 'popup' ? t.hints.dockToSide : t.hints.openAsPopup}>
560
+ <button type="button" onClick={(e) => { e.stopPropagation(); onModeSwitch(); }} className="p-2 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={askMode === 'popup' ? t.hints.dockToSide : t.hints.openAsPopup}>
561
561
  {askMode === 'popup' ? <PanelRight size={iconSize} /> : <AppWindow size={iconSize} />}
562
562
  </button>
563
563
  )}
564
564
  {onClose && (
565
- <button type="button" onClick={onClose} className="p-1.5 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={t.hints.closePanel} aria-label="Close">
565
+ <button type="button" onClick={(e) => { e.stopPropagation(); onClose(); }} className="p-2 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={t.hints.closePanel} aria-label="Close">
566
566
  <X size={isPanel ? iconSize : 15} />
567
567
  </button>
568
568
  )}