@nextclaw/ui 0.26.0 → 0.26.2

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 (308) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/.vite/manifest.json +1143 -1133
  3. package/dist/assets/{abnfDiagram-VRR7QNED-Bjrmb5-o.js → abnfDiagram-VRR7QNED-Dcw10Yt1.js} +1 -1
  4. package/dist/assets/{account-panel-C1S3xtUB.js → account-panel-ZM2qzKF4.js} +1 -1
  5. package/dist/assets/{aiden0z-pptx-renderer.es-DO4DCX3e.js → aiden0z-pptx-renderer.es--oNqetPA.js} +1 -1
  6. package/dist/assets/api-Cjq-o1VN.js +20 -0
  7. package/dist/assets/app-presenter-provider-C02YPoMr.js +124 -0
  8. package/dist/assets/{appearance-settings-page-BljTr6nB.js → appearance-settings-page-B4zouKzg.js} +1 -1
  9. package/dist/assets/{arc-g4XaP3S4.js → arc-DBRedCax.js} +1 -1
  10. package/dist/assets/architecture-TIHT7OUA-CvnC-LeA.js +1 -0
  11. package/dist/assets/{architectureDiagram-ZJ3FMSHR-CAP7YDux.js → architectureDiagram-ZJ3FMSHR-Dufhtuv-.js} +1 -1
  12. package/dist/assets/{blockDiagram-677ZJIJ3-DhaP0zUG.js → blockDiagram-677ZJIJ3-BUk0vtJ7.js} +1 -1
  13. package/dist/assets/{book-open-vxpV2eSM.js → book-open-AteA89HX.js} +1 -1
  14. package/dist/assets/{c4Diagram-LMCZKHZV-DHCQJJkD.js → c4Diagram-LMCZKHZV-CxDcVE9p.js} +1 -1
  15. package/dist/assets/{card-D9NYhSdf.js → card-BLXvBstA.js} +1 -1
  16. package/dist/assets/channel-CpMstUPF.js +1 -0
  17. package/dist/assets/{channels-list-page-BiHA1zZd.js → channels-list-page-fj8kMo-T.js} +1 -1
  18. package/dist/assets/chunk-2Q5K7J3B-Djp3VF0s.js +1 -0
  19. package/dist/assets/{chunk-32BRIVSS-BcQlxl4v.js → chunk-32BRIVSS-DSF3KElA.js} +1 -1
  20. package/dist/assets/{chunk-52WLFC77-ClPpG-2S.js → chunk-52WLFC77-Costxzr3.js} +1 -1
  21. package/dist/assets/{chunk-5FCAYU7R-B_qmYOdX.js → chunk-5FCAYU7R-rhqzGGZo.js} +1 -1
  22. package/dist/assets/{chunk-5HE753X5-DTO-V56q.js → chunk-5HE753X5-BsEsmIao.js} +1 -1
  23. package/dist/assets/{chunk-5JV3BV7I-CU1SOaaG.js → chunk-5JV3BV7I-Dqw_DCoN.js} +1 -1
  24. package/dist/assets/{chunk-5TONJI2A-CzSDkWNa.js → chunk-5TONJI2A-Cft82fp8.js} +1 -1
  25. package/dist/assets/{chunk-5VM5RSS4-ChkfqIRE.js → chunk-5VM5RSS4-DqNHn9Dl.js} +1 -1
  26. package/dist/assets/{chunk-7BUUIJ7U-Du3Ozi62.js → chunk-7BUUIJ7U-A5SBEMYY.js} +1 -1
  27. package/dist/assets/{chunk-BIQX33UG-C-HVafHB.js → chunk-BIQX33UG-1Ng3mTrH.js} +1 -1
  28. package/dist/assets/{chunk-C7G6YPKG-BSjZ86D0.js → chunk-C7G6YPKG-DRJEy8ZI.js} +1 -1
  29. package/dist/assets/{chunk-CQNSW5MT-1D1W2lF6.js → chunk-CQNSW5MT-Bydv_J3J.js} +1 -1
  30. package/dist/assets/{chunk-CYSBUYHQ-ISpyj_lK.js → chunk-CYSBUYHQ-HkMIg12u.js} +1 -1
  31. package/dist/assets/{chunk-EMLP6XTP-Cp8iUBt2.js → chunk-EMLP6XTP-C5ndDvm3.js} +1 -1
  32. package/dist/assets/{chunk-EX3LRPZG-BN5RzF5j.js → chunk-EX3LRPZG-DzeloZRo.js} +1 -1
  33. package/dist/assets/{chunk-FWX5IMBZ-DecJDW4r.js → chunk-FWX5IMBZ-n_2_CLTQ.js} +2 -2
  34. package/dist/assets/{chunk-HOUHSVGY-BE_XNgGk.js → chunk-HOUHSVGY-kx_slvu3.js} +1 -1
  35. package/dist/assets/{chunk-ICXQ74PX-BFOKMkWV.js → chunk-ICXQ74PX-sQLMURqL.js} +1 -1
  36. package/dist/assets/{chunk-JG7HCLWE-DL-pl8VB.js → chunk-JG7HCLWE-CMUn5Elc.js} +1 -1
  37. package/dist/assets/{chunk-JWPE2WC7-B-bcwfmh.js → chunk-JWPE2WC7-Cra3s-Uk.js} +1 -1
  38. package/dist/assets/{chunk-MOJQB5TN-BC0taFro.js → chunk-MOJQB5TN-umcrg5Bi.js} +1 -1
  39. package/dist/assets/{chunk-MOZMSUNE-RrhfU6MO.js → chunk-MOZMSUNE-BnljD1ig.js} +1 -1
  40. package/dist/assets/{chunk-OGEWGWER-TuI7SR7i.js → chunk-OGEWGWER-BXx5pQjU.js} +1 -1
  41. package/dist/assets/{chunk-OSBZ3O6U-C5jMBKlU.js → chunk-OSBZ3O6U-D-1qfdWu.js} +1 -1
  42. package/dist/assets/{chunk-PUDLZKDR-C5lMBn0K.js → chunk-PUDLZKDR-DLzX78LC.js} +1 -1
  43. package/dist/assets/{chunk-Q4XR5HBZ-B-kzUbwT.js → chunk-Q4XR5HBZ-DTK-rtW6.js} +1 -1
  44. package/dist/assets/{chunk-QBLGF6JB-CRb_WAEj.js → chunk-QBLGF6JB-CsFeIGfr.js} +1 -1
  45. package/dist/assets/{chunk-R7FJI6CG-De6Y7ozO.js → chunk-R7FJI6CG-4xNYUeng.js} +1 -1
  46. package/dist/assets/{chunk-RYQCIY6F-Igv92q8k.js → chunk-RYQCIY6F-DJiHiTE5.js} +1 -1
  47. package/dist/assets/{chunk-U6XO7XAA-bCjRshkT.js → chunk-U6XO7XAA-BVYkauHz.js} +1 -1
  48. package/dist/assets/{chunk-V7JOEXUC-0J1s_Kgq.js → chunk-V7JOEXUC-BsazE8cS.js} +1 -1
  49. package/dist/assets/chunk-VAUOI2AC-BrbiIC1Q.js +1 -0
  50. package/dist/assets/{chunk-VR4S4FIN-DX6lXnNx.js → chunk-VR4S4FIN-7RoZQffO.js} +1 -1
  51. package/dist/assets/{chunk-WYO6CB5R-DLqMXfFC.js → chunk-WYO6CB5R-DEuS6N1R.js} +1 -1
  52. package/dist/assets/chunk-XXDRQBXY-Cx9N40wF.js +1 -0
  53. package/dist/assets/{chunk-YOTPTUD7-CY4obsV0.js → chunk-YOTPTUD7-9KBrosZL.js} +1 -1
  54. package/dist/assets/{chunk-ZGVPDNZ5-BleImZKe.js → chunk-ZGVPDNZ5-IYgN9f5A.js} +1 -1
  55. package/dist/assets/{chunk-ZIRB5QZD-C1TfdjpX.js → chunk-ZIRB5QZD-BUo0-zcp.js} +1 -1
  56. package/dist/assets/{circle-dashed-CEEssYIw.js → circle-dashed-LSYZTzM7.js} +1 -1
  57. package/dist/assets/classDiagram-OUVF2IWQ-DFN1v3PQ.js +1 -0
  58. package/dist/assets/classDiagram-v2-EOCWNBFH-DRvglADa.js +1 -0
  59. package/dist/assets/{client-C6YQx7A-.js → client-DudCRJw4.js} +1 -1
  60. package/dist/assets/{config-split-page-DKPelvjR.js → config-split-page-G7Kt2BnV.js} +1 -1
  61. package/dist/assets/confirm-dialog-DShT64F6.js +1 -0
  62. package/dist/assets/context-menu-rd7b_kVD.js +1 -0
  63. package/dist/assets/{cose-bilkent-JH36ORCC-CVgUHXkj.js → cose-bilkent-JH36ORCC-DhqbC1fR.js} +1 -1
  64. package/dist/assets/{createLucideIcon-CF8U9dh7.js → createLucideIcon-D7hvIHV-.js} +1 -1
  65. package/dist/assets/cynefin-VYW2F7L2-DXUGnpJH.js +1 -0
  66. package/dist/assets/{cynefinDiagram-TSTJHNR4-cdfImbfI.js → cynefinDiagram-TSTJHNR4-C-TBRi5V.js} +1 -1
  67. package/dist/assets/{dagre-CHNN9L9I.js → dagre-CrgsRasE.js} +1 -1
  68. package/dist/assets/{dagre-VKFMJZFB-PscaENwr.js → dagre-VKFMJZFB-BmafJymp.js} +1 -1
  69. package/dist/assets/{desktop-capabilities-page-BENHdKfk.js → desktop-capabilities-page-CzqzFZUY.js} +1 -1
  70. package/dist/assets/desktop-update-config-CgeQ0Ffo.js +1 -0
  71. package/dist/assets/{diagram-FQU43EPY-CH_wye41.js → diagram-FQU43EPY-BoOMwa6D.js} +1 -1
  72. package/dist/assets/{diagram-G47NLZAW-Dtjpmi6D.js → diagram-G47NLZAW-Le7N6Uym.js} +1 -1
  73. package/dist/assets/{diagram-NH7WQ7WH-UdjLHyaz.js → diagram-NH7WQ7WH-Fbpj3-MO.js} +1 -1
  74. package/dist/assets/{diagram-OA4YK3LP-DYsToEaL.js → diagram-OA4YK3LP-D3QuGGuu.js} +1 -1
  75. package/dist/assets/{diagram-WEI45ONY-CA7kuIer.js → diagram-WEI45ONY-Cxu1uiN6.js} +1 -1
  76. package/dist/assets/dialog-C7glmAQJ.js +5 -0
  77. package/dist/assets/{doc-browser-context-CPLWVFLd.js → doc-browser-context-BlhBAOLH.js} +1 -1
  78. package/dist/assets/doc-browser-dBiR9Qi0.js +1 -0
  79. package/dist/assets/{docx-preview-D--EsUWi.js → docx-preview-CkU2psnd.js} +1 -1
  80. package/dist/assets/download-BYgECE0n.js +1 -0
  81. package/dist/assets/{ebnfDiagram-CCIWWBDH-BrjaoOuq.js → ebnfDiagram-CCIWWBDH-CCAjuQM6.js} +1 -1
  82. package/dist/assets/{erDiagram-Q63AITRT-nZQa2kCM.js → erDiagram-Q63AITRT-BuzUAq-d.js} +1 -1
  83. package/dist/assets/es2015-CsjAAQ6X.js +41 -0
  84. package/dist/assets/eventmodeling-45OFAUF4-ZBfVS3ZC.js +1 -0
  85. package/dist/assets/{extensions-CsWT7x3v.js → extensions-qYL-NpL3.js} +1 -1
  86. package/dist/assets/{eye-DJtw5KJ5.js → eye-BBuTzJ53.js} +1 -1
  87. package/dist/assets/flowDiagram-23GEKE2U-CqdsKk6x.js +1 -0
  88. package/dist/assets/{form-actions-DDQk0END.js → form-actions-CLGWO52v.js} +1 -1
  89. package/dist/assets/{ganttDiagram-NO4QXBWP-CyFZHIHN.js → ganttDiagram-NO4QXBWP-cJmWVY8F.js} +1 -1
  90. package/dist/assets/gitGraph-TEB2WS4Q-fHYFd9Es.js +1 -0
  91. package/dist/assets/{gitGraphDiagram-IHSO6WYX-Dfpq3z2M.js → gitGraphDiagram-IHSO6WYX-F58o-vtP.js} +1 -1
  92. package/dist/assets/{i18n-BjPkAKMQ.js → i18n-qBGEbcW6.js} +2 -2
  93. package/dist/assets/info-DKCQHKI2-CSaOL_bb.js +1 -0
  94. package/dist/assets/{infoDiagram-FWYZ7A6U-Diiz0k1E.js → infoDiagram-FWYZ7A6U-Gt59b83C.js} +1 -1
  95. package/dist/assets/{ishikawaDiagram-FXEZZL3T-B3R3SN4M.js → ishikawaDiagram-FXEZZL3T-1u4IAj1I.js} +1 -1
  96. package/dist/assets/{journeyDiagram-5HDEW3XC-DFOLKiNv.js → journeyDiagram-5HDEW3XC-CCQsfV-5.js} +1 -1
  97. package/dist/assets/{kanban-definition-HUTT4EX6-BMXpDp3g.js → kanban-definition-HUTT4EX6-vlB6O_Zn.js} +1 -1
  98. package/dist/assets/{keyboard-shortcuts-settings-page-hqTP7akj.js → keyboard-shortcuts-settings-page-B-wK_6zG.js} +1 -1
  99. package/dist/assets/{line-64_FhCoJ.js → line-D_bHubTL.js} +1 -1
  100. package/dist/assets/{linear-aF1fg7bK.js → linear-ChlwuS5y.js} +1 -1
  101. package/dist/assets/loader-circle-BA7EMkih.js +1 -0
  102. package/dist/assets/{login-page-BUwshAq4.js → login-page-Cd84lpVV.js} +1 -1
  103. package/dist/assets/login-page-VdMyNkFf.js +1 -0
  104. package/dist/assets/main-CR0SrTBf.js +2 -0
  105. package/dist/assets/main-DXH6EdXI.css +1 -0
  106. package/dist/assets/main-i18n-catalog.config-Btp_OowF.js +1 -0
  107. package/dist/assets/{map-BC3Amra3.js → map-oGHTsIu8.js} +1 -1
  108. package/dist/assets/mcp-marketplace-page-jacRwiI-.js +1 -0
  109. package/dist/assets/{mermaid-parser.core-DdMcZwnE.js → mermaid-parser.core-CuRe1ZG4.js} +2 -2
  110. package/dist/assets/{mermaid.core-BHdiEBbI.js → mermaid.core-u4YCFKRf.js} +3 -3
  111. package/dist/assets/{mindmap-definition-LN4V7U3C-CtHVaZyV.js → mindmap-definition-LN4V7U3C-DeJAQYTu.js} +1 -1
  112. package/dist/assets/{model-config-page-BSsHOhV7.js → model-config-page-D0DQlSDa.js} +1 -1
  113. package/dist/assets/{navigation-link-D-fxdv0i.js → navigation-link-32iM1-e6.js} +1 -1
  114. package/dist/assets/{ordinal-6b3jw4cz.js → ordinal-C6JFfkKN.js} +1 -1
  115. package/dist/assets/packet-7NZHBO7P-D-YFTczs.js +1 -0
  116. package/dist/assets/panel-app-CC0bVSu4.js +1 -0
  117. package/dist/assets/panel-app-i18n-catalog.config-LUSBp5Ce.js +1 -0
  118. package/dist/assets/{panelStandalone-BeI0Ndsx.js → panelStandalone-C9EKaApN.js} +2 -2
  119. package/dist/assets/{pegDiagram-2B236MQR-BtbG3Bgu.js → pegDiagram-2B236MQR-nVMkxShH.js} +1 -1
  120. package/dist/assets/pie-RZYD4A2V-VEnYu9s5.js +1 -0
  121. package/dist/assets/{pieDiagram-ENE6RG2P-FmLl2hzN.js → pieDiagram-ENE6RG2P-8aUH44QZ.js} +1 -1
  122. package/dist/assets/{privacy-settings-page-pW_1naDz.js → privacy-settings-page-Bxxx12OO.js} +1 -1
  123. package/dist/assets/projects-D56yAPNT.js +1 -0
  124. package/dist/assets/provider-models-C3frdXeW.js +1 -0
  125. package/dist/assets/{provider-scoped-model-input-CVbtT8L9.js → provider-scoped-model-input-CYetrPYZ.js} +1 -1
  126. package/dist/assets/providers-config-page-DESB1h8g.js +1 -0
  127. package/dist/assets/{puzzle-kKiVft9-.js → puzzle-CWHfFyYN.js} +1 -1
  128. package/dist/assets/pwa-CiGUjpcd.js +1 -0
  129. package/dist/assets/{quadrantDiagram-ABIIQ3AL-7-OzMNpF.js → quadrantDiagram-ABIIQ3AL-EY8hpFv8.js} +1 -1
  130. package/dist/assets/radar-I7S5WNFK-BFNIekC1.js +1 -0
  131. package/dist/assets/railroad-3IZDKUUU-lVqJ3Hak.js +1 -0
  132. package/dist/assets/railroad-abnf-AHOZXSZD-DYaefdFC.js +1 -0
  133. package/dist/assets/railroad-ebnf-EBAXGLYW-CTAk6lVq.js +1 -0
  134. package/dist/assets/railroad-peg-LSFZ7HO6-Cob294tg.js +1 -0
  135. package/dist/assets/{railroadDiagram-RFXS5EU6-B_UVtLJO.js → railroadDiagram-RFXS5EU6-CNhcIeji.js} +1 -1
  136. package/dist/assets/{refresh-cw-BeG0y6yZ.js → refresh-cw-y3L6PyLt.js} +1 -1
  137. package/dist/assets/remote-DiGFV8nP.js +1 -0
  138. package/dist/assets/{requirementDiagram-TGXJPOKE-D8TO2YeZ.js → requirementDiagram-TGXJPOKE-D8Dcs-Rt.js} +1 -1
  139. package/dist/assets/{rotate-cw-Ci2dcTO5.js → rotate-cw-CNE9qSHi.js} +1 -1
  140. package/dist/assets/{runtime-config-page-DCXN0nkS.js → runtime-config-page-5o98T-TD.js} +1 -1
  141. package/dist/assets/{sankeyDiagram-HTMAVEWB-CUzIcq0B.js → sankeyDiagram-HTMAVEWB-HTrb6aa-.js} +1 -1
  142. package/dist/assets/{save-Cr895abt.js → save-B0p5a0ET.js} +1 -1
  143. package/dist/assets/{search-config-page-CNQd481d.js → search-config-page-CpGcnIzi.js} +1 -1
  144. package/dist/assets/{secrets-config-page--q7M58L8.js → secrets-config-page-C4VTiW3r.js} +1 -1
  145. package/dist/assets/security-config-C5-RQVpS.js +1 -0
  146. package/dist/assets/select-CctTN205.js +1 -0
  147. package/dist/assets/{sequenceDiagram-DBY2YBRQ-kqJzXbwu.js → sequenceDiagram-DBY2YBRQ-6f_4X16Y.js} +1 -1
  148. package/dist/assets/service-apps-panel-CKE5HKNY.js +1 -0
  149. package/dist/assets/{settings-2-IodCcaXd.js → settings-2-EPflrNk6.js} +1 -1
  150. package/dist/assets/{sizeCapture-X5ZJPWSS-D9ISogq1.js → sizeCapture-X5ZJPWSS-Ck9rsuwL.js} +1 -1
  151. package/dist/assets/{src-Bc0PoUJ1.js → src-C8AUg09O.js} +1 -1
  152. package/dist/assets/{stateDiagram-2N3HPSRC-CqH5xc9W.js → stateDiagram-2N3HPSRC-Cm33MLHu.js} +1 -1
  153. package/dist/assets/stateDiagram-v2-6OUMAXLB-BrNv-raG.js +1 -0
  154. package/dist/assets/{status-dot-DUYSKRCU.js → status-dot-CensgJZC.js} +1 -1
  155. package/dist/assets/{swimlanes-5IMT3BWC-mwejV-rW.js → swimlanes-5IMT3BWC-B107vmvM.js} +2 -2
  156. package/dist/assets/swimlanesDiagram-G3AALYLV-ntcxaPXp.js +8 -0
  157. package/dist/assets/{tag-chip-CQU51ST3.js → tag-chip-Bjzb4-qW.js} +1 -1
  158. package/dist/assets/{theme-provider-D-zZkXxS.js → theme-provider-hlle7Skk.js} +1 -1
  159. package/dist/assets/{timeline-definition-FHXFAJF6-CuikIDlX.js → timeline-definition-FHXFAJF6-CJEoAj33.js} +1 -1
  160. package/dist/assets/{trash-2-BDdqDh6E.js → trash-2-C5KH5Rw9.js} +1 -1
  161. package/dist/assets/treeView-QDETBFTQ-DbFmr-gw.js +1 -0
  162. package/dist/assets/treemap-6X3UGDF4-C8aY96pi.js +1 -0
  163. package/dist/assets/{use-config-Bxx7DdaL.js → use-config-CPl_F79t.js} +1 -1
  164. package/dist/assets/use-desktop-capabilities-CEg9-DrQ.js +1 -0
  165. package/dist/assets/{use-viewport-layout-CDcca0YL.js → use-viewport-layout-CPZUmTPi.js} +1 -1
  166. package/dist/assets/{vennDiagram-L72KCM5P-BD0P0qHh.js → vennDiagram-L72KCM5P-DzsUHk5I.js} +1 -1
  167. package/dist/assets/wardley-OPB4EBWU-D8d6DbbJ.js +1 -0
  168. package/dist/assets/{wardleyDiagram-EHGQE667-C6ma3t5D.js → wardleyDiagram-EHGQE667-1NfFs5ua.js} +1 -1
  169. package/dist/assets/x--xxUvHKW.js +1 -0
  170. package/dist/assets/{xychartDiagram-FW5EYKEG-D7E40NBk.js → xychartDiagram-FW5EYKEG-Ci8AI3Qo.js} +1 -1
  171. package/dist/index.html +37 -36
  172. package/dist/panel-standalone.html +11 -11
  173. package/package.json +8 -8
  174. package/src/app/components/layout/__tests__/app-layout.test.tsx +0 -1
  175. package/src/app/components/layout/__tests__/sidebar.layout.test.tsx +36 -16
  176. package/src/app/components/layout/sidebar-items.tsx +27 -18
  177. package/src/app/components/layout/sidebar-rail.styles.ts +11 -2
  178. package/src/app/components/layout/sidebar.tsx +3 -2
  179. package/src/app/configs/app-navigation.config.ts +39 -86
  180. package/src/features/agents/components/agent-details-dialog.tsx +3 -3
  181. package/src/features/agents/components/agents-page.tsx +5 -4
  182. package/src/features/chat/components/layout/__tests__/chat-page-shell.test.tsx +0 -2
  183. package/src/features/chat/components/layout/chat-page-shell.tsx +0 -2
  184. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +0 -1
  185. package/src/features/chat/features/conversation/components/chat-voice-input-panel.tsx +3 -2
  186. package/src/features/chat/features/conversation/hooks/__tests__/use-chat-voice-input.test.tsx +4 -0
  187. package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +32 -47
  188. package/src/features/chat/features/message/components/chat-message-list.container.tsx +6 -10
  189. package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +52 -6
  190. package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +22 -37
  191. package/src/features/chat/features/session/components/__tests__/chat-sidebar-project-groups.test.tsx +1 -1
  192. package/src/features/chat/features/session/components/__tests__/chat-sidebar-session-item.test.tsx +2 -1
  193. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +4 -2
  194. package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +9 -6
  195. package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +2 -2
  196. package/src/features/chat/features/session/components/session-header/chat-session-header-actions.tsx +17 -17
  197. package/src/features/chat/features/session/components/session-header/chat-session-header-menu-item.tsx +4 -4
  198. package/src/features/chat/features/session/components/session-header/chat-session-more-actions-menu.tsx +13 -6
  199. package/src/features/chat/features/workspace/components/chat-session-workspace-panel.tsx +1 -1
  200. package/src/features/chat/managers/chat-voice-input.manager.ts +5 -3
  201. package/src/features/chat/utils/chat-voice-permissions.utils.test.ts +12 -1
  202. package/src/features/chat/utils/chat-voice-permissions.utils.ts +6 -1
  203. package/src/features/cron/components/cron-job-row.tsx +11 -9
  204. package/src/features/inbox/components/inbox-reader-dialog.tsx +4 -2
  205. package/src/features/inbox/pages/inbox-page.tsx +10 -5
  206. package/src/features/marketplace/components/mcp/mcp-marketplace-card.tsx +1 -1
  207. package/src/features/panel-apps/components/__tests__/panel-app-list-item.test.tsx +6 -4
  208. package/src/features/panel-apps/components/__tests__/panel-app-toolbar.test.tsx +6 -4
  209. package/src/features/panel-apps/components/panel-app-list-item.tsx +1 -1
  210. package/src/features/panel-apps/components/panel-app-toolbar.tsx +7 -7
  211. package/src/features/projects/components/project-skills.tsx +2 -2
  212. package/src/features/right-panel-resources/components/__tests__/page-resource-sidebar-nav.test.tsx +27 -2
  213. package/src/features/right-panel-resources/components/page-resource-actions-menu.tsx +4 -22
  214. package/src/features/right-panel-resources/components/page-resource-sidebar-nav.tsx +10 -13
  215. package/src/features/right-panel-resources/hooks/use-page-resource-actions.ts +56 -3
  216. package/src/features/right-panel-resources/index.ts +0 -1
  217. package/src/features/service-apps/components/service-app-list-item.tsx +3 -2
  218. package/src/features/system-status/components/__tests__/desktop-update-config.test.tsx +40 -0
  219. package/src/features/system-status/components/desktop-update-config.tsx +19 -1
  220. package/src/platforms/desktop/components/__tests__/desktop-app-shell.test.tsx +0 -1
  221. package/src/platforms/desktop/components/desktop-app-shell.tsx +0 -2
  222. package/src/platforms/mobile/components/mobile-app-shell.tsx +0 -2
  223. package/src/platforms/mobile/components/mobile-settings-shell.tsx +8 -3
  224. package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +83 -1
  225. package/src/shared/components/ui/context-menu/context-menu-items.tsx +173 -0
  226. package/src/shared/components/ui/context-menu/context-menu.tsx +93 -114
  227. package/src/shared/components/ui/dialog.tsx +4 -0
  228. package/src/shared/components/ui/overlays/sheet.tsx +4 -0
  229. package/src/shared/components/ui/popover.tsx +10 -4
  230. package/src/shared/lib/i18n/locales/en-US/chat.json +8 -1
  231. package/src/shared/lib/i18n/locales/en-US/core.json +3 -1
  232. package/src/shared/lib/i18n/locales/en-US/desktop-update.json +1 -0
  233. package/src/shared/lib/i18n/locales/zh-CN/chat.json +8 -1
  234. package/src/shared/lib/i18n/locales/zh-CN/core.json +11 -9
  235. package/src/shared/lib/i18n/locales/zh-CN/desktop-update.json +1 -0
  236. package/src/shared/lib/transport/__tests__/browser-realtime-recovery.service.test.ts +27 -2
  237. package/src/shared/lib/transport/__tests__/local-transport.service.test.ts +20 -0
  238. package/src/shared/lib/transport/__tests__/remote.transport.test.ts +26 -0
  239. package/src/shared/lib/transport/browser-realtime-recovery.service.ts +32 -5
  240. package/src/shared/lib/transport/local-transport.service.ts +1 -6
  241. package/src/shared/lib/transport/remote-transport.service.ts +22 -1
  242. package/dist/assets/api-D9e9cHtW.js +0 -20
  243. package/dist/assets/app-presenter-provider-J9IgTbc9.js +0 -124
  244. package/dist/assets/architecture-TIHT7OUA-BWywYH_m.js +0 -1
  245. package/dist/assets/channel-1nKIAEXr.js +0 -1
  246. package/dist/assets/chunk-2Q5K7J3B-CAwv72v4.js +0 -1
  247. package/dist/assets/chunk-VAUOI2AC-DnaryNw2.js +0 -1
  248. package/dist/assets/chunk-XXDRQBXY-BToo1uqb.js +0 -1
  249. package/dist/assets/classDiagram-OUVF2IWQ-D_TusZGx.js +0 -1
  250. package/dist/assets/classDiagram-v2-EOCWNBFH-B1NFZTmS.js +0 -1
  251. package/dist/assets/confirm-dialog-BCGeh61X.js +0 -1
  252. package/dist/assets/cynefin-VYW2F7L2-CJZSs5s_.js +0 -1
  253. package/dist/assets/desktop-update-config-BJMTQMRS.js +0 -1
  254. package/dist/assets/dialog-DQXou6pg.js +0 -5
  255. package/dist/assets/dist-CiC9Fd9J.js +0 -1
  256. package/dist/assets/doc-browser-CCYS_csH.js +0 -1
  257. package/dist/assets/es2015-DHRpDU-q.js +0 -41
  258. package/dist/assets/eventmodeling-45OFAUF4-rc7kUq4V.js +0 -1
  259. package/dist/assets/flowDiagram-23GEKE2U-DAjaeGO8.js +0 -1
  260. package/dist/assets/gitGraph-TEB2WS4Q-Ce0gf6ps.js +0 -1
  261. package/dist/assets/info-DKCQHKI2-Cp-Tr78m.js +0 -1
  262. package/dist/assets/loader-circle-B-4WwzBj.js +0 -1
  263. package/dist/assets/login-page-CdlI6B8e.js +0 -1
  264. package/dist/assets/main-BVYdyT60.css +0 -1
  265. package/dist/assets/main-DYEALeoQ.js +0 -2
  266. package/dist/assets/main-i18n-catalog.config-1o2hjZ0m.js +0 -1
  267. package/dist/assets/mcp-marketplace-page-CRRQT6SP.js +0 -1
  268. package/dist/assets/packet-7NZHBO7P-BOJuCraS.js +0 -1
  269. package/dist/assets/panel-app-2EACRB8p.js +0 -1
  270. package/dist/assets/panel-app-i18n-catalog.config-kQO7QAwH.js +0 -1
  271. package/dist/assets/pie-RZYD4A2V-D-FEO81x.js +0 -1
  272. package/dist/assets/projects-k6SLda_A.js +0 -1
  273. package/dist/assets/provider-models-mVzuEQBS.js +0 -1
  274. package/dist/assets/providers-config-page-rBlVrHkb.js +0 -1
  275. package/dist/assets/pwa-BgGM4kkY.js +0 -1
  276. package/dist/assets/radar-I7S5WNFK-Bq3eK1vK.js +0 -1
  277. package/dist/assets/railroad-3IZDKUUU-C3uZ1esg.js +0 -1
  278. package/dist/assets/railroad-abnf-AHOZXSZD-D3iZd1KT.js +0 -1
  279. package/dist/assets/railroad-ebnf-EBAXGLYW-Dl0FWqZu.js +0 -1
  280. package/dist/assets/railroad-peg-LSFZ7HO6-B51SbzGp.js +0 -1
  281. package/dist/assets/remote-wYWqir2w.js +0 -1
  282. package/dist/assets/security-config-CJb2pK2O.js +0 -1
  283. package/dist/assets/select-Bq-UmfCK.js +0 -1
  284. package/dist/assets/service-apps-panel-iLLEByRF.js +0 -1
  285. package/dist/assets/stateDiagram-v2-6OUMAXLB-CcOGfDdx.js +0 -1
  286. package/dist/assets/swimlanesDiagram-G3AALYLV-BMI2k8RZ.js +0 -8
  287. package/dist/assets/treeView-QDETBFTQ-C0_07QI1.js +0 -1
  288. package/dist/assets/treemap-6X3UGDF4-Djpx6ccG.js +0 -1
  289. package/dist/assets/use-desktop-capabilities-BTgdFgJy.js +0 -1
  290. package/dist/assets/wardley-OPB4EBWU-DZVFxu81.js +0 -1
  291. package/dist/assets/x-LUUwl8rK.js +0 -1
  292. package/src/features/right-panel-resources/components/current-page-actions.tsx +0 -36
  293. /package/dist/assets/{array-B0sEvCP9.js → array-BV9OtnO8.js} +0 -0
  294. /package/dist/assets/{chunk-KEIR6QF5-BeO7fxDQ.js → chunk-KEIR6QF5-Cx-8EJ4_.js} +0 -0
  295. /package/dist/assets/{chunk-Y2CYZVJY-JQfgEV36.js → chunk-Y2CYZVJY-Dy1ufvjf.js} +0 -0
  296. /package/dist/assets/{config-hints-D3OuwoEY.js → config-hints-DbmiyTKg.js} +0 -0
  297. /package/dist/assets/{cytoscape.esm-CzJ9uXgi.js → cytoscape.esm-CSCjuT4Z.js} +0 -0
  298. /package/dist/assets/{defaultLocale-USmzX3VG.js → defaultLocale-DWTiNsbT.js} +0 -0
  299. /package/dist/assets/{dist-BYF6XVna.js → dist-BVCSkfWY.js} +0 -0
  300. /package/dist/assets/{graphlib-DEFMkHdW.js → graphlib-B1yb1Wl8.js} +0 -0
  301. /package/dist/assets/{host-capabilities-C0MmWd3M.js → host-capabilities-DuIFVsvM.js} +0 -0
  302. /package/dist/assets/{init-04ErALoz.js → init-BF6GH5oe.js} +0 -0
  303. /package/dist/assets/{jszip.min-BnQ5NRy2.js → jszip.min-D12teKzP.js} +0 -0
  304. /package/dist/assets/{middleware-CAXxl-af.js → middleware-B--6mAUM.js} +0 -0
  305. /package/dist/assets/{navigation-history-CyawyVz0.js → navigation-history-CzErJuPG.js} +0 -0
  306. /package/dist/assets/{path-CzxQ9n2G.js → path-C56XkznJ.js} +0 -0
  307. /package/dist/assets/{rough.esm-pT9fdsW3.js → rough.esm-CGfeEbtE.js} +0 -0
  308. /package/dist/assets/{xlsx-BRpCSiE4.js → xlsx-sds5nUpL.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/ui",
3
- "version": "0.26.0",
3
+ "version": "0.26.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -35,13 +35,13 @@
35
35
  "zod": "^3.23.8",
36
36
  "zustand": "^5.0.2",
37
37
  "@nextclaw/agent-chat": "0.3.14",
38
- "@nextclaw/client-sdk": "0.12.6",
39
- "@nextclaw/agent-chat-ui": "0.10.0",
40
- "@nextclaw/ncp": "0.11.0",
41
- "@nextclaw/ncp-http-agent-client": "0.4.23",
42
- "@nextclaw/ncp-react": "0.5.28",
43
- "@nextclaw/ncp-toolkit": "0.6.25",
44
- "@nextclaw/shared": "0.8.0"
38
+ "@nextclaw/client-sdk": "0.12.8",
39
+ "@nextclaw/agent-chat-ui": "0.10.1",
40
+ "@nextclaw/ncp": "0.11.2",
41
+ "@nextclaw/ncp-react": "0.5.30",
42
+ "@nextclaw/ncp-http-agent-client": "0.4.25",
43
+ "@nextclaw/ncp-toolkit": "0.6.27",
44
+ "@nextclaw/shared": "0.8.2"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@testing-library/react": "^16.3.0",
@@ -250,4 +250,3 @@ vi.mock("@/features/right-panel-resources/hooks/use-page-resource-actions", () =
250
250
  vi.mock("@/shared/components/doc-browser/use-doc-link-interceptor", () => ({ useDocLinkInterceptor: () => {} }));
251
251
 
252
252
  vi.mock("@/shared/components/doc-browser/doc-browser", () => ({ DocBrowser: () => null }));
253
- vi.mock("@/features/right-panel-resources/components/current-page-actions", () => ({ CurrentPageActions: () => null }));
@@ -2,6 +2,7 @@ import { render, screen, within } from "@testing-library/react";
2
2
  import { fireEvent } from "@testing-library/react";
3
3
  import { MemoryRouter } from "react-router-dom";
4
4
  import { beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { MobileSettingsShell } from "@/platforms/mobile/components/mobile-settings-shell";
5
6
  import { Sidebar } from "@/app/components/layout/sidebar";
6
7
  import { viewportLayoutManager } from "@/app/managers/viewport-layout.manager";
7
8
  import type * as RemoteFeature from "@/features/remote";
@@ -19,6 +20,10 @@ const mocks = vi.hoisted(() => ({
19
20
  },
20
21
  }));
21
22
 
23
+ vi.mock("@/app/hooks/use-feature-controls", () => ({
24
+ useFeatureControls: () => ({ data: { desktopAutomation: { available: false } } }),
25
+ }));
26
+
22
27
  vi.mock("@/shared/components/doc-browser", () => ({
23
28
  useDocBrowser: () => ({
24
29
  open: mocks.docOpen,
@@ -102,7 +107,7 @@ describe("Sidebar", () => {
102
107
  expect(backLink).toBeTruthy();
103
108
  expect(header.className).not.toContain("bg-white");
104
109
  expect(header.className).not.toContain("rounded-2xl");
105
- expect(backLink.className).toContain("hover:bg-gray-200/60");
110
+ expect(backLink.className).toContain("hover:bg-[hsl(var(--gray-200)/0.6)]");
106
111
  });
107
112
 
108
113
  it("keeps the settings navigation in the expected product order", () => {
@@ -127,9 +132,11 @@ describe("Sidebar", () => {
127
132
 
128
133
  expect(groupHeadings).toEqual([
129
134
  "Basic Configuration",
130
- "Advanced Configuration",
135
+ "Common Settings",
136
+ "Security & Privacy",
137
+ "System & Extensions",
131
138
  ]);
132
- expect(groups).toHaveLength(2);
139
+ expect(groups).toHaveLength(4);
133
140
  expect(
134
141
  within(groups[0] as HTMLElement)
135
142
  .getAllByRole("link")
@@ -140,32 +147,45 @@ describe("Sidebar", () => {
140
147
  .getAllByRole("link")
141
148
  .map((link) => link.textContent?.trim() || ""),
142
149
  ).toEqual([
143
- "Extensions",
144
150
  "Appearance",
145
- "Sign-in Management",
146
- "Privacy & Analytics",
147
- "Search Channels",
148
151
  "Updates",
149
- "Remote Access",
150
- "Routing & Runtime",
151
- "Secrets",
152
- "MCP",
152
+ "Search Channels",
153
+ "Keyboard shortcuts",
154
+ ]);
155
+ expect(within(groups[2] as HTMLElement).getAllByRole("link").map((link) => link.textContent)).toEqual([
156
+ "Sign-in Management", "Privacy & Analytics", "Secrets",
157
+ ]);
158
+ expect(within(groups[3] as HTMLElement).getAllByRole("link").map((link) => link.textContent)).toEqual([
159
+ "Remote Access", "Routing & Runtime", "MCP", "Extensions",
153
160
  ]);
154
161
  expect(linkTexts).toEqual([
155
162
  "Model",
156
163
  "Providers",
157
164
  "Channels",
158
- "Extensions",
159
165
  "Appearance",
166
+ "Updates",
167
+ "Search Channels",
168
+ "Keyboard shortcuts",
160
169
  "Sign-in Management",
161
170
  "Privacy & Analytics",
162
- "Search Channels",
163
- "Updates",
171
+ "Secrets",
164
172
  "Remote Access",
165
173
  "Routing & Runtime",
166
- "Secrets",
167
174
  "MCP",
175
+ "Extensions",
176
+ ]);
177
+ });
178
+
179
+ it("shares the grouped navigation with mobile while omitting desktop shortcuts", () => {
180
+ render(<MemoryRouter initialEntries={["/settings"]}><MobileSettingsShell /></MemoryRouter>);
181
+ expect(screen.getAllByRole("heading", { level: 2 }).map((heading) => heading.textContent)).toEqual([
182
+ "Basic Configuration", "Common Settings", "Security & Privacy", "System & Extensions",
168
183
  ]);
184
+ const links = screen.getAllByRole("link");
185
+ expect(links.slice(0, 3).map((link) => link.textContent?.trim())).toEqual(["Model", "Providers", "Channels"]);
186
+ expect(links.at(-1)?.textContent?.trim()).toBe("Extensions");
187
+ expect(screen.queryByRole("link", { name: "Keyboard shortcuts" })).toBeNull();
188
+ expect(new Set(links.map((link) => link.getAttribute("href"))).size).toBe(links.length);
169
189
  });
170
190
 
171
191
  it("keeps the footer utilities compact without changing the top header structure", () => {
@@ -187,7 +207,7 @@ describe("Sidebar", () => {
187
207
  expect(screen.queryByRole("combobox", { name: "Language" })).toBeNull();
188
208
  expect(accountEntry.className).toContain("py-2");
189
209
  expect(accountEntry.className).toContain("text-muted-foreground");
190
- expect(accountEntry.className).toContain("hover:bg-gray-200/60");
210
+ expect(accountEntry.className).toContain("hover:bg-[hsl(var(--gray-200)/0.6)]");
191
211
  expect(navigationList?.className).toContain("space-y-0.5");
192
212
  expect(footer?.className).toContain("space-y-0.5");
193
213
  expect(footer?.firstElementChild?.textContent).toContain("Help Docs");
@@ -17,6 +17,7 @@ import {
17
17
  SIDEBAR_RAIL_CONTROL_CLASS,
18
18
  SIDEBAR_RAIL_ICON_CLASS,
19
19
  SIDEBAR_RAIL_SURFACE_CLASS,
20
+ SIDEBAR_ITEM_SURFACE_CLASS,
20
21
  } from "@/app/components/layout/sidebar-rail.styles";
21
22
 
22
23
  export type SidebarIcon = ComponentType<{ className?: string }>;
@@ -63,9 +64,12 @@ export function getSidebarItemStackClass(
63
64
  return getSidebarItemTone(density).stack;
64
65
  }
65
66
 
66
- function isSidebarRouteActive(pathname: string, target: string): boolean {
67
+ function isSidebarRouteActive(pathname: string, search: string, target: string): boolean {
67
68
  const normalizedPathname = pathname.toLowerCase();
68
- const normalizedTarget = target.toLowerCase();
69
+ const [targetPath, targetSearch] = target.split("?");
70
+ const normalizedTarget = targetPath.toLowerCase();
71
+ const currentParams = new URLSearchParams(search);
72
+ if ([...new URLSearchParams(targetSearch)].some(([key, value]) => currentParams.get(key) !== value)) return false;
69
73
  return (
70
74
  normalizedPathname === normalizedTarget ||
71
75
  normalizedPathname.startsWith(`${normalizedTarget}/`)
@@ -99,10 +103,11 @@ type SidebarNavLinkItemProps = {
99
103
  icon?: SidebarIcon;
100
104
  iconNode?: ReactNode;
101
105
  density?: SidebarItemDensity;
102
- className?: string;
103
106
  collapsed?: boolean;
104
107
  indicator?: boolean;
105
108
  trailing?: ReactNode;
109
+ actions?: ReactNode;
110
+ onNavigate?: () => void;
106
111
  };
107
112
 
108
113
  function SidebarNavIcon({
@@ -149,32 +154,32 @@ export function SidebarNavLinkItem({
149
154
  icon: Icon,
150
155
  iconNode,
151
156
  density = "default",
152
- className,
153
157
  collapsed = false,
154
158
  indicator = false,
155
159
  trailing,
160
+ actions,
161
+ onNavigate,
156
162
  }: SidebarNavLinkItemProps) {
157
163
  const tone = getSidebarItemTone(density);
158
- const { pathname } = useLocation();
159
- const isActive = isSidebarRouteActive(pathname, to);
164
+ const { pathname, search } = useLocation();
165
+ const isActive = isSidebarRouteActive(pathname, search, to);
160
166
  const link = (
167
+ <div
168
+ data-sidebar-item=""
169
+ data-active={isActive || undefined}
170
+ className={cn("group group/sidebar-item relative flex items-center", collapsed ? SIDEBAR_RAIL_CONTROL_CLASS : "w-full", SIDEBAR_ITEM_SURFACE_CLASS, isActive && SIDEBAR_RAIL_ACTIVE_SURFACE_CLASS)}
171
+ >
161
172
  <Link
162
173
  to={to}
174
+ onClick={onNavigate}
163
175
  aria-label={label}
164
176
  aria-current={isActive ? "page" : undefined}
165
177
  className={cn(
166
- "group flex w-full items-center rounded-xl font-medium transition-colors duration-base focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
178
+ "flex min-w-0 flex-1 items-center rounded-xl font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
167
179
  collapsed
168
180
  ? cn(SIDEBAR_RAIL_CONTROL_CLASS, "justify-center px-0 py-0")
169
181
  : tone.row,
170
- isActive
171
- ? collapsed
172
- ? SIDEBAR_RAIL_ACTIVE_SURFACE_CLASS
173
- : "bg-gray-200/80 text-gray-900 shadow-sm"
174
- : collapsed
175
- ? SIDEBAR_RAIL_SURFACE_CLASS
176
- : "text-muted-foreground hover:bg-gray-200/60 hover:text-gray-900",
177
- className,
182
+ actions && !collapsed && "pr-9",
178
183
  )}
179
184
  >
180
185
  <SidebarNavIcon
@@ -185,7 +190,7 @@ export function SidebarNavLinkItem({
185
190
  isActive={isActive}
186
191
  tone={tone}
187
192
  />
188
- <span className={collapsed ? "sr-only" : "min-w-0 flex-1 text-left"}>
193
+ <span className={collapsed ? "sr-only" : "min-w-0 flex-1 truncate text-left"}>
189
194
  {label}
190
195
  </span>
191
196
  {!collapsed && trailing ? (
@@ -194,6 +199,8 @@ export function SidebarNavLinkItem({
194
199
  </span>
195
200
  ) : null}
196
201
  </Link>
202
+ {!collapsed && actions ? <span className="absolute right-1 flex items-center">{actions}</span> : null}
203
+ </div>
197
204
  );
198
205
 
199
206
  return collapsed ? (
@@ -270,7 +277,8 @@ export function SidebarActionItem({
270
277
  onClick={onClick}
271
278
  aria-label={label}
272
279
  className={cn(
273
- "group flex w-full items-center rounded-xl font-medium text-muted-foreground transition-colors duration-base hover:bg-gray-200/60 hover:text-gray-900 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
280
+ "group flex w-full items-center font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
281
+ SIDEBAR_ITEM_SURFACE_CLASS,
274
282
  collapsed
275
283
  ? cn(
276
284
  SIDEBAR_RAIL_CONTROL_CLASS,
@@ -344,7 +352,8 @@ export function SidebarSelectItem({
344
352
  <SelectTrigger
345
353
  aria-label={label}
346
354
  className={cn(
347
- "group h-auto w-full rounded-xl border-0 bg-transparent font-medium text-muted-foreground shadow-none hover:bg-gray-200/60 hover:text-gray-900 focus:ring-0 focus-visible:ring-1 focus-visible:ring-border",
355
+ "group h-auto w-full border-0 bg-transparent font-medium shadow-none focus:ring-0 focus-visible:ring-1 focus-visible:ring-border",
356
+ SIDEBAR_ITEM_SURFACE_CLASS,
348
357
  collapsed
349
358
  ? cn(
350
359
  SIDEBAR_RAIL_CONTROL_CLASS,
@@ -6,10 +6,19 @@ export const SIDEBAR_RAIL_ICON_CLASS = "h-4 w-4";
6
6
  export const SIDEBAR_RAIL_STACK_CLASS = "space-y-1";
7
7
  export const SIDEBAR_RAIL_ITEM_GAP_CLASS = "gap-1";
8
8
 
9
+ // Shared by expanded navigation, compound rows and the collapsed rail.
10
+ // Use theme neutral tokens directly so legacy gray utility overrides cannot
11
+ // turn sidebar feedback into a content selection or accent surface.
12
+ export const SIDEBAR_ITEM_SURFACE_CLASS =
13
+ "rounded-xl text-muted-foreground transition-colors duration-base hover:bg-[hsl(var(--gray-200)/0.6)] hover:text-foreground focus-within:bg-[hsl(var(--gray-200)/0.6)] has-[[data-context-menu-open]]:bg-[hsl(var(--gray-200)/0.6)]";
14
+
15
+ export const SIDEBAR_ITEM_ACTIVE_SURFACE_CLASS =
16
+ "bg-[hsl(var(--gray-200)/0.8)] text-foreground hover:bg-[hsl(var(--gray-200)/0.8)] focus-within:bg-[hsl(var(--gray-200)/0.8)] has-[[data-context-menu-open]]:bg-[hsl(var(--gray-200)/0.8)]";
17
+
9
18
  export const SIDEBAR_RAIL_SURFACE_CLASS =
10
- "text-muted-foreground transition-colors duration-base hover:bg-gray-200/60 hover:text-gray-900 active:bg-gray-200/80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border";
19
+ `${SIDEBAR_ITEM_SURFACE_CLASS} active:bg-[hsl(var(--gray-200)/0.8)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border`;
11
20
 
12
- export const SIDEBAR_RAIL_ACTIVE_SURFACE_CLASS = "bg-gray-200/80 text-gray-900";
21
+ export const SIDEBAR_RAIL_ACTIVE_SURFACE_CLASS = SIDEBAR_ITEM_ACTIVE_SURFACE_CLASS;
13
22
 
14
23
  export const SIDEBAR_RAIL_PRIMARY_SURFACE_CLASS =
15
24
  "bg-primary/10 text-primary transition-colors duration-base hover:bg-primary/15 hover:text-primary-700 active:bg-primary/20 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border";
@@ -19,7 +19,7 @@ import { IconActionButton } from "@/shared/components/ui/actions/icon-action-but
19
19
  import { SCROLL_BOTTOM_EDGE_FADE_CLASS } from "@/shared/components/ui/scroll-area";
20
20
  import { useAppPresenter } from "@/app/components/app-presenter-provider";
21
21
  import { useRemoteStatus } from "@/features/remote";
22
- import { useDesktopCapabilityAvailability } from "@/features/desktop-capabilities/hooks/use-desktop-capabilities";
22
+ import { useDesktopCapabilityAvailability } from "@/features/desktop-capabilities";
23
23
  import { getSettingsNavSections } from "@/app/configs/app-navigation.config";
24
24
  import { viewportLayoutManager } from "@/app/managers/viewport-layout.manager";
25
25
  import { useViewportLayoutStore } from "@/app/stores/viewport-layout.store";
@@ -89,7 +89,8 @@ function SettingsSidebarHeader({
89
89
  to="/chat"
90
90
  aria-label={t("backToMain")}
91
91
  className={cn(
92
- "group inline-flex min-w-0 items-center rounded-lg text-[12px] font-medium text-muted-foreground transition-colors hover:bg-gray-200/60 hover:text-gray-900 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
92
+ "group inline-flex min-w-0 items-center text-[12px] font-medium",
93
+ SIDEBAR_RAIL_SURFACE_CLASS,
93
94
  isCollapsed
94
95
  ? cn(
95
96
  SIDEBAR_RAIL_CONTROL_CLASS,
@@ -138,107 +138,60 @@ export function getMainSidebarNavItems(
138
138
  ];
139
139
  }
140
140
 
141
- export function getSettingsNavItems(
141
+ export function getSettingsNavSections(
142
142
  translate: Translate,
143
143
  options: SettingsNavigationOptions = {},
144
- ): AppNavigationItem[] {
145
- const items = [
146
- {
147
- target: "/model",
148
- label: translate("model"),
149
- icon: Cpu,
150
- },
151
- {
152
- target: "/providers",
153
- label: translate("providers"),
154
- icon: Sparkles,
155
- },
156
- {
157
- target: "/channels",
158
- label: translate("channels"),
159
- icon: MessageSquare,
160
- },
161
- {
162
- target: "/extensions",
163
- label: translate("extensions"),
164
- icon: Puzzle,
165
- },
166
- {
167
- target: "/appearance",
168
- label: translate("appearance"),
169
- icon: Palette,
170
- },
171
- {
172
- target: "/keyboard-shortcuts",
173
- label: translate("keyboardShortcuts"),
174
- icon: Keyboard,
175
- },
176
- {
177
- target: "/security",
178
- label: translate("security"),
179
- icon: Shield,
180
- },
181
- {
182
- target: "/privacy",
183
- label: translate("privacy"),
184
- icon: Activity,
185
- },
186
- {
187
- target: "/desktop-capabilities",
188
- label: translate("desktopCapabilities"),
189
- icon: MonitorCog,
190
- },
191
- {
192
- target: "/search",
193
- label: translate("searchChannels"),
194
- icon: Search,
195
- },
196
- {
197
- target: "/updates",
198
- label: translate("updates"),
199
- icon: Download,
200
- },
144
+ ): AppNavigationSection[] {
145
+ const sections = [
201
146
  {
202
- target: "/remote",
203
- label: translate("remote"),
204
- icon: Wifi,
147
+ label: translate("settingsGroupBasic"),
148
+ items: [
149
+ { target: "/model", label: translate("model"), icon: Cpu },
150
+ { target: "/providers", label: translate("providers"), icon: Sparkles },
151
+ { target: "/channels", label: translate("channels"), icon: MessageSquare },
152
+ ],
205
153
  },
206
154
  {
207
- target: "/runtime",
208
- label: translate("runtime"),
209
- icon: Cpu,
155
+ label: translate("settingsGroupCommon"),
156
+ items: [
157
+ { target: "/appearance", label: translate("appearance"), icon: Palette },
158
+ { target: "/updates", label: translate("updates"), icon: Download },
159
+ { target: "/search", label: translate("searchChannels"), icon: Search },
160
+ { target: "/keyboard-shortcuts", label: translate("keyboardShortcuts"), icon: Keyboard },
161
+ ],
210
162
  },
211
163
  {
212
- target: "/secrets",
213
- label: translate("secrets"),
214
- icon: KeyRound,
164
+ label: translate("settingsGroupSecurity"),
165
+ items: [
166
+ { target: "/security", label: translate("security"), icon: Shield },
167
+ { target: "/privacy", label: translate("privacy"), icon: Activity },
168
+ { target: "/secrets", label: translate("secrets"), icon: KeyRound },
169
+ { target: "/desktop-capabilities", label: translate("desktopCapabilities"), icon: MonitorCog },
170
+ ],
215
171
  },
216
172
  {
217
- target: "/marketplace/mcp",
218
- label: translate("marketplaceFilterMcp"),
219
- icon: Wrench,
173
+ label: translate("settingsGroupSystem"),
174
+ items: [
175
+ { target: "/remote", label: translate("remote"), icon: Wifi },
176
+ { target: "/runtime", label: translate("runtime"), icon: Cpu },
177
+ { target: "/marketplace/mcp", label: translate("marketplaceFilterMcp"), icon: Wrench },
178
+ { target: "/extensions", label: translate("extensions"), icon: Puzzle },
179
+ ],
220
180
  },
221
181
  ];
222
- return items.filter((item) =>
223
- (options.includeDesktopCapabilities !== false || item.target !== "/desktop-capabilities") &&
224
- (options.includeKeyboardShortcuts !== false || item.target !== "/keyboard-shortcuts"));
182
+ return sections.map((section) => ({
183
+ ...section,
184
+ items: section.items.filter((item) =>
185
+ (options.includeDesktopCapabilities !== false || item.target !== "/desktop-capabilities") &&
186
+ (options.includeKeyboardShortcuts !== false || item.target !== "/keyboard-shortcuts")),
187
+ })).filter((section) => section.items.length > 0);
225
188
  }
226
189
 
227
- export function getSettingsNavSections(
190
+ export function getSettingsNavItems(
228
191
  translate: Translate,
229
192
  options: SettingsNavigationOptions = {},
230
- ): AppNavigationSection[] {
231
- const items = getSettingsNavItems(translate, options);
232
- return [
233
- {
234
- label: translate("settingsGroupBasic"),
235
- items: items.slice(0, 3),
236
- },
237
- {
238
- label: translate("settingsGroupAdvanced"),
239
- items: items.slice(3),
240
- },
241
- ];
193
+ ): AppNavigationItem[] {
194
+ return getSettingsNavSections(translate, options).flatMap((section) => section.items);
242
195
  }
243
196
 
244
197
  export function isSettingsRoute(pathname: string): boolean {
@@ -75,22 +75,22 @@ export function AgentDetailsDialog({
75
75
  <DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-popover p-0 sm:max-h-[720px] sm:max-w-2xl">
76
76
  <div className="shrink-0 px-5 pb-3 pt-5">
77
77
  <DialogHeader className="text-left">
78
- <div className="flex min-w-0 items-center gap-3">
78
+ <div className="flex min-w-0 items-center gap-3 pr-7">
79
79
  <AgentAvatar
80
80
  agentId={agent.id}
81
81
  displayName={agent.displayName}
82
82
  avatarUrl={agent.avatarUrl}
83
83
  className="h-10 w-10 shrink-0"
84
84
  />
85
- <div className="min-w-0">
85
+ <div className="min-w-0 flex-1">
86
86
  <DialogTitle className="truncate text-base">
87
87
  {agent.displayName?.trim() || agent.id}
88
88
  </DialogTitle>
89
- <PageResourceActionsMenu page={pageResourceFromSystemObject('agent', agent.id, agent.displayName || agent.id)} />
90
89
  <DialogDescription className="truncate text-xs">
91
90
  @{agent.id}
92
91
  </DialogDescription>
93
92
  </div>
93
+ <PageResourceActionsMenu page={pageResourceFromSystemObject('agent', agent.id, agent.displayName || agent.id)} />
94
94
  </div>
95
95
  </DialogHeader>
96
96
  </div>
@@ -133,6 +133,7 @@ function AgentListCard(props: {
133
133
  onEdit,
134
134
  onDelete,
135
135
  } = props;
136
+ const [menuOpen, setMenuOpen] = useState(false);
136
137
  const runtimeValue = agent.runtime?.trim() || agent.engine?.trim() || "";
137
138
  const runtimeLabel = runtimeValue
138
139
  ? (runtimeOptions.find(
@@ -181,7 +182,7 @@ function AgentListCard(props: {
181
182
  >
182
183
  <MessageCircle className="h-4 w-4" />
183
184
  </Button>
184
- <Popover>
185
+ <Popover open={menuOpen} onOpenChange={setMenuOpen}>
185
186
  <PopoverTrigger asChild>
186
187
  <Button
187
188
  type="button"
@@ -194,9 +195,7 @@ function AgentListCard(props: {
194
195
  <MoreVertical className="h-4 w-4" />
195
196
  </Button>
196
197
  </PopoverTrigger>
197
- <PopoverContent align="end" className="w-56 p-1.5">
198
- <PageResourceActionItems page={pageResourceFromSystemObject('agent', agent.id, agent.displayName || agent.id)} />
199
- <div className="my-1 border-t border-border" />
198
+ <PopoverContent align="end" variant="menu">
200
199
  <AgentActionMenuItem
201
200
  icon={Eye}
202
201
  label={t("agentsViewDetailsAction")}
@@ -217,6 +216,8 @@ function AgentListCard(props: {
217
216
  destructive
218
217
  />
219
218
  ) : null}
219
+ <div className="my-1 h-px bg-border" />
220
+ <PageResourceActionItems page={pageResourceFromSystemObject('agent', agent.id, agent.displayName || agent.id)} onSelect={() => setMenuOpen(false)} />
220
221
  </PopoverContent>
221
222
  </Popover>
222
223
  </div>
@@ -102,5 +102,3 @@ describe("ChatPageLayout", () => {
102
102
  expect(screen.queryByTestId("chat-conversation-panel")).toBeNull();
103
103
  });
104
104
  });
105
-
106
- vi.mock("@/features/right-panel-resources/components/current-page-actions", () => ({ CurrentPageActions: () => null }));
@@ -1,4 +1,3 @@
1
- import { CurrentPageActions } from '@/features/right-panel-resources';
2
1
  import { ResourcePage } from '@/features/right-panel-resources';
3
2
  import { lazy, Suspense, useLayoutEffect } from "react";
4
3
  import { ChatSidebar } from "@/features/chat/components/layout/chat-sidebar";
@@ -73,7 +72,6 @@ export function ChatPageLayout({ view, confirmDialog }: ChatPageLayoutProps) {
73
72
  {!isMobile ? <ChatSidebar /> : null}
74
73
  {view === 'chat' ? (isMobile ? <ChatMobileShell /> : <ChatConversationPanel />) : (
75
74
  <section data-theme-surface="workspace" className={`${resolveManagementWorkspaceClass(view)} flex flex-col`}>
76
- {view !== 'resource' && view !== 'panel-app' ? <CurrentPageActions /> : null}
77
75
  <div className="min-h-0 flex-1 overflow-hidden"><ManagementPageContent view={view} /></div>
78
76
  </section>
79
77
  )}
@@ -137,7 +137,6 @@ export function ChatSidebarDesktopNav({
137
137
  : unreadCount
138
138
  : undefined
139
139
  }
140
- className={isCollapsed ? undefined : "rounded-lg px-2.5 py-1.5"}
141
140
  />
142
141
  </li>
143
142
  ))}
@@ -7,7 +7,7 @@ import { ChatVoiceShortcutControl } from './chat-voice-shortcut-control';
7
7
  import { voicePermissionInstructionKeys } from '@/features/chat/utils/chat-voice-permissions.utils';
8
8
 
9
9
  const ERROR_KEYS: Record<VoiceError, string> = {
10
- unsupported: 'chatInputVoiceUnsupported', permission: 'chatInputVoicePermissionDenied',
10
+ 'insecure-context': 'chatInputVoiceInsecureContext', unsupported: 'chatInputVoiceUnsupported', permission: 'chatInputVoicePermissionDenied',
11
11
  'service-denied': 'chatInputVoiceServiceDenied', 'no-device': 'chatInputVoiceNoDevice', 'device-busy': 'chatInputVoiceDeviceBusy',
12
12
  network: 'chatInputVoiceNetwork', 'audio-capture': 'chatInputVoiceDevice',
13
13
  'no-speech': 'chatInputVoiceNoSpeech', interrupted: 'chatInputVoiceInterrupted',
@@ -57,7 +57,8 @@ export function ChatVoiceInputPanel({ manager, snapshot, onStart, desktop }: {
57
57
  {phase === 'starting' ? <p className='sr-only'>{t('chatInputVoicePermissionPurpose')}</p> : null}
58
58
  {error ? <VoiceErrorDetails error={error} microphoneError={microphoneError} text={snapshot.text} /> : null}
59
59
  </div>
60
- {error ? <Button className='mt-2 shrink-0 self-start' size='sm' disabled={error === 'unsupported'} onClick={onStart}>
60
+ {error ? <Button className='mt-2 shrink-0 self-start' size='sm'
61
+ disabled={error === 'unsupported' || error === 'insecure-context'} onClick={onStart}>
61
62
  {t(microphoneError ? 'chatInputVoiceCheckAndRetry' : 'chatInputVoiceRetry')}
62
63
  </Button> : null}
63
64
  {phase === 'error' ? <Button className='mt-2 shrink-0 self-start' variant='ghost' size='sm'
@@ -201,6 +201,10 @@ describe('dictation lifecycle', () => {
201
201
  expect(manager.getSnapshot().error).toBe('timeout');
202
202
  });
203
203
  it('handles unsupported APIs and thrown starts', async () => {
204
+ const insecure = new ChatVoiceInputManager(() => recognition, async () => null, () => false);
205
+ insecure.start('en', 'one', draft);
206
+ expect(insecure.getSnapshot().error).toBe('insecure-context');
207
+ expect(recognition.start).not.toHaveBeenCalled();
204
208
  const unsupported = new ChatVoiceInputManager(() => null);
205
209
  unsupported.start('en', 'one', draft);
206
210
  expect(unsupported.getSnapshot().error).toBe('unsupported');