cli-jaw 2.17.62 → 2.17.63

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 (360) hide show
  1. package/README.ja.md +17 -17
  2. package/README.ko.md +17 -17
  3. package/README.md +17 -17
  4. package/README.zh-CN.md +17 -17
  5. package/dist/bin/commands/tui/input-handler.js +19 -0
  6. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  7. package/dist/bin/commands/tui/overlays.js +8 -4
  8. package/dist/bin/commands/tui/overlays.js.map +1 -1
  9. package/dist/bin/star-prompt.js +1 -1
  10. package/dist/bin/star-prompt.js.map +1 -1
  11. package/dist/server.js +14 -1
  12. package/dist/server.js.map +1 -1
  13. package/dist/src/agent/claude-runtime-pool.js +2 -1
  14. package/dist/src/agent/claude-runtime-pool.js.map +1 -1
  15. package/dist/src/agent/claude-runtime-run.js +28 -7
  16. package/dist/src/agent/claude-runtime-run.js.map +1 -1
  17. package/dist/src/agent/lifecycle-handler.js +34 -6
  18. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  19. package/dist/src/agent/runtime/claude-sdk-events.js +136 -9
  20. package/dist/src/agent/runtime/claude-sdk-events.js.map +1 -1
  21. package/dist/src/agent/runtime/claude-sdk-history-loader.js +24 -0
  22. package/dist/src/agent/runtime/claude-sdk-history-loader.js.map +1 -0
  23. package/dist/src/agent/runtime/claude-sdk-hooks.js +10 -4
  24. package/dist/src/agent/runtime/claude-sdk-hooks.js.map +1 -1
  25. package/dist/src/agent/runtime/claude-sdk-messages.js +25 -2
  26. package/dist/src/agent/runtime/claude-sdk-messages.js.map +1 -1
  27. package/dist/src/agent/runtime/claude-sdk-options.js +36 -3
  28. package/dist/src/agent/runtime/claude-sdk-options.js.map +1 -1
  29. package/dist/src/agent/runtime/claude-sdk-permissions.js +32 -9
  30. package/dist/src/agent/runtime/claude-sdk-permissions.js.map +1 -1
  31. package/dist/src/agent/runtime/claude-sdk-session.js +165 -17
  32. package/dist/src/agent/runtime/claude-sdk-session.js.map +1 -1
  33. package/dist/src/agent/runtime/claude-sdk-version.js +8 -0
  34. package/dist/src/agent/runtime/claude-sdk-version.js.map +1 -0
  35. package/dist/src/agent/spawn/backend-codex-app.js +619 -0
  36. package/dist/src/agent/spawn/backend-codex-app.js.map +1 -0
  37. package/dist/src/agent/spawn/backend-context.js +2 -0
  38. package/dist/src/agent/spawn/backend-context.js.map +1 -0
  39. package/dist/src/agent/spawn/backend-copilot.js +385 -0
  40. package/dist/src/agent/spawn/backend-copilot.js.map +1 -0
  41. package/dist/src/agent/spawn/backend-native-acp.js +379 -0
  42. package/dist/src/agent/spawn/backend-native-acp.js.map +1 -0
  43. package/dist/src/agent/spawn/backend-pi.js +565 -0
  44. package/dist/src/agent/spawn/backend-pi.js.map +1 -0
  45. package/dist/src/agent/spawn/types.js +2 -0
  46. package/dist/src/agent/spawn/types.js.map +1 -0
  47. package/dist/src/agent/spawn.js +44 -1858
  48. package/dist/src/agent/spawn.js.map +1 -1
  49. package/dist/src/cli/claude-default-model-boot.js +36 -0
  50. package/dist/src/cli/claude-default-model-boot.js.map +1 -0
  51. package/dist/src/cli/claude-model-discovery.js +13 -1
  52. package/dist/src/cli/claude-model-discovery.js.map +1 -1
  53. package/dist/src/cli/claude-models.js +7 -1
  54. package/dist/src/cli/claude-models.js.map +1 -1
  55. package/dist/src/cli/commands.js +5 -15
  56. package/dist/src/cli/commands.js.map +1 -1
  57. package/dist/src/cli/tui/composer.js +3 -3
  58. package/dist/src/cli/tui/composer.js.map +1 -1
  59. package/dist/src/cli/tui/skill-mention.js +15 -0
  60. package/dist/src/cli/tui/skill-mention.js.map +1 -0
  61. package/dist/src/code-mode/manager.js +174 -9
  62. package/dist/src/code-mode/manager.js.map +1 -1
  63. package/dist/src/code-mode/providers/catalog.js +5 -3
  64. package/dist/src/code-mode/providers/catalog.js.map +1 -1
  65. package/dist/src/code-mode/providers/claude-history.js +132 -0
  66. package/dist/src/code-mode/providers/claude-history.js.map +1 -0
  67. package/dist/src/code-mode/providers/claude.js +74 -7
  68. package/dist/src/code-mode/providers/claude.js.map +1 -1
  69. package/dist/src/code-mode/providers/codex-app.js +7 -1
  70. package/dist/src/code-mode/providers/codex-app.js.map +1 -1
  71. package/dist/src/code-mode/session.js +158 -11
  72. package/dist/src/code-mode/session.js.map +1 -1
  73. package/dist/src/code-mode/store.js +416 -28
  74. package/dist/src/code-mode/store.js.map +1 -1
  75. package/dist/src/command-contract/catalog.js +3 -22
  76. package/dist/src/command-contract/catalog.js.map +1 -1
  77. package/dist/src/core/codex-config.js +3 -62
  78. package/dist/src/core/codex-config.js.map +1 -1
  79. package/dist/src/core/config.js +116 -14
  80. package/dist/src/core/config.js.map +1 -1
  81. package/dist/src/core/runtime-settings.js +20 -10
  82. package/dist/src/core/runtime-settings.js.map +1 -1
  83. package/dist/src/core/settings-watch.js +1 -0
  84. package/dist/src/core/settings-watch.js.map +1 -1
  85. package/dist/src/core/skill-mentions.js +83 -0
  86. package/dist/src/core/skill-mentions.js.map +1 -0
  87. package/dist/src/manager/registry.js +5 -1
  88. package/dist/src/manager/registry.js.map +1 -1
  89. package/dist/src/manager/routes/desktop-status.js +1 -1
  90. package/dist/src/manager/routes/desktop-status.js.map +1 -1
  91. package/dist/src/orchestrator/pipeline.js +11 -1
  92. package/dist/src/orchestrator/pipeline.js.map +1 -1
  93. package/dist/src/prompt/builder.js +10 -4
  94. package/dist/src/prompt/builder.js.map +1 -1
  95. package/dist/src/prompt/templates/a1-system.md +1 -1
  96. package/dist/src/routes/code-native.js +51 -3
  97. package/dist/src/routes/code-native.js.map +1 -1
  98. package/dist/src/routes/settings.js +1 -4
  99. package/dist/src/routes/settings.js.map +1 -1
  100. package/dist/src/routes/skills.js +7 -0
  101. package/dist/src/routes/skills.js.map +1 -1
  102. package/dist/src/shared/skill-mention.js +61 -0
  103. package/dist/src/shared/skill-mention.js.map +1 -0
  104. package/dist/src/shared/tool-input.js +137 -0
  105. package/dist/src/shared/tool-input.js.map +1 -0
  106. package/package.json +7 -5
  107. package/public/css/activity.css +83 -20
  108. package/public/css/layout.css +2 -2
  109. package/public/css/sidebar.css +18 -0
  110. package/public/css/variables.css +23 -2
  111. package/public/dist/.vite/manifest.json +302 -334
  112. package/public/dist/assets/Activity-DPLlOJ46.js +1 -0
  113. package/public/dist/assets/AdvancedExport-BgOgGvc5.js +1 -0
  114. package/public/dist/assets/Agent-O_U8ny90.js +1 -0
  115. package/public/dist/assets/Browser-m6VynQXV.js +1 -0
  116. package/public/dist/assets/BrowserPanel-Bb-Bge6B.js +3 -0
  117. package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +85 -0
  118. package/public/dist/assets/ChannelSetupEntry-DHLoZEzJ.js +1 -0
  119. package/public/dist/assets/ChannelsDiscord-B-G8vsYy.js +1 -0
  120. package/public/dist/assets/ChannelsSlack-oPuh922z.js +1 -0
  121. package/public/dist/assets/ChannelsTelegram-PmTv43KQ.js +1 -0
  122. package/public/dist/assets/CodeCanvas-CVbdp0S-.js +3 -0
  123. package/public/dist/assets/DashboardMeta-BqEiJrvr.js +1 -0
  124. package/public/dist/assets/DesignPanel-BOb-HMbl.js +2 -0
  125. package/public/dist/assets/{Developer-BdKPcw8Z.js → Developer-CbySB7_Z.js} +1 -1
  126. package/public/dist/assets/{DiffPanel-DtJuvU5y.js → DiffPanel-D9Cch5FG.js} +1 -1
  127. package/public/dist/assets/Display-C0Zdamcb.js +1 -0
  128. package/public/dist/assets/Display-DU4_76cS.js +1 -0
  129. package/public/dist/assets/DocPanel-DvtFw8AP.js +1 -0
  130. package/public/dist/assets/{Embedding-DvdTj1BF.js → Embedding-CCFMOB_2.js} +1 -1
  131. package/public/dist/assets/Employees-BanvF58d.js +1 -0
  132. package/public/dist/assets/FolderPanel-CJvwRwIV.js +3 -0
  133. package/public/dist/assets/Heartbeat-uyi_MpUd.js +1 -0
  134. package/public/dist/assets/InlineWarn-Cq4z28F3.js +1 -0
  135. package/public/dist/assets/MarkdownRenderer-Cc3DeHvm.js +1 -0
  136. package/public/dist/assets/{MarkdownRenderer-DhonsAPC.js → MarkdownRenderer-DzN66XVb.js} +1 -1
  137. package/public/dist/assets/Mcp-rjPoL_Zo.js +4 -0
  138. package/public/dist/assets/Memory-C9I33pIi.js +1 -0
  139. package/public/dist/assets/{MilkdownWysiwygEditor-D6JaLDE4.js → MilkdownWysiwygEditor-xObhviw7.js} +1 -1
  140. package/public/dist/assets/ModelProvider-fiUktMaO.js +1 -0
  141. package/public/dist/assets/Network-CuqFrOvR.js +1 -0
  142. package/public/dist/assets/NotesGraphWorkspace-DO9LtVGF.js +1 -0
  143. package/public/dist/assets/PanelLayoutProvider-DRZ4QkBC.js +1 -0
  144. package/public/dist/assets/Permissions-BltXiZnz.js +1 -0
  145. package/public/dist/assets/{Permissions-BwiMEoTV.js → Permissions-DcCbFMIq.js} +1 -1
  146. package/public/dist/assets/Profile-DUL7-RE_.js +1 -0
  147. package/public/dist/assets/Prompts-C9vY8ivQ.js +1 -0
  148. package/public/dist/assets/SpeechKeys-BJ8V7U5E.js +1 -0
  149. package/public/dist/assets/TelegramHub-DtyjLGFR.js +1 -0
  150. package/public/dist/assets/{TerminalPanel-Bu9i-P2f.js → TerminalPanel-c1xhiy53.js} +1 -1
  151. package/public/dist/assets/app-BjKzqXCv.css +1 -0
  152. package/public/dist/assets/app-CZwx0V6K.js +59 -0
  153. package/public/dist/assets/bgtask-badge-CnVkcp3c.js +1 -0
  154. package/public/dist/assets/{bgtask-badge-DfiHuzxT.js → bgtask-badge-Cp26S8Uq.js} +1 -1
  155. package/public/dist/assets/client-platform-WO8m6kPQ.js +1 -0
  156. package/public/dist/assets/{employees-BQaJNp-u.js → employees-CsvI0_5V.js} +1 -1
  157. package/public/dist/assets/error-normalize-clOi-AAA.js +1 -0
  158. package/public/dist/assets/fields-CicOWY-X.js +1 -0
  159. package/public/dist/assets/iframe-renderer-DWx9v2Iz.js +1 -0
  160. package/public/dist/assets/iframe-renderer-DmHYOI1A.js +142 -0
  161. package/public/dist/assets/{react-C_pPTFsM.js → jsx-runtime-CkEUZM6i.js} +1 -1
  162. package/public/dist/assets/manager-CCXm5Yfe.js +5 -0
  163. package/public/dist/assets/manager-D9rhKFKc.css +1 -0
  164. package/public/dist/assets/manager-shortcuts-Cqmr0mEq.js +1 -0
  165. package/public/dist/assets/{memory-EG1B51up.js → memory-C6qtAMdJ.js} +1 -1
  166. package/public/dist/assets/memory-PPofQPeB.js +1 -0
  167. package/public/dist/assets/message-history-DcjBuubA.js +4 -0
  168. package/public/dist/assets/message-history-bw4qF01Z.js +1 -0
  169. package/public/dist/assets/page-shell-DfinU3mb.js +1 -0
  170. package/public/dist/assets/react-dom-URBLzV3w.js +1 -0
  171. package/public/dist/assets/{render-Dp07lZAJ.js → render-DfYro-fG.js} +1 -1
  172. package/public/dist/assets/{settings-jlI4X-zt.js → settings-CvsLWlJn.js} +38 -30
  173. package/public/dist/assets/settings-DMiQe469.js +1 -0
  174. package/public/dist/assets/settings-DgAlohx9.js +1 -0
  175. package/public/dist/assets/settings-core-BH7J_Rbm.js +1 -0
  176. package/public/dist/assets/{settings-core-B5Uf_lWY.js → settings-core-pnpw-eZv.js} +1 -1
  177. package/public/dist/assets/{settings-embedding-BfWzWKMM.js → settings-embedding-BRW0WZvh.js} +3 -3
  178. package/public/dist/assets/{settings-embedding-DhEdT86W.css → settings-embedding-CUQ8Is3y.css} +1 -1
  179. package/public/dist/assets/settings-types-CYKy0xz4.js +1 -0
  180. package/public/dist/assets/shared-D1begqvi.js +1 -0
  181. package/public/dist/assets/{sidebar-BUemG2ZN.js → sidebar-C_80w4iY.js} +3 -3
  182. package/public/dist/assets/{skills-CKUcEN9m.js → skills-D_2adqge.js} +1 -1
  183. package/public/dist/assets/skills-DeNVAVgt.js +1 -0
  184. package/public/dist/assets/{slash-commands-D34GgHFX.js → slash-commands-B_Hq5RkC.js} +2 -2
  185. package/public/dist/assets/slash-commands-Cj5qoRWc.js +1 -0
  186. package/public/dist/assets/tool-input-DI7uu8Ah.js +2 -0
  187. package/public/dist/assets/{trace-drawer-DBmK-5F_.js → trace-drawer-B6XuPodh.js} +1 -1
  188. package/public/dist/assets/ui-BbR_fFiK.js +1 -0
  189. package/public/dist/assets/{ui-vm2iuLcS.js → ui-D8xzm7DN.js} +1 -1
  190. package/public/dist/index.html +11 -3
  191. package/public/dist/manager/index.html +3 -3
  192. package/public/dist/settings/index.html +2 -2
  193. package/public/index.html +9 -1
  194. package/public/js/features/activity-history.ts +50 -21
  195. package/public/js/features/activity-rows.ts +158 -10
  196. package/public/js/features/activity-view.ts +5 -5
  197. package/public/js/features/chat.ts +2 -0
  198. package/public/js/features/employees.ts +1 -0
  199. package/public/js/features/resize-guard.ts +39 -0
  200. package/public/js/features/settings-cli-status.ts +49 -17
  201. package/public/js/features/settings-types.ts +39 -1
  202. package/public/js/features/skill-mentions.ts +143 -0
  203. package/public/js/main.ts +15 -0
  204. package/public/js/virtual-scroll.ts +67 -1
  205. package/public/locales/en.json +2 -0
  206. package/public/locales/ja.json +2 -0
  207. package/public/locales/ko.json +2 -0
  208. package/public/locales/zh.json +2 -0
  209. package/public/manager/src/AppChrome.tsx +2 -0
  210. package/public/manager/src/InstancePreview.tsx +1 -1
  211. package/public/manager/src/SidebarRailRouter.tsx +3 -1
  212. package/public/manager/src/browser-panel/BrowserPanel.tsx +47 -12
  213. package/public/manager/src/browser-panel/browser-address-state.ts +11 -0
  214. package/public/manager/src/client-platform.ts +18 -0
  215. package/public/manager/src/code/CodeCanvas.tsx +4 -2
  216. package/public/manager/src/code/CodeComposer.tsx +22 -10
  217. package/public/manager/src/code/CodeDraftEmptyState.tsx +64 -0
  218. package/public/manager/src/code/CodeSessionList.tsx +154 -40
  219. package/public/manager/src/code/CodeTranscript.tsx +104 -16
  220. package/public/manager/src/code/CodeWorkbench.tsx +21 -11
  221. package/public/manager/src/code/CodeWorkspaceHeader.tsx +5 -10
  222. package/public/manager/src/code/ComposerFooter.tsx +9 -1
  223. package/public/manager/src/code/code-composer.css +1 -1
  224. package/public/manager/src/code/code-controller-draft-storage.ts +16 -8
  225. package/public/manager/src/code/code-controller-drafts.ts +33 -6
  226. package/public/manager/src/code/code-controller-runtime.ts +189 -17
  227. package/public/manager/src/code/code-controller-types.ts +19 -1
  228. package/public/manager/src/code/code-recent-workspaces.ts +25 -0
  229. package/public/manager/src/code/code-session-client.ts +19 -1
  230. package/public/manager/src/code/code-session-sidebar.css +38 -0
  231. package/public/manager/src/code/code-session-state.ts +2 -0
  232. package/public/manager/src/code/code-types.ts +47 -0
  233. package/public/manager/src/code/code-workbench.css +36 -1
  234. package/public/manager/src/code/code.css +171 -7
  235. package/public/manager/src/code/session-order.ts +80 -0
  236. package/public/manager/src/code/tool-summary.ts +45 -11
  237. package/public/manager/src/folder-panel/folder-shortcuts.ts +5 -9
  238. package/public/manager/src/hooks/useCommandPalette.ts +3 -7
  239. package/public/manager/src/main.tsx +1 -0
  240. package/public/manager/src/manager-components.css +25 -23
  241. package/public/manager/src/manager-dashboard-reminders.css +2 -2
  242. package/public/manager/src/manager-layout.css +1 -1
  243. package/public/manager/src/manager-shortcut-runner.ts +9 -2
  244. package/public/manager/src/manager-shortcuts.ts +83 -21
  245. package/public/manager/src/panels/desktop-bridge.ts +4 -1
  246. package/public/manager/src/panels/panels.css +9 -0
  247. package/public/manager/src/preview.ts +19 -4
  248. package/public/manager/src/settings/pages/AdvancedExport.tsx +28 -30
  249. package/public/manager/src/settings/pages/Browser.tsx +45 -47
  250. package/public/manager/src/settings/pages/ChannelsDiscord.tsx +51 -26
  251. package/public/manager/src/settings/pages/ChannelsSlack.tsx +59 -17
  252. package/public/manager/src/settings/pages/ChannelsTelegram.tsx +51 -26
  253. package/public/manager/src/settings/pages/Display.tsx +2 -1
  254. package/public/manager/src/settings/pages/Employees.tsx +3 -3
  255. package/public/manager/src/settings/pages/Mcp.tsx +220 -200
  256. package/public/manager/src/settings/pages/Memory.tsx +35 -41
  257. package/public/manager/src/settings/pages/ModelProvider.tsx +23 -98
  258. package/public/manager/src/settings/pages/Network.tsx +5 -4
  259. package/public/manager/src/settings/pages/Permissions.tsx +38 -16
  260. package/public/manager/src/settings/pages/Prompts.tsx +12 -9
  261. package/public/manager/src/settings/pages/SpeechKeys.tsx +132 -139
  262. package/public/manager/src/settings/pages/TelegramHub.tsx +67 -20
  263. package/public/manager/src/settings/pages/components/AvatarCard.tsx +9 -8
  264. package/public/manager/src/settings/pages/components/ChannelSetupEntry.tsx +2 -2
  265. package/public/manager/src/settings/pages/components/EmployeeRow.tsx +6 -12
  266. package/public/manager/src/settings/pages/components/HealthBadge.tsx +11 -6
  267. package/public/manager/src/settings/pages/components/HeartbeatJobRow.tsx +35 -16
  268. package/public/manager/src/settings/pages/components/HeartbeatJobsSection.tsx +11 -11
  269. package/public/manager/src/settings/pages/components/HeartbeatMarkdownSection.tsx +7 -7
  270. package/public/manager/src/settings/pages/components/InlineWarn.tsx +4 -9
  271. package/public/manager/src/settings/pages/components/McpServerCard.tsx +39 -27
  272. package/public/manager/src/settings/pages/components/MemoryRow.tsx +21 -16
  273. package/public/manager/src/settings/pages/components/PerCliRow.tsx +122 -121
  274. package/public/manager/src/settings/pages/components/PiProfileDialog.tsx +9 -6
  275. package/public/manager/src/settings/pages/components/SlackSetup.tsx +8 -8
  276. package/public/manager/src/settings/pages/components/TransportStatusChips.tsx +14 -10
  277. package/public/manager/src/settings/pages/components/agent/AgentEmployeesSection.tsx +26 -26
  278. package/public/manager/src/settings/pages/components/agent/PermissionQuickSection.tsx +5 -5
  279. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +14 -11
  280. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +1 -3
  281. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +0 -2
  282. package/public/manager/src/settings/pages/components/runtime-transport-field.tsx +2 -2
  283. package/public/manager/src/settings/pages/manager/Activity.tsx +6 -2
  284. package/public/manager/src/settings/pages/manager/Display.tsx +3 -8
  285. package/public/manager/src/settings/pages/manager/shared.tsx +44 -33
  286. package/public/manager/src/settings/pages/page-shell.tsx +66 -0
  287. package/public/manager/src/settings-agent.css +185 -36
  288. package/public/manager/src/settings-standalone.tsx +1 -0
  289. package/public/manager/src/settings-surface.css +96 -0
  290. package/public/manager/src/types.ts +1 -0
  291. package/scripts/ci/install-ripgrep.sh +35 -0
  292. package/scripts/collect-fresh-install-evidence.sh +2 -2
  293. package/scripts/install-risk-gate.mjs +2 -3
  294. package/scripts/install-wsl.sh +1 -1
  295. package/scripts/install.ps1 +1 -1
  296. package/scripts/install.sh +1 -1
  297. package/scripts/release-1.6.0.sh +1 -1
  298. package/scripts/release-gates.mjs +48 -13
  299. package/scripts/release-preview.sh +2 -2
  300. package/scripts/restack-pr.sh +88 -0
  301. package/scripts/verify-electron-update-metadata.mjs +1 -1
  302. package/scripts/windows-support-contract.json +1 -1
  303. package/public/dist/assets/Activity-BUrp73Re.js +0 -1
  304. package/public/dist/assets/AdvancedExport-B7h_ZvBu.js +0 -1
  305. package/public/dist/assets/Agent-DnbZJP7b.js +0 -1
  306. package/public/dist/assets/Browser-CiBoK5Qx.js +0 -1
  307. package/public/dist/assets/BrowserPanel-SZAUc9T2.js +0 -3
  308. package/public/dist/assets/ChannelEnablementControl-Dl0uYx38.js +0 -85
  309. package/public/dist/assets/ChannelSetupEntry-DxtOrN01.js +0 -1
  310. package/public/dist/assets/ChannelsDiscord-BEGGwd_3.js +0 -1
  311. package/public/dist/assets/ChannelsSlack-BryC2Ahr.js +0 -1
  312. package/public/dist/assets/ChannelsTelegram-CGSpaImJ.js +0 -1
  313. package/public/dist/assets/CodeCanvas-DpkFi5Au.js +0 -2
  314. package/public/dist/assets/DashboardMeta-Dh-tasbY.js +0 -1
  315. package/public/dist/assets/DesignPanel-NLNK9wCo.js +0 -2
  316. package/public/dist/assets/Display-BHGFX3O0.js +0 -1
  317. package/public/dist/assets/Display-BW-_pKRf.js +0 -1
  318. package/public/dist/assets/DocPanel-BM41cYpS.js +0 -1
  319. package/public/dist/assets/Employees-BuFw6-fT.js +0 -1
  320. package/public/dist/assets/FolderPanel-C-eQT3Yq.js +0 -3
  321. package/public/dist/assets/Heartbeat-CIVtKWNc.js +0 -1
  322. package/public/dist/assets/InlineWarn-DIMbcbzk.js +0 -1
  323. package/public/dist/assets/MarkdownRenderer-DyVx6DxM.js +0 -1
  324. package/public/dist/assets/Mcp-uKjor7vh.js +0 -4
  325. package/public/dist/assets/Memory-BSDIXT0B.js +0 -1
  326. package/public/dist/assets/ModelProvider-DMh2tXUx.js +0 -1
  327. package/public/dist/assets/Network-4Pa6JkhK.js +0 -1
  328. package/public/dist/assets/NotesGraphWorkspace-CgdC-fM6.js +0 -1
  329. package/public/dist/assets/PanelLayoutProvider-mn8sI0h-.js +0 -1
  330. package/public/dist/assets/Permissions-CodIW-Yd.js +0 -1
  331. package/public/dist/assets/Profile-DPqrYA44.js +0 -1
  332. package/public/dist/assets/Prompts-CvAx7QqR.js +0 -1
  333. package/public/dist/assets/SpeechKeys-CVBCqoBn.js +0 -1
  334. package/public/dist/assets/TelegramHub-4zKwpk0P.js +0 -1
  335. package/public/dist/assets/app-ByMfeXp-.js +0 -55
  336. package/public/dist/assets/app-DAJWqs33.css +0 -1
  337. package/public/dist/assets/bgtask-badge-Ch88fnhf.js +0 -1
  338. package/public/dist/assets/error-normalize-CL69Bl7z.js +0 -1
  339. package/public/dist/assets/fields-mlGpofqQ.js +0 -1
  340. package/public/dist/assets/iframe-renderer-Bj1JolO8.js +0 -142
  341. package/public/dist/assets/iframe-renderer-DWnvUSrx.js +0 -1
  342. package/public/dist/assets/jsx-runtime-NZYk81nU.js +0 -1
  343. package/public/dist/assets/manager-Bi_xw7TW.js +0 -5
  344. package/public/dist/assets/manager-BnQHAKk6.css +0 -1
  345. package/public/dist/assets/manager-shortcuts-BDOzd8zm.js +0 -1
  346. package/public/dist/assets/memory-Bk_cb3sw.js +0 -1
  347. package/public/dist/assets/message-history-D2vniu04.js +0 -4
  348. package/public/dist/assets/message-history-GAtF_wbZ.js +0 -1
  349. package/public/dist/assets/page-shell-BeGD0rRQ.js +0 -1
  350. package/public/dist/assets/react-dom-DyUOYpVL.js +0 -1
  351. package/public/dist/assets/settings-W4KG9ivu.js +0 -1
  352. package/public/dist/assets/settings-WVGhtneN.js +0 -1
  353. package/public/dist/assets/settings-client-CmwRsVd1.js +0 -1
  354. package/public/dist/assets/settings-core-CgKGnMA5.js +0 -1
  355. package/public/dist/assets/settings-types-D3cd6SWy.js +0 -1
  356. package/public/dist/assets/shared-CiNP20HB.js +0 -1
  357. package/public/dist/assets/skills-Co7Mr-qP.js +0 -1
  358. package/public/dist/assets/slash-commands-BEr-vmIr.js +0 -1
  359. package/public/dist/assets/ui-TUyJsMUf.js +0 -1
  360. package/public/manager/src/settings/pages/components/EngineSubsection.tsx +0 -25
@@ -5,10 +5,13 @@ import {
5
5
  PageError,
6
6
  PageLoading,
7
7
  PageOffline,
8
+ SettingsActions,
9
+ SettingsNote,
8
10
  SettingsSection,
11
+ SettingsToolbar,
12
+ StatusBadge,
9
13
  usePageSnapshot,
10
14
  } from './page-shell';
11
- import { InlineWarn } from './components/InlineWarn';
12
15
  import { McpServerCard } from './components/McpServerCard';
13
16
  import {
14
17
  countInstallBundleCandidates,
@@ -337,46 +340,44 @@ export default function Mcp({ port, client, dirty, registerSave }: SettingsPageP
337
340
  title="MCP servers"
338
341
  hint="Edit each server's command/args/env. Save writes back to mcp.json; Sync pushes the saved config to all CLIs."
339
342
  >
340
- <div className="mcp-servers-list">
341
- {order.length === 0 && (
342
- <p className="settings-section-hint">
343
- No servers configured. Add one or run <code>Reset to defaults</code>.
344
- </p>
345
- )}
346
- {order.map((name) => {
347
- const srv = draft.servers[name] ?? makeEmptyServer();
348
- const lower = name.toLowerCase();
349
- const isDupe = duplicates.has(lower);
350
- const validation = validateServer(name, srv);
351
- const error = isDupe
352
- ? 'Duplicate server name (case-insensitive).'
353
- : validation.kind === 'invalid'
354
- ? validation.reason
355
- : null;
356
- return (
357
- <McpServerCard
358
- key={name}
359
- name={name}
360
- server={srv}
361
- onRename={(next) => onRenameServer(name, next)}
362
- onChange={(next) => onChangeServer(name, next)}
363
- onRemove={() => onRemoveServer(name)}
364
- nameError={error}
365
- />
366
- );
367
- })}
368
- </div>
343
+ {order.length === 0 && (
344
+ <SettingsNote>
345
+ No servers configured. Add one or run <code>Reset to defaults</code>.
346
+ </SettingsNote>
347
+ )}
348
+ {order.map((name) => {
349
+ const srv = draft.servers[name] ?? makeEmptyServer();
350
+ const lower = name.toLowerCase();
351
+ const isDupe = duplicates.has(lower);
352
+ const validation = validateServer(name, srv);
353
+ const error = isDupe
354
+ ? 'Duplicate server name (case-insensitive).'
355
+ : validation.kind === 'invalid'
356
+ ? validation.reason
357
+ : null;
358
+ return (
359
+ <McpServerCard
360
+ key={name}
361
+ name={name}
362
+ server={srv}
363
+ onRename={(next) => onRenameServer(name, next)}
364
+ onChange={(next) => onChangeServer(name, next)}
365
+ onRemove={() => onRemoveServer(name)}
366
+ nameError={error}
367
+ />
368
+ );
369
+ })}
369
370
  {hasDupes && (
370
- <InlineWarn role="alert">
371
+ <SettingsNote tone="error" role="alert">
371
372
  Duplicate server name{dupeNames.length === 1 ? '' : 's'}: {dupeNames.join(', ')}.
372
373
  Saving is blocked until names are unique.
373
- </InlineWarn>
374
+ </SettingsNote>
374
375
  )}
375
376
  {hasFieldErrors && !hasDupes && (
376
- <InlineWarn role="alert">
377
+ <SettingsNote tone="error" role="alert">
377
378
  Some servers have errors (missing command/URL or invalid name).
378
379
  Saving is blocked until they are fixed.
379
- </InlineWarn>
380
+ </SettingsNote>
380
381
  )}
381
382
  </SettingsSection>
382
383
 
@@ -384,7 +385,15 @@ export default function Mcp({ port, client, dirty, registerSave }: SettingsPageP
384
385
  title="Actions"
385
386
  hint="These act on the saved config. Save edits first if you want them included."
386
387
  >
387
- <div className="mcp-action-buttons">
388
+ <SettingsActions
389
+ status={
390
+ actionState.kind === 'pending' ? (
391
+ <span role="status">{actionState.label}…</span>
392
+ ) : actionState.kind === 'success' ? (
393
+ <span role="status">{actionState.message}</span>
394
+ ) : undefined
395
+ }
396
+ >
388
397
  <button
389
398
  type="button"
390
399
  className="settings-action"
@@ -410,7 +419,7 @@ export default function Mcp({ port, client, dirty, registerSave }: SettingsPageP
410
419
  </button>
411
420
  <button
412
421
  type="button"
413
- className="settings-action settings-action-discard"
422
+ className="settings-action settings-action-danger"
414
423
  disabled={actionState.kind === 'pending'}
415
424
  onClick={() => {
416
425
  if (
@@ -424,15 +433,9 @@ export default function Mcp({ port, client, dirty, registerSave }: SettingsPageP
424
433
  >
425
434
  Reset to defaults
426
435
  </button>
427
- </div>
428
- {actionState.kind === 'pending' && (
429
- <p className="settings-section-hint" role="status">{actionState.label}…</p>
430
- )}
431
- {actionState.kind === 'success' && (
432
- <p className="settings-section-hint" role="status">{actionState.message}</p>
433
- )}
436
+ </SettingsActions>
434
437
  {actionState.kind === 'error' && (
435
- <InlineWarn role="alert">{actionState.message}</InlineWarn>
438
+ <SettingsNote tone="error" role="alert">{actionState.message}</SettingsNote>
436
439
  )}
437
440
  </SettingsSection>
438
441
 
@@ -458,183 +461,200 @@ export default function Mcp({ port, client, dirty, registerSave }: SettingsPageP
458
461
  />
459
462
  )}
460
463
  {!isValid && (
461
- <p className="settings-section-hint">
464
+ <SettingsNote>
462
465
  Save is disabled while validation errors are present.
463
- </p>
466
+ </SettingsNote>
464
467
  )}
465
468
  </SettingsSection>
466
469
 
467
470
  {modalOpen && (
468
- <div className="mcp-modal-backdrop" onClick={closeModal}>
471
+ <div
472
+ className="settings-memory-modal settings-pi-modal"
473
+ role="dialog"
474
+ aria-modal="true"
475
+ aria-label="MCP Server Management"
476
+ onClick={closeModal}
477
+ >
469
478
  <div
470
- className="mcp-modal"
471
- role="dialog"
472
- aria-modal="true"
473
- aria-label="MCP Server Management"
479
+ className="settings-memory-modal-card"
474
480
  onClick={(e) => e.stopPropagation()}
475
481
  >
476
- <div className="mcp-modal-tabs">
482
+ <header className="settings-memory-modal-header">
483
+ <h3>MCP servers</h3>
477
484
  <button
478
485
  type="button"
479
- className={`mcp-modal-tab${modalTab === 'active' ? ' is-active' : ''}`}
486
+ className="settings-action"
487
+ onClick={closeModal}
488
+ >
489
+ Close
490
+ </button>
491
+ </header>
492
+
493
+ <SettingsToolbar>
494
+ <button
495
+ type="button"
496
+ aria-pressed={modalTab === 'active'}
497
+ className="settings-action"
480
498
  onClick={() => setModalTab('active')}
481
499
  >
482
500
  Active Servers
483
501
  </button>
484
502
  <button
485
503
  type="button"
486
- className={`mcp-modal-tab${modalTab === 'add' ? ' is-active' : ''}`}
504
+ aria-pressed={modalTab === 'add'}
505
+ className="settings-action"
487
506
  onClick={() => { setModalTab('add'); resetAddForm(); }}
488
507
  >
489
508
  Add New
490
509
  </button>
491
- </div>
492
-
493
- <div className="mcp-modal-body">
494
- {modalTab === 'active' && (
495
- <div className="mcp-active-list">
496
- {Object.keys(original.servers).length === 0 && (
497
- <p className="settings-section-hint">No active MCP servers.</p>
498
- )}
499
- {Object.entries(original.servers).map(([name, srv]) => {
500
- const tag = getServerTag(srv);
501
- return (
502
- <div key={name} className="mcp-active-row">
503
- <span className="mcp-active-name">{name}</span>
504
- <span className="mcp-active-detail">
505
- {srv.url || [srv.command, ...(srv.args || [])].filter(Boolean).join(' ')}
506
- </span>
507
- {tag && <span className="mcp-server-tag" data-tag={tag}>[{tag}]</span>}
508
- <button
509
- type="button"
510
- className="settings-action settings-action-discard mcp-active-remove"
511
- onClick={() => void handleRemoveFromModal(name)}
512
- >
513
- Remove
514
- </button>
515
- </div>
516
- );
517
- })}
518
- </div>
519
- )}
520
-
521
- {modalTab === 'add' && (
522
- <div className="mcp-add-form">
523
- <div className="mcp-add-subtabs">
524
- <button
525
- type="button"
526
- className={`mcp-modal-tab${addSubTab === 'local' ? ' is-active' : ''}`}
527
- onClick={() => setAddSubTab('local')}
528
- >
529
- Local
530
- </button>
531
- <button
532
- type="button"
533
- className={`mcp-modal-tab${addSubTab === 'remote' ? ' is-active' : ''}`}
534
- onClick={() => setAddSubTab('remote')}
535
- >
536
- Remote
537
- </button>
538
- </div>
539
-
540
- <label className="settings-field settings-field-text">
541
- <span className="settings-field-label">Name</span>
542
- <input
543
- type="text"
544
- value={addName}
545
- placeholder="my-server"
546
- spellCheck={false}
547
- onChange={(e) => setAddName(e.target.value)}
548
- />
549
- </label>
550
-
551
- {addSubTab === 'local' ? (
552
- <>
553
- <label className="settings-field settings-field-text">
554
- <span className="settings-field-label">Command</span>
555
- <input
556
- type="text"
557
- value={addCommand}
558
- placeholder="npx"
559
- spellCheck={false}
560
- onChange={(e) => setAddCommand(e.target.value)}
561
- />
562
- </label>
563
- <label className="settings-field settings-field-text">
564
- <span className="settings-field-label">Args (one per line)</span>
565
- <textarea
566
- value={addArgs}
567
- rows={3}
568
- spellCheck={false}
569
- placeholder="-y&#10;@upstash/context7-mcp"
570
- onChange={(e) => setAddArgs(e.target.value)}
571
- />
572
- </label>
573
- <label className="settings-field settings-field-text">
574
- <span className="settings-field-label">Env (KEY=value per line)</span>
575
- <textarea
576
- value={addEnv}
577
- rows={2}
578
- spellCheck={false}
579
- onChange={(e) => setAddEnv(e.target.value)}
580
- />
581
- </label>
582
- </>
583
- ) : (
584
- <>
585
- <label className="settings-field settings-field-text">
586
- <span className="settings-field-label">URL</span>
587
- <input
588
- type="text"
589
- value={addUrl}
590
- placeholder="https://mcp.example.com/sse"
591
- spellCheck={false}
592
- onChange={(e) => setAddUrl(e.target.value)}
593
- />
594
- </label>
595
- <label className="settings-field settings-field-text">
596
- <span className="settings-field-label">Headers (KEY=value per line)</span>
597
- <textarea
598
- value={addHeaders}
599
- rows={2}
600
- spellCheck={false}
601
- onChange={(e) => setAddHeaders(e.target.value)}
602
- />
603
- </label>
604
- </>
605
- )}
606
-
607
- {addError && <InlineWarn role="alert">{addError}</InlineWarn>}
608
-
609
- <div className="mcp-add-actions">
610
- <button
611
- type="button"
612
- className="settings-action"
613
- onClick={closeModal}
614
- >
615
- Cancel
616
- </button>
617
- <button
618
- type="button"
619
- className="settings-action"
620
- disabled={addPending}
621
- onClick={() => void handleAddAndSync()}
510
+ </SettingsToolbar>
511
+
512
+ {modalTab === 'active' && (
513
+ <>
514
+ {Object.keys(original.servers).length === 0 && (
515
+ <SettingsNote>No active MCP servers.</SettingsNote>
516
+ )}
517
+ {Object.entries(original.servers).map(([name, srv]) => {
518
+ const tag = getServerTag(srv);
519
+ return (
520
+ <SettingsActions
521
+ key={name}
522
+ status={
523
+ <>
524
+ <strong>{name}</strong>{' '}
525
+ <code>
526
+ {srv.url || [srv.command, ...(srv.args || [])].filter(Boolean).join(' ')}
527
+ </code>{' '}
528
+ {tag ? <StatusBadge tone="neutral">{tag}</StatusBadge> : null}
529
+ </>
530
+ }
622
531
  >
623
- {addPending ? 'Adding…' : 'Add & Sync'}
624
- </button>
625
- </div>
626
- </div>
627
- )}
628
- </div>
629
-
630
- <button
631
- type="button"
632
- className="mcp-modal-close"
633
- aria-label="Close"
634
- onClick={closeModal}
635
- >
636
- &times;
637
- </button>
532
+ <button
533
+ type="button"
534
+ className="settings-action settings-action-danger"
535
+ onClick={() => void handleRemoveFromModal(name)}
536
+ >
537
+ Remove
538
+ </button>
539
+ </SettingsActions>
540
+ );
541
+ })}
542
+ </>
543
+ )}
544
+
545
+ {modalTab === 'add' && (
546
+ <>
547
+ <SettingsToolbar>
548
+ <button
549
+ type="button"
550
+ role="tab"
551
+ aria-selected={addSubTab === 'local'}
552
+ className={`settings-action${addSubTab === 'local' ? ' settings-action-save' : ''}`}
553
+ onClick={() => setAddSubTab('local')}
554
+ >
555
+ Local
556
+ </button>
557
+ <button
558
+ type="button"
559
+ role="tab"
560
+ aria-selected={addSubTab === 'remote'}
561
+ className={`settings-action${addSubTab === 'remote' ? ' settings-action-save' : ''}`}
562
+ onClick={() => setAddSubTab('remote')}
563
+ >
564
+ Remote
565
+ </button>
566
+ </SettingsToolbar>
567
+
568
+ <label className="settings-field settings-field-text">
569
+ <span className="settings-field-label">Name</span>
570
+ <input
571
+ type="text"
572
+ value={addName}
573
+ placeholder="my-server"
574
+ spellCheck={false}
575
+ onChange={(e) => setAddName(e.target.value)}
576
+ />
577
+ </label>
578
+
579
+ {addSubTab === 'local' ? (
580
+ <>
581
+ <label className="settings-field settings-field-text">
582
+ <span className="settings-field-label">Command</span>
583
+ <input
584
+ type="text"
585
+ value={addCommand}
586
+ placeholder="npx"
587
+ spellCheck={false}
588
+ onChange={(e) => setAddCommand(e.target.value)}
589
+ />
590
+ </label>
591
+ <label className="settings-field settings-field-text">
592
+ <span className="settings-field-label">Args (one per line)</span>
593
+ <textarea
594
+ value={addArgs}
595
+ rows={3}
596
+ spellCheck={false}
597
+ placeholder="-y&#10;@upstash/context7-mcp"
598
+ onChange={(e) => setAddArgs(e.target.value)}
599
+ />
600
+ </label>
601
+ <label className="settings-field settings-field-text">
602
+ <span className="settings-field-label">Env (KEY=value per line)</span>
603
+ <textarea
604
+ value={addEnv}
605
+ rows={2}
606
+ spellCheck={false}
607
+ onChange={(e) => setAddEnv(e.target.value)}
608
+ />
609
+ </label>
610
+ </>
611
+ ) : (
612
+ <>
613
+ <label className="settings-field settings-field-text">
614
+ <span className="settings-field-label">URL</span>
615
+ <input
616
+ type="text"
617
+ value={addUrl}
618
+ placeholder="https://mcp.example.com/sse"
619
+ spellCheck={false}
620
+ onChange={(e) => setAddUrl(e.target.value)}
621
+ />
622
+ </label>
623
+ <label className="settings-field settings-field-text">
624
+ <span className="settings-field-label">Headers (KEY=value per line)</span>
625
+ <textarea
626
+ value={addHeaders}
627
+ rows={2}
628
+ spellCheck={false}
629
+ onChange={(e) => setAddHeaders(e.target.value)}
630
+ />
631
+ </label>
632
+ </>
633
+ )}
634
+
635
+ {addError && (
636
+ <SettingsNote tone="error" role="alert">{addError}</SettingsNote>
637
+ )}
638
+
639
+ <SettingsActions>
640
+ <button
641
+ type="button"
642
+ className="settings-action"
643
+ onClick={closeModal}
644
+ >
645
+ Cancel
646
+ </button>
647
+ <button
648
+ type="button"
649
+ className="settings-action settings-action-save"
650
+ disabled={addPending}
651
+ onClick={() => void handleAddAndSync()}
652
+ >
653
+ {addPending ? 'Adding…' : 'Add & Sync'}
654
+ </button>
655
+ </SettingsActions>
656
+ </>
657
+ )}
638
658
  </div>
639
659
  </div>
640
660
  )}
@@ -16,6 +16,8 @@ import { useCallback, useEffect, useMemo, useState } from 'react';
16
16
  import type { SettingsPageProps, DirtyEntry } from '../types';
17
17
  import { NumberField, SelectField, ToggleField } from '../fields';
18
18
  import {
19
+ SettingsActions,
20
+ SettingsNote,
19
21
  SettingsSection,
20
22
  PageError,
21
23
  PageLoading,
@@ -335,55 +337,42 @@ export default function Memory({ port, client, dirty, registerSave }: SettingsPa
335
337
  hint={`Read-only browse of the key/value memory table (${MEMORY_PAGE_SIZE}/page).`}
336
338
  >
337
339
  {memorySnap.state.kind === 'loading' ? (
338
- <p className="settings-section-hint">Loading entries…</p>
340
+ <SettingsNote>Loading entries…</SettingsNote>
339
341
  ) : memorySnap.state.kind === 'offline' ? (
340
342
  <PageOffline port={port} />
341
343
  ) : memorySnap.state.kind === 'error' ? (
342
344
  <PageError message={memorySnap.state.message} />
343
345
  ) : allRows.length === 0 ? (
344
- <p className="settings-section-hint">No memory entries yet.</p>
346
+ <SettingsNote>No memory entries yet.</SettingsNote>
345
347
  ) : (
346
348
  <>
347
- <table className="settings-memory-table">
348
- <thead>
349
- <tr>
350
- <th scope="col">Key</th>
351
- <th scope="col">Source</th>
352
- <th scope="col">Length</th>
353
- <th scope="col">Preview</th>
354
- </tr>
355
- </thead>
356
- <tbody>
357
- {slice.map((row) => (
358
- <MemoryRow
359
- key={row.key}
360
- row={row}
361
- onOpen={setOpenEntry}
362
- />
363
- ))}
364
- </tbody>
365
- </table>
366
- <div className="settings-memory-pagination">
349
+ {slice.map((row) => (
350
+ <MemoryRow
351
+ key={row.key}
352
+ row={row}
353
+ onOpen={setOpenEntry}
354
+ />
355
+ ))}
356
+ <SettingsActions
357
+ status={<span>Page {page + 1} / {pageCount}</span>}
358
+ >
367
359
  <button
368
360
  type="button"
369
- className="settings-action settings-action-discard"
361
+ className="settings-action"
370
362
  disabled={page === 0}
371
363
  onClick={() => setPage((p) => Math.max(0, p - 1))}
372
364
  >
373
365
  Prev
374
366
  </button>
375
- <span className="settings-memory-pageinfo">
376
- Page {page + 1} / {pageCount}
377
- </span>
378
367
  <button
379
368
  type="button"
380
- className="settings-action settings-action-discard"
369
+ className="settings-action"
381
370
  disabled={!hasMore}
382
371
  onClick={() => setPage((p) => p + 1)}
383
372
  >
384
373
  Next
385
374
  </button>
386
- </div>
375
+ </SettingsActions>
387
376
  </>
388
377
  )}
389
378
  </SettingsSection>
@@ -392,7 +381,13 @@ export default function Memory({ port, client, dirty, registerSave }: SettingsPa
392
381
  title="Actions"
393
382
  hint="Flush runs async — the browse list refreshes when it finishes."
394
383
  >
395
- <div className="settings-memory-actions">
384
+ <SettingsActions
385
+ status={
386
+ actionState.notice ? (
387
+ <span role="status">{actionState.notice}</span>
388
+ ) : undefined
389
+ }
390
+ >
396
391
  <button
397
392
  type="button"
398
393
  className="settings-action settings-action-save"
@@ -411,28 +406,23 @@ export default function Memory({ port, client, dirty, registerSave }: SettingsPa
411
406
  </button>
412
407
  <button
413
408
  type="button"
414
- className="settings-action settings-action-discard"
409
+ className="settings-action"
415
410
  disabled={memorySnap.state.kind !== 'ready'}
416
411
  onClick={onExport}
417
412
  >
418
413
  Export memory
419
414
  </button>
420
- </div>
421
- {actionState.notice ? (
422
- <p className="settings-section-hint" role="status">
423
- {actionState.notice}
424
- </p>
425
- ) : null}
415
+ </SettingsActions>
426
416
  {actionState.error ? (
427
- <p className="settings-field-error" role="alert">
417
+ <SettingsNote tone="error" role="alert">
428
418
  {actionState.error}
429
- </p>
419
+ </SettingsNote>
430
420
  ) : null}
431
421
  </SettingsSection>
432
422
 
433
423
  {openEntry ? (
434
424
  <div
435
- className="settings-memory-modal"
425
+ className="settings-memory-modal settings-pi-modal"
436
426
  role="dialog"
437
427
  aria-modal="true"
438
428
  aria-label={`Memory entry ${openEntry.key}`}
@@ -445,14 +435,18 @@ export default function Memory({ port, client, dirty, registerSave }: SettingsPa
445
435
  <h3>{openEntry.key}</h3>
446
436
  <button
447
437
  type="button"
448
- className="settings-action settings-action-discard"
438
+ className="settings-action"
449
439
  onClick={() => setOpenEntry(null)}
450
440
  aria-label="Close memory entry"
451
441
  >
452
442
  Close
453
443
  </button>
454
444
  </header>
455
- <pre className="settings-memory-modal-body">{openEntry.value}</pre>
445
+ <pre
446
+ className="settings-memory-modal-body"
447
+ >
448
+ {openEntry.value}
449
+ </pre>
456
450
  </div>
457
451
  </div>
458
452
  ) : null}