@nextclaw/ui 0.25.4 → 0.26.1

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 (492) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/dist/.vite/manifest.json +1158 -1392
  3. package/dist/assets/{abnfDiagram-VRR7QNED-DX_u5BBX.js → abnfDiagram-VRR7QNED-Dcw10Yt1.js} +1 -1
  4. package/dist/assets/account-panel-ZM2qzKF4.js +1 -0
  5. package/dist/assets/{aiden0z-pptx-renderer.es-C-E9e5yB.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-B4zouKzg.js +1 -0
  9. package/dist/assets/{arc-Cxwa624o.js → arc-DBRedCax.js} +1 -1
  10. package/dist/assets/architecture-TIHT7OUA-CvnC-LeA.js +1 -0
  11. package/dist/assets/{architectureDiagram-ZJ3FMSHR-D8mCj0H1.js → architectureDiagram-ZJ3FMSHR-Dufhtuv-.js} +1 -1
  12. package/dist/assets/{blockDiagram-677ZJIJ3-CbGC1IHl.js → blockDiagram-677ZJIJ3-BUk0vtJ7.js} +1 -1
  13. package/dist/assets/{book-open-xqEj1OLE.js → book-open-AteA89HX.js} +1 -1
  14. package/dist/assets/{c4Diagram-LMCZKHZV-BQhGC1Vc.js → c4Diagram-LMCZKHZV-CxDcVE9p.js} +1 -1
  15. package/dist/assets/card-BLXvBstA.js +1 -0
  16. package/dist/assets/channel-CpMstUPF.js +1 -0
  17. package/dist/assets/channels-list-page-fj8kMo-T.js +8 -0
  18. package/dist/assets/chunk-2Q5K7J3B-Djp3VF0s.js +1 -0
  19. package/dist/assets/{chunk-32BRIVSS-B74ZZwYG.js → chunk-32BRIVSS-DSF3KElA.js} +1 -1
  20. package/dist/assets/{chunk-52WLFC77-BvmxW_f_.js → chunk-52WLFC77-Costxzr3.js} +1 -1
  21. package/dist/assets/{chunk-5FCAYU7R-DQvBRnwL.js → chunk-5FCAYU7R-rhqzGGZo.js} +1 -1
  22. package/dist/assets/{chunk-5HE753X5-CDIH0_y3.js → chunk-5HE753X5-BsEsmIao.js} +1 -1
  23. package/dist/assets/{chunk-5JV3BV7I-CcevlKd-.js → chunk-5JV3BV7I-Dqw_DCoN.js} +1 -1
  24. package/dist/assets/{chunk-5TONJI2A-_3dxVdnY.js → chunk-5TONJI2A-Cft82fp8.js} +1 -1
  25. package/dist/assets/{chunk-5VM5RSS4-pGO5vvo-.js → chunk-5VM5RSS4-DqNHn9Dl.js} +1 -1
  26. package/dist/assets/{chunk-7BUUIJ7U-DEKF5uAN.js → chunk-7BUUIJ7U-A5SBEMYY.js} +1 -1
  27. package/dist/assets/{chunk-BIQX33UG-CjBFgq2r.js → chunk-BIQX33UG-1Ng3mTrH.js} +1 -1
  28. package/dist/assets/{chunk-C7G6YPKG-e_K9OGTz.js → chunk-C7G6YPKG-DRJEy8ZI.js} +1 -1
  29. package/dist/assets/{chunk-CQNSW5MT-C2IiHyHz.js → chunk-CQNSW5MT-Bydv_J3J.js} +1 -1
  30. package/dist/assets/{chunk-CYSBUYHQ-DCC6KmGp.js → chunk-CYSBUYHQ-HkMIg12u.js} +1 -1
  31. package/dist/assets/{chunk-EMLP6XTP-BYGgekQ0.js → chunk-EMLP6XTP-C5ndDvm3.js} +1 -1
  32. package/dist/assets/{chunk-EX3LRPZG-FGcwuVsA.js → chunk-EX3LRPZG-DzeloZRo.js} +1 -1
  33. package/dist/assets/{chunk-FWX5IMBZ-CV3Ih_Os.js → chunk-FWX5IMBZ-n_2_CLTQ.js} +2 -2
  34. package/dist/assets/{chunk-HOUHSVGY-CXpq_hfV.js → chunk-HOUHSVGY-kx_slvu3.js} +1 -1
  35. package/dist/assets/{chunk-ICXQ74PX-CZIpjupq.js → chunk-ICXQ74PX-sQLMURqL.js} +1 -1
  36. package/dist/assets/{chunk-JG7HCLWE-CdgwBpW7.js → chunk-JG7HCLWE-CMUn5Elc.js} +1 -1
  37. package/dist/assets/{chunk-JWPE2WC7-BPjAZpOQ.js → chunk-JWPE2WC7-Cra3s-Uk.js} +1 -1
  38. package/dist/assets/{chunk-MOJQB5TN-DbJDm8to.js → chunk-MOJQB5TN-umcrg5Bi.js} +1 -1
  39. package/dist/assets/{chunk-MOZMSUNE-BUa1fqKn.js → chunk-MOZMSUNE-BnljD1ig.js} +1 -1
  40. package/dist/assets/{chunk-OGEWGWER-CtnzLgRu.js → chunk-OGEWGWER-BXx5pQjU.js} +1 -1
  41. package/dist/assets/{chunk-OSBZ3O6U-fUgdpTUM.js → chunk-OSBZ3O6U-D-1qfdWu.js} +1 -1
  42. package/dist/assets/{chunk-PUDLZKDR-CtDWZT9-.js → chunk-PUDLZKDR-DLzX78LC.js} +1 -1
  43. package/dist/assets/{chunk-Q4XR5HBZ-BxnK2qxr.js → chunk-Q4XR5HBZ-DTK-rtW6.js} +1 -1
  44. package/dist/assets/{chunk-QBLGF6JB-CH4UKoCF.js → chunk-QBLGF6JB-CsFeIGfr.js} +1 -1
  45. package/dist/assets/{chunk-R7FJI6CG-BxwFoF1v.js → chunk-R7FJI6CG-4xNYUeng.js} +1 -1
  46. package/dist/assets/{chunk-RYQCIY6F-DpHAmq7O.js → chunk-RYQCIY6F-DJiHiTE5.js} +1 -1
  47. package/dist/assets/{chunk-U6XO7XAA-BjH2VUHU.js → chunk-U6XO7XAA-BVYkauHz.js} +1 -1
  48. package/dist/assets/{chunk-V7JOEXUC-DKJZ3HGj.js → chunk-V7JOEXUC-BsazE8cS.js} +1 -1
  49. package/dist/assets/chunk-VAUOI2AC-BrbiIC1Q.js +1 -0
  50. package/dist/assets/{chunk-VR4S4FIN-Cf-o2GtI.js → chunk-VR4S4FIN-7RoZQffO.js} +1 -1
  51. package/dist/assets/{chunk-WYO6CB5R-zeNXGm20.js → chunk-WYO6CB5R-DEuS6N1R.js} +3 -3
  52. package/dist/assets/chunk-XXDRQBXY-Cx9N40wF.js +1 -0
  53. package/dist/assets/{chunk-YOTPTUD7-Ck87Kqxe.js → chunk-YOTPTUD7-9KBrosZL.js} +1 -1
  54. package/dist/assets/{chunk-ZGVPDNZ5-BbfK6Bfd.js → chunk-ZGVPDNZ5-IYgN9f5A.js} +1 -1
  55. package/dist/assets/{chunk-ZIRB5QZD-BDpzh4Yl.js → chunk-ZIRB5QZD-BUo0-zcp.js} +1 -1
  56. package/dist/assets/{circle-dashed-CU3yApvP.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-DudCRJw4.js +1 -0
  60. package/dist/assets/config-split-page-G7Kt2BnV.js +1 -0
  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-CQfMxKCT.js → cose-bilkent-JH36ORCC-DhqbC1fR.js} +1 -1
  64. package/dist/assets/createLucideIcon-D7hvIHV-.js +1 -0
  65. package/dist/assets/cynefin-VYW2F7L2-DXUGnpJH.js +1 -0
  66. package/dist/assets/{cynefinDiagram-TSTJHNR4-CxFTiC-p.js → cynefinDiagram-TSTJHNR4-C-TBRi5V.js} +1 -1
  67. package/dist/assets/{dagre-CaBNMcB1.js → dagre-CrgsRasE.js} +1 -1
  68. package/dist/assets/{dagre-VKFMJZFB-S_7Hc7bI.js → dagre-VKFMJZFB-BmafJymp.js} +1 -1
  69. package/dist/assets/desktop-capabilities-page-CzqzFZUY.js +1 -0
  70. package/dist/assets/desktop-update-config-CgeQ0Ffo.js +1 -0
  71. package/dist/assets/{diagram-FQU43EPY-C7zENvFb.js → diagram-FQU43EPY-BoOMwa6D.js} +1 -1
  72. package/dist/assets/{diagram-G47NLZAW-DqYTCqZA.js → diagram-G47NLZAW-Le7N6Uym.js} +1 -1
  73. package/dist/assets/{diagram-NH7WQ7WH-BfSJtXRc.js → diagram-NH7WQ7WH-Fbpj3-MO.js} +1 -1
  74. package/dist/assets/{diagram-OA4YK3LP-CFO-j67H.js → diagram-OA4YK3LP-D3QuGGuu.js} +1 -1
  75. package/dist/assets/{diagram-WEI45ONY-DBQDbTaJ.js → diagram-WEI45ONY-Cxu1uiN6.js} +1 -1
  76. package/dist/assets/dialog-C7glmAQJ.js +5 -0
  77. package/dist/assets/doc-browser-context-BlhBAOLH.js +1 -0
  78. package/dist/assets/doc-browser-dBiR9Qi0.js +1 -0
  79. package/dist/assets/{docx-preview-B4-aDfvO.js → docx-preview-CkU2psnd.js} +1 -1
  80. package/dist/assets/download-BYgECE0n.js +1 -0
  81. package/dist/assets/{ebnfDiagram-CCIWWBDH-CfDNIXFN.js → ebnfDiagram-CCIWWBDH-CCAjuQM6.js} +1 -1
  82. package/dist/assets/{erDiagram-Q63AITRT-D95rFXMM.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-qYL-NpL3.js +1 -0
  86. package/dist/assets/{eye-C84inPcV.js → eye-BBuTzJ53.js} +1 -1
  87. package/dist/assets/flowDiagram-23GEKE2U-CqdsKk6x.js +1 -0
  88. package/dist/assets/form-actions-CLGWO52v.js +1 -0
  89. package/dist/assets/{ganttDiagram-NO4QXBWP-Bawg0P0r.js → ganttDiagram-NO4QXBWP-cJmWVY8F.js} +1 -1
  90. package/dist/assets/gitGraph-TEB2WS4Q-fHYFd9Es.js +1 -0
  91. package/dist/assets/{gitGraphDiagram-IHSO6WYX-BbKh9nbL.js → gitGraphDiagram-IHSO6WYX-F58o-vtP.js} +1 -1
  92. package/dist/assets/{i18n-20rSH40D.js → i18n-qBGEbcW6.js} +2 -2
  93. package/dist/assets/info-DKCQHKI2-CSaOL_bb.js +1 -0
  94. package/dist/assets/{infoDiagram-FWYZ7A6U-DPffZXYh.js → infoDiagram-FWYZ7A6U-Gt59b83C.js} +1 -1
  95. package/dist/assets/{ishikawaDiagram-FXEZZL3T-CBMsLwZ2.js → ishikawaDiagram-FXEZZL3T-1u4IAj1I.js} +1 -1
  96. package/dist/assets/{journeyDiagram-5HDEW3XC-Mz5U4OzU.js → journeyDiagram-5HDEW3XC-CCQsfV-5.js} +1 -1
  97. package/dist/assets/{kanban-definition-HUTT4EX6-FXZq2k19.js → kanban-definition-HUTT4EX6-vlB6O_Zn.js} +1 -1
  98. package/dist/assets/katex-B4FQSo9k.js +1 -0
  99. package/dist/assets/keyboard-shortcuts-settings-page-B-wK_6zG.js +1 -0
  100. package/dist/assets/{line-BZwCgT9K.js → line-D_bHubTL.js} +1 -1
  101. package/dist/assets/{linear-CTe9mKUw.js → linear-ChlwuS5y.js} +1 -1
  102. package/dist/assets/loader-circle-BA7EMkih.js +1 -0
  103. package/dist/assets/login-page-Cd84lpVV.js +1 -0
  104. package/dist/assets/login-page-VdMyNkFf.js +1 -0
  105. package/dist/assets/main-CR0SrTBf.js +2 -0
  106. package/dist/assets/main-DXH6EdXI.css +1 -0
  107. package/dist/assets/main-i18n-catalog.config-Btp_OowF.js +1 -0
  108. package/dist/assets/{map-Ci48ZwAp.js → map-oGHTsIu8.js} +1 -1
  109. package/dist/assets/mcp-marketplace-page-jacRwiI-.js +1 -0
  110. package/dist/assets/{mermaid-parser.core-CzPD3U_z.js → mermaid-parser.core-CuRe1ZG4.js} +2 -2
  111. package/dist/assets/{mermaid.core-geIMNPbV.js → mermaid.core-u4YCFKRf.js} +3 -3
  112. package/dist/assets/{mindmap-definition-LN4V7U3C-xqlKxsr_.js → mindmap-definition-LN4V7U3C-DeJAQYTu.js} +1 -1
  113. package/dist/assets/model-config-page-D0DQlSDa.js +1 -0
  114. package/dist/assets/navigation-history-CzErJuPG.js +1 -0
  115. package/dist/assets/navigation-link-32iM1-e6.js +3 -0
  116. package/dist/assets/{ordinal-MxnX8yhv.js → ordinal-C6JFfkKN.js} +1 -1
  117. package/dist/assets/packet-7NZHBO7P-D-YFTczs.js +1 -0
  118. package/dist/assets/panel-app-CC0bVSu4.js +1 -0
  119. package/dist/assets/panel-app-i18n-catalog.config-LUSBp5Ce.js +1 -0
  120. package/dist/assets/panelStandalone-C9EKaApN.js +2 -0
  121. package/dist/assets/{pegDiagram-2B236MQR-D50MFTN1.js → pegDiagram-2B236MQR-nVMkxShH.js} +1 -1
  122. package/dist/assets/pie-RZYD4A2V-VEnYu9s5.js +1 -0
  123. package/dist/assets/{pieDiagram-ENE6RG2P-CpA13oiC.js → pieDiagram-ENE6RG2P-8aUH44QZ.js} +1 -1
  124. package/dist/assets/privacy-settings-page-Bxxx12OO.js +1 -0
  125. package/dist/assets/projects-D56yAPNT.js +1 -0
  126. package/dist/assets/provider-models-C3frdXeW.js +1 -0
  127. package/dist/assets/provider-scoped-model-input-CYetrPYZ.js +1 -0
  128. package/dist/assets/providers-config-page-DESB1h8g.js +1 -0
  129. package/dist/assets/{puzzle-D6gulz7u.js → puzzle-CWHfFyYN.js} +1 -1
  130. package/dist/assets/pwa-CiGUjpcd.js +1 -0
  131. package/dist/assets/{quadrantDiagram-ABIIQ3AL-CYCgaj4l.js → quadrantDiagram-ABIIQ3AL-EY8hpFv8.js} +1 -1
  132. package/dist/assets/radar-I7S5WNFK-BFNIekC1.js +1 -0
  133. package/dist/assets/railroad-3IZDKUUU-lVqJ3Hak.js +1 -0
  134. package/dist/assets/railroad-abnf-AHOZXSZD-DYaefdFC.js +1 -0
  135. package/dist/assets/railroad-ebnf-EBAXGLYW-CTAk6lVq.js +1 -0
  136. package/dist/assets/railroad-peg-LSFZ7HO6-Cob294tg.js +1 -0
  137. package/dist/assets/{railroadDiagram-RFXS5EU6-4LKDGlXN.js → railroadDiagram-RFXS5EU6-CNhcIeji.js} +1 -1
  138. package/dist/assets/{refresh-cw-h9Xq3LY3.js → refresh-cw-y3L6PyLt.js} +1 -1
  139. package/dist/assets/remote-DiGFV8nP.js +1 -0
  140. package/dist/assets/{requirementDiagram-TGXJPOKE-CxNOU0JH.js → requirementDiagram-TGXJPOKE-D8Dcs-Rt.js} +1 -1
  141. package/dist/assets/{rotate-cw-B6xm41Wn.js → rotate-cw-CNE9qSHi.js} +1 -1
  142. package/dist/assets/runtime-config-page-5o98T-TD.js +1 -0
  143. package/dist/assets/{sankeyDiagram-HTMAVEWB-DbCBDe2S.js → sankeyDiagram-HTMAVEWB-HTrb6aa-.js} +1 -1
  144. package/dist/assets/{save-fff_WpY2.js → save-B0p5a0ET.js} +1 -1
  145. package/dist/assets/search-config-page-CpGcnIzi.js +1 -0
  146. package/dist/assets/secrets-config-page-C4VTiW3r.js +3 -0
  147. package/dist/assets/security-config-C5-RQVpS.js +1 -0
  148. package/dist/assets/select-CctTN205.js +1 -0
  149. package/dist/assets/{sequenceDiagram-DBY2YBRQ-DA6W2BS_.js → sequenceDiagram-DBY2YBRQ-6f_4X16Y.js} +1 -1
  150. package/dist/assets/service-apps-panel-CKE5HKNY.js +1 -0
  151. package/dist/assets/{settings-2-CE3ELQyk.js → settings-2-EPflrNk6.js} +1 -1
  152. package/dist/assets/{sizeCapture-X5ZJPWSS-T_q_d_VW.js → sizeCapture-X5ZJPWSS-Ck9rsuwL.js} +1 -1
  153. package/dist/assets/{src-CYpUlx-4.js → src-C8AUg09O.js} +1 -1
  154. package/dist/assets/{stateDiagram-2N3HPSRC-mi8z2G0a.js → stateDiagram-2N3HPSRC-Cm33MLHu.js} +1 -1
  155. package/dist/assets/stateDiagram-v2-6OUMAXLB-BrNv-raG.js +1 -0
  156. package/dist/assets/status-dot-CensgJZC.js +1 -0
  157. package/dist/assets/{swimlanes-5IMT3BWC-DkBEhWE4.js → swimlanes-5IMT3BWC-B107vmvM.js} +2 -2
  158. package/dist/assets/swimlanesDiagram-G3AALYLV-ntcxaPXp.js +8 -0
  159. package/dist/assets/tag-chip-Bjzb4-qW.js +1 -0
  160. package/dist/assets/theme-provider-hlle7Skk.js +1 -0
  161. package/dist/assets/{timeline-definition-FHXFAJF6-BoFmqBw1.js → timeline-definition-FHXFAJF6-CJEoAj33.js} +1 -1
  162. package/dist/assets/trash-2-C5KH5Rw9.js +1 -0
  163. package/dist/assets/treeView-QDETBFTQ-DbFmr-gw.js +1 -0
  164. package/dist/assets/treemap-6X3UGDF4-C8aY96pi.js +1 -0
  165. package/dist/assets/use-config-CPl_F79t.js +1 -0
  166. package/dist/assets/use-desktop-capabilities-CEg9-DrQ.js +1 -0
  167. package/dist/assets/use-viewport-layout-CPZUmTPi.js +1 -0
  168. package/dist/assets/{vennDiagram-L72KCM5P-BlZ3Or5U.js → vennDiagram-L72KCM5P-DzsUHk5I.js} +1 -1
  169. package/dist/assets/wardley-OPB4EBWU-D8d6DbbJ.js +1 -0
  170. package/dist/assets/{wardleyDiagram-EHGQE667-yDfr33i3.js → wardleyDiagram-EHGQE667-1NfFs5ua.js} +1 -1
  171. package/dist/assets/x--xxUvHKW.js +1 -0
  172. package/dist/assets/{xychartDiagram-FW5EYKEG-mIXwIGAQ.js → xychartDiagram-FW5EYKEG-Ci8AI3Qo.js} +1 -1
  173. package/dist/index.html +38 -54
  174. package/dist/panel-standalone.html +11 -15
  175. package/package.json +8 -8
  176. package/src/app/components/layout/__tests__/app-layout.test.tsx +7 -0
  177. package/src/app/components/layout/__tests__/sidebar.layout.test.tsx +36 -16
  178. package/src/app/components/layout/app-layout.tsx +18 -46
  179. package/src/app/components/layout/sidebar-items.tsx +27 -18
  180. package/src/app/components/layout/sidebar-rail.styles.ts +11 -2
  181. package/src/app/components/layout/sidebar.tsx +3 -2
  182. package/src/app/configs/__tests__/app-navigation.config.test.ts +4 -0
  183. package/src/app/configs/app-navigation.config.ts +41 -86
  184. package/src/app/configs/page-resource-renderers.config.ts +13 -0
  185. package/src/app/index.tsx +4 -0
  186. package/src/app/presenters/app.presenter.ts +13 -2
  187. package/src/features/agents/components/__tests__/agents-page.test.tsx +4 -0
  188. package/src/features/agents/components/agent-details-dialog.tsx +5 -2
  189. package/src/features/agents/components/agents-page.tsx +9 -4
  190. package/src/features/apps/components/app-package-card.tsx +2 -2
  191. package/src/features/chat/components/conversation/chat-conversation-content.tsx +32 -19
  192. package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +1 -0
  193. package/src/features/chat/components/conversation/chat-conversation-header.tsx +1 -1
  194. package/src/features/chat/components/conversation/chat-conversation-panel.tsx +2 -2
  195. package/src/features/chat/components/conversation/chat-conversation-workspace-section.tsx +1 -0
  196. package/src/features/chat/components/layout/__tests__/chat-page-shell.test.tsx +5 -6
  197. package/src/features/chat/components/layout/__tests__/chat-sidebar-toolbar.test.tsx +14 -12
  198. package/src/features/chat/components/layout/chat-page-shell.tsx +31 -64
  199. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +8 -5
  200. package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +64 -256
  201. package/src/features/chat/components/layout/chat-sidebar.tsx +8 -30
  202. package/src/features/chat/components/providers/chat-runtime.provider.tsx +62 -0
  203. package/src/features/chat/features/conversation/components/__tests__/floating-session-conversation.test.tsx +70 -0
  204. package/src/features/chat/features/conversation/components/chat-voice-input-panel.tsx +3 -2
  205. package/src/features/chat/features/conversation/components/floating-session-conversation.tsx +27 -0
  206. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +1 -0
  207. package/src/features/chat/features/conversation/components/session-conversation-panel-tab.tsx +25 -0
  208. package/src/features/chat/features/conversation/hooks/__tests__/use-chat-voice-input.test.tsx +4 -0
  209. package/src/features/chat/features/conversation/hooks/use-chat-composer-reference-intent.ts +2 -1
  210. package/src/features/chat/features/message/components/__tests__/chat-inline-panel-app-card.test.tsx +2 -1
  211. package/src/features/chat/features/message/components/__tests__/chat-message-assistant-header.container.test.tsx +3 -0
  212. package/src/features/chat/features/message/components/__tests__/chat-message-list-skill-preview.container.test.tsx +3 -0
  213. package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +35 -47
  214. package/src/features/chat/features/message/components/chat-message-list.container.tsx +6 -10
  215. package/src/features/chat/features/message/hooks/use-chat-inline-token-actions.ts +7 -3
  216. package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +52 -6
  217. package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +22 -37
  218. package/src/features/chat/features/session/components/__tests__/chat-sidebar-project-groups.test.tsx +1 -1
  219. package/src/features/chat/features/session/components/__tests__/chat-sidebar-session-item.test.tsx +21 -0
  220. package/src/features/chat/features/session/components/chat-mobile-session-row.tsx +61 -0
  221. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +4 -37
  222. package/src/features/chat/features/session/components/chat-sidebar-session-entry.tsx +2 -0
  223. package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +18 -7
  224. package/src/features/chat/features/session/components/chat-sidebar-session-list.tsx +5 -3
  225. package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +10 -2
  226. package/src/features/chat/features/session/components/session-header/chat-session-header-actions.tsx +20 -17
  227. package/src/features/chat/features/session/components/session-header/chat-session-header-menu-item.tsx +4 -4
  228. package/src/features/chat/features/session/components/session-header/chat-session-more-actions-menu.tsx +18 -5
  229. package/src/features/chat/features/session/utils/chat-session-route.utils.ts +12 -0
  230. package/src/features/chat/features/workspace/components/__tests__/chat-session-child-sessions.test.tsx +28 -0
  231. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.test.tsx +9 -0
  232. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +6 -2
  233. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel.test.tsx +49 -12
  234. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +13 -6
  235. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +6 -0
  236. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +21 -36
  237. package/src/features/chat/features/workspace/components/chat-session-workspace-panel.tsx +40 -31
  238. package/src/features/chat/features/workspace/components/child-sessions/chat-session-child-sessions.tsx +6 -1
  239. package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +2 -2
  240. package/src/features/chat/features/workspace/components/project-files/workspace-project-files-toolbar.tsx +2 -2
  241. package/src/features/chat/features/workspace/utils/__tests__/chat-workspace-panel-view-model.utils.test.ts +27 -0
  242. package/src/features/chat/features/workspace/utils/__tests__/workspace-file-panel-route.utils.test.ts +94 -0
  243. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab-persistence.utils.ts +2 -0
  244. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab.utils.ts +15 -0
  245. package/src/features/chat/features/workspace/utils/chat-workspace-panel-view-model.utils.ts +11 -0
  246. package/src/features/chat/features/workspace/utils/workspace-file-panel-route.utils.ts +147 -0
  247. package/src/features/chat/index.ts +20 -4
  248. package/src/features/chat/managers/__tests__/chat-completion-notification.manager.test.ts +8 -0
  249. package/src/features/chat/managers/__tests__/chat-thread-workspace.manager.test.ts +7 -2
  250. package/src/features/chat/managers/__tests__/session-surface.manager.test.ts +45 -0
  251. package/src/features/chat/managers/chat-completion-notification.manager.ts +5 -0
  252. package/src/features/chat/managers/chat-composer-intent.manager.ts +16 -0
  253. package/src/features/chat/managers/chat-thread.manager.ts +18 -27
  254. package/src/features/chat/managers/chat-voice-input.manager.ts +5 -3
  255. package/src/features/chat/managers/session-surface.manager.ts +46 -0
  256. package/src/features/chat/pages/__tests__/ncp-chat-page.test.tsx +23 -5
  257. package/src/features/chat/pages/ncp-chat-page.tsx +6 -86
  258. package/src/features/chat/presenters/chat.presenter.ts +2 -1
  259. package/src/features/chat/stores/__tests__/chat-thread.store.test.ts +2 -2
  260. package/src/features/chat/stores/chat-thread.store.ts +7 -1
  261. package/src/features/chat/stores/floating-session.store.ts +11 -0
  262. package/src/features/chat/utils/chat-voice-permissions.utils.test.ts +12 -1
  263. package/src/features/chat/utils/chat-voice-permissions.utils.ts +6 -1
  264. package/src/features/cron/components/__tests__/cron-config.test.tsx +4 -0
  265. package/src/features/cron/components/cron-job-detail-dialog.tsx +3 -1
  266. package/src/features/cron/components/cron-job-row.tsx +14 -8
  267. package/src/features/inbox/components/inbox-reader-dialog.test.tsx +3 -0
  268. package/src/features/inbox/components/inbox-reader-dialog.tsx +6 -1
  269. package/src/features/inbox/pages/inbox-page.test.ts +3 -0
  270. package/src/features/inbox/pages/inbox-page.tsx +12 -4
  271. package/src/features/marketplace/components/__tests__/marketplace-page-detail.test.tsx +5 -1
  272. package/src/features/marketplace/components/__tests__/marketplace-page.test.tsx +3 -0
  273. package/src/features/marketplace/components/curated-shelves/__tests__/marketplace-curated-scene-route.test.tsx +2 -0
  274. package/src/features/marketplace/components/marketplace-list-card.tsx +4 -0
  275. package/src/features/marketplace/components/mcp/__tests__/mcp-marketplace-page.test.tsx +2 -0
  276. package/src/features/marketplace/components/mcp/mcp-marketplace-card.tsx +3 -0
  277. package/src/features/notifications/components/__tests__/app-notification-toast.test.tsx +19 -0
  278. package/src/features/notifications/components/app-notification-toast.tsx +33 -15
  279. package/src/features/notifications/managers/app-notification.manager.ts +2 -0
  280. package/src/features/panel-apps/components/__tests__/panel-app-list-item.test.tsx +13 -4
  281. package/src/features/panel-apps/components/__tests__/panel-app-toolbar.test.tsx +13 -5
  282. package/src/features/panel-apps/components/panel-app-list-item.tsx +1 -1
  283. package/src/features/panel-apps/components/panel-app-main-sidebar-menu-item.tsx +5 -38
  284. package/src/features/panel-apps/components/panel-app-toolbar.tsx +7 -7
  285. package/src/features/panel-apps/index.ts +1 -1
  286. package/src/features/projects/components/project-materials.test.tsx +2 -0
  287. package/src/features/projects/components/project-skills.tsx +7 -3
  288. package/src/features/projects/components/work/project-work-item-drawer.test.tsx +2 -0
  289. package/src/features/projects/components/work/project-work-item-drawer.tsx +3 -1
  290. package/src/features/right-panel-resources/components/__tests__/page-resource-icon.test.tsx +67 -0
  291. package/src/features/right-panel-resources/components/__tests__/page-resource-sidebar-nav.test.tsx +183 -0
  292. package/src/features/right-panel-resources/components/__tests__/system-object-resource.test.tsx +42 -0
  293. package/src/features/right-panel-resources/components/page-resource-actions-menu.tsx +53 -0
  294. package/src/features/right-panel-resources/components/page-resource-icon.tsx +245 -0
  295. package/src/features/right-panel-resources/components/page-resource-sidebar-nav.tsx +119 -0
  296. package/src/features/right-panel-resources/components/system-object-resource.tsx +100 -0
  297. package/src/features/right-panel-resources/components/workspace-file-resource.tsx +56 -0
  298. package/src/features/right-panel-resources/configs/right-panel-resource-routes.config.ts +46 -3
  299. package/src/features/right-panel-resources/hooks/use-page-resource-actions.ts +190 -0
  300. package/src/features/right-panel-resources/index.ts +21 -8
  301. package/src/features/right-panel-resources/managers/__tests__/page-resource.manager.test.ts +149 -0
  302. package/src/features/right-panel-resources/managers/page-resource.manager.ts +342 -0
  303. package/src/features/right-panel-resources/pages/resource-page.tsx +114 -0
  304. package/src/features/right-panel-resources/stores/page-navigation.store.ts +55 -0
  305. package/src/features/right-panel-resources/types/page-resource.types.ts +11 -0
  306. package/src/features/right-panel-resources/utils/__tests__/right-panel-resource-route-resolver.utils.test.ts +10 -0
  307. package/src/features/right-panel-resources/utils/page-resource-identity.utils.ts +61 -0
  308. package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +2 -6
  309. package/src/features/service-apps/components/__tests__/service-apps-panel.test.tsx +2 -0
  310. package/src/features/service-apps/components/service-app-list-item.tsx +6 -1
  311. package/src/features/settings/pages/providers-config-page.tsx +2 -2
  312. package/src/features/side-dock/components/__tests__/side-dock.test.tsx +9 -8
  313. package/src/features/side-dock/components/side-dock.tsx +14 -47
  314. package/src/features/side-dock/managers/side-dock.manager.ts +2 -0
  315. package/src/features/system-status/components/__tests__/desktop-update-config.test.tsx +40 -0
  316. package/src/features/system-status/components/desktop-update-config.tsx +19 -1
  317. package/src/platforms/desktop/components/__tests__/desktop-app-shell.test.tsx +2 -0
  318. package/src/platforms/desktop/components/desktop-app-shell.tsx +3 -14
  319. package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +1 -0
  320. package/src/platforms/mobile/components/__tests__/mobile-bottom-nav.test.tsx +3 -2
  321. package/src/platforms/mobile/components/mobile-app-shell.tsx +3 -4
  322. package/src/platforms/mobile/components/mobile-bottom-nav.tsx +7 -7
  323. package/src/platforms/mobile/components/mobile-settings-shell.tsx +8 -3
  324. package/src/platforms/mobile/components/mobile-topbar.tsx +4 -4
  325. package/src/shared/components/doc-browser/__tests__/doc-browser-context.test.tsx +4 -3
  326. package/src/shared/components/doc-browser/__tests__/doc-browser-tab-strip.test.tsx +0 -5
  327. package/src/shared/components/doc-browser/__tests__/doc-browser.test.tsx +57 -73
  328. package/src/shared/components/doc-browser/__tests__/resource-link-interceptor.test.tsx +104 -0
  329. package/src/shared/components/doc-browser/doc-browser-context.tsx +5 -1
  330. package/src/shared/components/doc-browser/doc-browser-panel-parts.tsx +1 -1
  331. package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +6 -118
  332. package/src/shared/components/doc-browser/doc-browser.tsx +30 -194
  333. package/src/shared/components/doc-browser/hooks/use-doc-browser-scroll-restoration.ts +1 -1
  334. package/src/shared/components/doc-browser/managers/doc-browser.manager.ts +11 -1
  335. package/src/shared/components/doc-browser/stores/doc-browser.store.ts +3 -7
  336. package/src/shared/components/doc-browser/types/doc-browser.types.ts +8 -1
  337. package/src/shared/components/doc-browser/use-doc-link-interceptor.ts +30 -32
  338. package/src/shared/components/doc-browser/utils/doc-browser-state.utils.ts +6 -6
  339. package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +105 -1
  340. package/src/shared/components/ui/context-menu/context-menu-items.tsx +173 -0
  341. package/src/shared/components/ui/context-menu/context-menu.tsx +99 -112
  342. package/src/shared/components/ui/dialog.tsx +4 -0
  343. package/src/shared/components/ui/overlays/sheet.tsx +4 -0
  344. package/src/shared/components/ui/popover.tsx +10 -4
  345. package/src/shared/components/workbench/__tests__/workbench-surface.manager.test.ts +70 -0
  346. package/src/shared/components/workbench/__tests__/workbench-surface.test.tsx +111 -0
  347. package/src/shared/components/workbench/managers/workbench-surface.manager.ts +120 -0
  348. package/src/shared/components/workbench/stores/workbench-surface.store.ts +83 -0
  349. package/src/shared/components/workbench/types/workbench-surface.types.ts +32 -0
  350. package/src/shared/components/workbench/utils/workbench-surface-geometry.utils.ts +46 -0
  351. package/src/shared/components/workbench/workbench-surface-toolbar.tsx +102 -0
  352. package/src/shared/components/workbench/workbench-surface.tsx +401 -0
  353. package/src/shared/hooks/use-panel-app-scroll-restoration.test.tsx +19 -0
  354. package/src/shared/hooks/use-panel-app-scroll-restoration.ts +8 -6
  355. package/src/shared/hooks/use-scroll-restoration.test.tsx +39 -2
  356. package/src/shared/hooks/use-scroll-restoration.ts +33 -33
  357. package/src/shared/lib/api/marketplace.types.ts +1 -0
  358. package/src/shared/lib/i18n/locales/en-US/chat.json +46 -1
  359. package/src/shared/lib/i18n/locales/en-US/core.json +3 -1
  360. package/src/shared/lib/i18n/locales/en-US/desktop-update.json +1 -0
  361. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +1 -1
  362. package/src/shared/lib/i18n/locales/zh-CN/chat.json +46 -1
  363. package/src/shared/lib/i18n/locales/zh-CN/core.json +11 -9
  364. package/src/shared/lib/i18n/locales/zh-CN/desktop-update.json +1 -0
  365. package/src/shared/lib/navigation-history/index.ts +1 -0
  366. package/src/shared/lib/navigation-history/navigation-history.utils.ts +1 -1
  367. package/src/shared/lib/navigation-history/scroll-restoration.manager.test.ts +11 -0
  368. package/src/shared/lib/navigation-history/scroll-restoration.manager.ts +36 -7
  369. package/src/shared/lib/navigation-history/view-memory-storage.store.test.ts +37 -0
  370. package/src/shared/lib/navigation-history/view-memory-storage.store.ts +21 -0
  371. package/src/shared/lib/transport/__tests__/browser-realtime-recovery.service.test.ts +27 -2
  372. package/src/shared/lib/transport/__tests__/local-transport.service.test.ts +20 -0
  373. package/src/shared/lib/transport/__tests__/remote.transport.test.ts +26 -0
  374. package/src/shared/lib/transport/browser-realtime-recovery.service.ts +32 -5
  375. package/src/shared/lib/transport/local-transport.service.ts +1 -6
  376. package/src/shared/lib/transport/remote-transport.service.ts +22 -1
  377. package/src/shared/lib/ui-document-title/index.ts +1 -0
  378. package/dist/assets/account-panel-BW4GbzQd.js +0 -1
  379. package/dist/assets/api-DqzQ-_3w.js +0 -13
  380. package/dist/assets/app-data-C54N2p8b.js +0 -1
  381. package/dist/assets/app-presenter-provider-CBZ_-ewx.js +0 -115
  382. package/dist/assets/appearance-settings-page-C-uZ2Wkf.js +0 -1
  383. package/dist/assets/architecture-TIHT7OUA-DEt0Abz9.js +0 -1
  384. package/dist/assets/boxes-D6uPnkGo.js +0 -1
  385. package/dist/assets/card-BhfAZv5L.js +0 -1
  386. package/dist/assets/channel-CxQkbwRD.js +0 -1
  387. package/dist/assets/channels-list-page-Bv7CVSqV.js +0 -8
  388. package/dist/assets/chevron-down-BL-yMYcX.js +0 -1
  389. package/dist/assets/chunk-2Q5K7J3B-ClVhziok.js +0 -1
  390. package/dist/assets/chunk-VAUOI2AC-DZQxkIsv.js +0 -1
  391. package/dist/assets/chunk-XXDRQBXY-BkExtw5C.js +0 -1
  392. package/dist/assets/circle-alert-lSa3LRvS.js +0 -1
  393. package/dist/assets/classDiagram-OUVF2IWQ-Bd6apBb-.js +0 -1
  394. package/dist/assets/classDiagram-v2-EOCWNBFH-CYxUZGCI.js +0 -1
  395. package/dist/assets/client-BtGBwLTs.js +0 -1
  396. package/dist/assets/config-split-page-DqAXKLmG.js +0 -1
  397. package/dist/assets/confirm-dialog-BTKCWMn6.js +0 -1
  398. package/dist/assets/createLucideIcon-BNKf0_kc.js +0 -1
  399. package/dist/assets/cynefin-VYW2F7L2-CV0bFLH9.js +0 -1
  400. package/dist/assets/desktop-capabilities-page-zLzCSB7A.js +0 -1
  401. package/dist/assets/desktop-update-config-PmofcFf6.js +0 -1
  402. package/dist/assets/dialog-Xe73hpQz.js +0 -5
  403. package/dist/assets/dist-BiIcnf9j.js +0 -1
  404. package/dist/assets/dist-C5I0v8Qn.js +0 -1
  405. package/dist/assets/dist-czPa8xFO.js +0 -1
  406. package/dist/assets/doc-browser-BJrre2S_.js +0 -1
  407. package/dist/assets/doc-browser-BPqA-zQx.js +0 -1
  408. package/dist/assets/doc-browser-context-TILuCY5c.js +0 -1
  409. package/dist/assets/ellipsis-C5YXdOUx.js +0 -1
  410. package/dist/assets/es2015-cuwbYI-l.js +0 -41
  411. package/dist/assets/eventmodeling-45OFAUF4-BzkLWWdP.js +0 -1
  412. package/dist/assets/extensions-CVUFK6Jj.js +0 -1
  413. package/dist/assets/flowDiagram-23GEKE2U-ukkCsB0j.js +0 -1
  414. package/dist/assets/form-actions-BRESe-m_.js +0 -1
  415. package/dist/assets/gitGraph-TEB2WS4Q-BYFhT0Q5.js +0 -1
  416. package/dist/assets/i18n-provider-BPRq6S7O.js +0 -1
  417. package/dist/assets/info-DKCQHKI2-CTmlJdcH.js +0 -1
  418. package/dist/assets/katex-DbZC06Q5.js +0 -1
  419. package/dist/assets/keyboard-shortcuts-settings-page-CScSXYS4.js +0 -1
  420. package/dist/assets/loader-circle-K1BDdHR5.js +0 -1
  421. package/dist/assets/login-page-Dlyvp-81.js +0 -1
  422. package/dist/assets/login-page-f8qQ4xKY.js +0 -1
  423. package/dist/assets/logo-badge-C-5-zim6.js +0 -1
  424. package/dist/assets/main-D2dWy8fM.css +0 -1
  425. package/dist/assets/main-DMNmwcJE.js +0 -2
  426. package/dist/assets/main-i18n-catalog.config-DZ-5ollN.js +0 -1
  427. package/dist/assets/mcp-marketplace-page-FfIfEo6w.js +0 -10
  428. package/dist/assets/mcp-marketplace-page-sH7VptN_.js +0 -1
  429. package/dist/assets/model-config-page-Bcm6-pCX.js +0 -1
  430. package/dist/assets/navigation-link-BAQjgx2F.js +0 -3
  431. package/dist/assets/packet-7NZHBO7P-BbrI0ZlN.js +0 -1
  432. package/dist/assets/panel-app-B39rJPj8.js +0 -1
  433. package/dist/assets/panel-app-i18n-catalog.config-p3qAY_Eq.js +0 -1
  434. package/dist/assets/panelStandalone-By-6dDXS.js +0 -2
  435. package/dist/assets/pie-RZYD4A2V-B7zE1ZIr.js +0 -1
  436. package/dist/assets/plus-LA8-jpxP.js +0 -1
  437. package/dist/assets/popover-NkrFlWHp.js +0 -1
  438. package/dist/assets/privacy-settings-page-B1sHLAc1.js +0 -1
  439. package/dist/assets/projects-Voql-cvx.js +0 -1
  440. package/dist/assets/provider-models-hrHMcHqg.js +0 -1
  441. package/dist/assets/provider-scoped-model-input-BQsugx1v.js +0 -1
  442. package/dist/assets/providers-config-page-BDEdHJbw.js +0 -1
  443. package/dist/assets/pwa-CzqfYjFx.js +0 -1
  444. package/dist/assets/radar-I7S5WNFK-1X_q11Ed.js +0 -1
  445. package/dist/assets/railroad-3IZDKUUU-CIXnuFyE.js +0 -1
  446. package/dist/assets/railroad-abnf-AHOZXSZD-D6ImKl2r.js +0 -1
  447. package/dist/assets/railroad-ebnf-EBAXGLYW-2j9d3twU.js +0 -1
  448. package/dist/assets/railroad-peg-LSFZ7HO6-DMVaJGbm.js +0 -1
  449. package/dist/assets/remote-BekqL5nA.js +0 -1
  450. package/dist/assets/runtime-config-page-BH9uF4u_.js +0 -1
  451. package/dist/assets/search-CUe41wjm.js +0 -1
  452. package/dist/assets/search-config-page-DWKlMHgH.js +0 -1
  453. package/dist/assets/secrets-config-page-DiQL088Y.js +0 -3
  454. package/dist/assets/security-config-DmTDKKY4.js +0 -1
  455. package/dist/assets/select-CG5YWnwe.js +0 -1
  456. package/dist/assets/service-apps-panel-CEnyYsQp.js +0 -1
  457. package/dist/assets/skeleton-Drvn83YW.js +0 -1
  458. package/dist/assets/stateDiagram-v2-6OUMAXLB-OlIMT57r.js +0 -1
  459. package/dist/assets/swimlanesDiagram-G3AALYLV-sLThrh07.js +0 -8
  460. package/dist/assets/tabs-BuE0qKMh.js +0 -1
  461. package/dist/assets/tag-chip-B1AYPOKL.js +0 -1
  462. package/dist/assets/theme-provider-DzvAi3pe.js +0 -1
  463. package/dist/assets/tooltip-DYcuWhuP.js +0 -1
  464. package/dist/assets/trash-2-BPPYt2NV.js +0 -1
  465. package/dist/assets/treeView-QDETBFTQ-CCFyazDE.js +0 -1
  466. package/dist/assets/treemap-6X3UGDF4-D6wvq1Hz.js +0 -1
  467. package/dist/assets/use-config-BEdbtpD4.js +0 -1
  468. package/dist/assets/use-desktop-capabilities-BkuRd2cY.js +0 -1
  469. package/dist/assets/use-panel-app-scroll-restoration-ZnicIfo3.js +0 -1
  470. package/dist/assets/use-viewport-layout-BS18drMT.js +0 -1
  471. package/dist/assets/utils-CBZPzC_b.js +0 -8
  472. package/dist/assets/wardley-OPB4EBWU-BRzaRyFf.js +0 -1
  473. package/dist/assets/x-DdXOqLnX.js +0 -1
  474. package/src/features/panel-apps/components/__tests__/panel-app-main-sidebar-nav.test.tsx +0 -219
  475. package/src/features/panel-apps/components/panel-app-main-sidebar-nav.tsx +0 -258
  476. package/src/shared/components/doc-browser/utils/doc-browser-floating-panel.utils.ts +0 -83
  477. /package/dist/assets/{array-D0DyKZdT.js → array-BV9OtnO8.js} +0 -0
  478. /package/dist/assets/{chunk-KEIR6QF5-CuZFOa6q.js → chunk-KEIR6QF5-Cx-8EJ4_.js} +0 -0
  479. /package/dist/assets/{chunk-Y2CYZVJY-Frut-1TF.js → chunk-Y2CYZVJY-Dy1ufvjf.js} +0 -0
  480. /package/dist/assets/{config-hints-B_C9DAp5.js → config-hints-DbmiyTKg.js} +0 -0
  481. /package/dist/assets/{cytoscape.esm-BibuhnZD.js → cytoscape.esm-CSCjuT4Z.js} +0 -0
  482. /package/dist/assets/{defaultLocale-q7sRUXPc.js → defaultLocale-DWTiNsbT.js} +0 -0
  483. /package/dist/assets/{dist-DhMddrrH.js → dist-BVCSkfWY.js} +0 -0
  484. /package/dist/assets/{graphlib-BM63WsW3.js → graphlib-B1yb1Wl8.js} +0 -0
  485. /package/dist/assets/{host-capabilities-B107nwS3.js → host-capabilities-DuIFVsvM.js} +0 -0
  486. /package/dist/assets/{init-CRMkf9sL.js → init-BF6GH5oe.js} +0 -0
  487. /package/dist/assets/{jszip.min-6thm2J_a.js → jszip.min-D12teKzP.js} +0 -0
  488. /package/dist/assets/{katex-B26hhTOT.js → katex-CsAM73R9.js} +0 -0
  489. /package/dist/assets/{middleware-0o3JF3tS.js → middleware-B--6mAUM.js} +0 -0
  490. /package/dist/assets/{path-BFMmafCM.js → path-C56XkznJ.js} +0 -0
  491. /package/dist/assets/{rough.esm-5Tjchx1D.js → rough.esm-CGfeEbtE.js} +0 -0
  492. /package/dist/assets/{xlsx-BC8ibjXK.js → xlsx-sds5nUpL.js} +0 -0
@@ -1,3 +1,4 @@
1
+ import { WorkbenchSurfaceManager } from '@/shared/components/workbench/managers/workbench-surface.manager';
1
2
  import { fireEvent, render, screen, waitFor } from '@testing-library/react';
2
3
  import { beforeEach, describe, expect, it, vi } from 'vitest';
3
4
  import {
@@ -23,7 +24,7 @@ describe('SideDock', () => {
23
24
  it('renders built-in entries and opens the selected resource', () => {
24
25
  const openItem = vi.fn();
25
26
  const manager = { openItem } as unknown as SideDockManager;
26
- const docBrowserManager = new DocBrowserManager();
27
+ const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
27
28
 
28
29
  render(
29
30
  <DocBrowserProvider manager={docBrowserManager}>
@@ -47,7 +48,7 @@ describe('SideDock', () => {
47
48
 
48
49
  it('places the GitHub project shortcut in the utility section', () => {
49
50
  const manager = { openItem: vi.fn() } as unknown as SideDockManager;
50
- const docBrowserManager = new DocBrowserManager();
51
+ const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
51
52
 
52
53
  render(
53
54
  <DocBrowserProvider manager={docBrowserManager}>
@@ -62,7 +63,7 @@ describe('SideDock', () => {
62
63
 
63
64
  it('confirms before hiding the dock and persists the visibility preference', async () => {
64
65
  const manager = { openItem: vi.fn() } as unknown as SideDockManager;
65
- const docBrowserManager = new DocBrowserManager();
66
+ const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
66
67
 
67
68
  render(
68
69
  <DocBrowserProvider manager={docBrowserManager}>
@@ -85,7 +86,7 @@ describe('SideDock', () => {
85
86
 
86
87
  it('does not highlight the default docs tab while DocBrowser is closed', () => {
87
88
  const manager = { openItem: vi.fn() } as unknown as SideDockManager;
88
- const docBrowserManager = new DocBrowserManager();
89
+ const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
89
90
 
90
91
  render(
91
92
  <DocBrowserProvider manager={docBrowserManager}>
@@ -105,7 +106,7 @@ describe('SideDock', () => {
105
106
  openItem: vi.fn(),
106
107
  unpinItem: vi.fn(),
107
108
  } as unknown as SideDockManager;
108
- const docBrowserManager = new DocBrowserManager();
109
+ const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
109
110
  useSideDockStore.getState().setPinnedItems([
110
111
  {
111
112
  createdAt: '2026-06-02T00:00:00.000Z',
@@ -134,7 +135,7 @@ describe('SideDock', () => {
134
135
  openItem: vi.fn(),
135
136
  unpinItem: vi.fn(),
136
137
  } as unknown as SideDockManager;
137
- const docBrowserManager = new DocBrowserManager();
138
+ const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
138
139
  useSideDockStore.getState().setPinnedItems([
139
140
  {
140
141
  createdAt: '2026-06-02T00:00:00.000Z',
@@ -159,7 +160,7 @@ describe('SideDock', () => {
159
160
  openItem: vi.fn(),
160
161
  unpinItem: vi.fn(),
161
162
  } as unknown as SideDockManager;
162
- const docBrowserManager = new DocBrowserManager();
163
+ const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
163
164
  useSideDockStore.getState().setPinnedItems([
164
165
  {
165
166
  createdAt: '2026-06-02T00:00:00.000Z',
@@ -176,6 +177,6 @@ describe('SideDock', () => {
176
177
  </DocBrowserProvider>,
177
178
  );
178
179
 
179
- expect(screen.getByText('🎨').className).toContain('text-[20px]');
180
+ expect(screen.getByText('🎨').parentElement?.className).toContain('text-xl');
180
181
  });
181
182
  });
@@ -1,4 +1,4 @@
1
- import { AppWindow, BookOpen, Boxes, Github, PanelRightClose, Plus, X } from 'lucide-react';
1
+ import { PanelRightClose, X } from 'lucide-react';
2
2
  import type { LucideIcon } from 'lucide-react';
3
3
  import type { SideDockManager } from '@/features/side-dock/managers/side-dock.manager';
4
4
  import {
@@ -7,9 +7,7 @@ import {
7
7
  } from '@/features/side-dock/configs/side-dock-built-in-items.config';
8
8
  import { useSideDockStore } from '@/features/side-dock/stores/side-dock.store';
9
9
  import type {
10
- SideDockIconName,
11
10
  SideDockItem,
12
- SideDockItemIcon,
13
11
  } from '@/features/side-dock/types/side-dock.types';
14
12
  import { mergeSideDockItems } from '@/features/side-dock/utils/side-dock-item.utils';
15
13
  import {
@@ -26,56 +24,23 @@ import { useConfirmDialog } from '@/shared/hooks/use-confirm-dialog';
26
24
  import { t } from '@/shared/lib/i18n';
27
25
  import { cn } from '@/shared/lib/utils';
28
26
 
27
+ import { PageResourceIcon } from '@/features/right-panel-resources';
28
+ import { ContextMenu, type ContextMenuGroup } from '@/shared/components/ui/context-menu/context-menu';
29
+
29
30
  type SideDockProps = {
31
+ getItemMenuGroups?: (item: SideDockItem) => ContextMenuGroup[];
30
32
  manager: SideDockManager;
31
33
  };
32
34
 
33
- const SIDE_DOCK_ICON_COMPONENTS: Record<SideDockIconName, LucideIcon> = {
34
- apps: Boxes,
35
- docs: BookOpen,
36
- github: Github,
37
- 'new-tab': Plus,
38
- 'panel-app': AppWindow,
39
- 'service-apps': AppWindow,
40
- };
41
-
42
- const SIDE_DOCK_UTILITY_ITEM_IDS = new Set<string>([SIDE_DOCK_GITHUB_PROJECT_ITEM_ID]);
43
-
44
- const SIDE_DOCK_EMOJI_ICON_PATTERN = /^\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?(?:\u200D\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?)*$/u;
45
-
46
- function isSideDockEmojiIcon(value: string): boolean {
47
- return SIDE_DOCK_EMOJI_ICON_PATTERN.test(value.trim());
48
- }
49
-
50
- function SideDockItemIconView({ icon }: { icon: SideDockItemIcon }) {
51
- if (icon.type === 'url') {
52
- return <img src={icon.url} alt="" className="h-5 w-5 rounded object-cover" />;
53
- }
54
- if (icon.type === 'text') {
55
- if (isSideDockEmojiIcon(icon.value)) {
56
- return (
57
- <span className="flex h-7 w-7 items-center justify-center text-[20px] leading-none" aria-hidden="true">
58
- {icon.value}
59
- </span>
60
- );
61
- }
62
- return (
63
- <span className="max-w-7 truncate text-center text-[13px] font-semibold leading-none" aria-hidden="true">
64
- {icon.value}
65
- </span>
66
- );
67
- }
68
-
69
- const Icon = SIDE_DOCK_ICON_COMPONENTS[icon.name];
70
- return <Icon className="h-5 w-5" aria-hidden="true" />;
71
- }
72
35
 
73
36
  function SideDockButton({
74
37
  active,
75
38
  item,
76
39
  onOpen,
77
40
  onUnpin,
41
+ menuGroups = [],
78
42
  }: {
43
+ menuGroups?: ContextMenuGroup[];
79
44
  active: boolean;
80
45
  item: SideDockItem;
81
46
  onOpen: (item: SideDockItem) => void;
@@ -85,7 +50,7 @@ function SideDockButton({
85
50
 
86
51
  return (
87
52
  <Tooltip>
88
- <div className="group relative">
53
+ <ContextMenu groups={menuGroups} label={t('pageActions')}><div className="group relative">
89
54
  <TooltipTrigger asChild>
90
55
  <button
91
56
  type="button"
@@ -101,7 +66,7 @@ function SideDockButton({
101
66
  : 'bg-transparent',
102
67
  )}
103
68
  >
104
- <SideDockItemIconView icon={item.icon} />
69
+ <span className="flex items-center text-xl"><PageResourceIcon uri={getSideDockResourceUri(item) ?? ''} icon={item.icon} /></span>
105
70
  </button>
106
71
  </TooltipTrigger>
107
72
  {item.removable ? (
@@ -118,7 +83,7 @@ function SideDockButton({
118
83
  <X className="h-3 w-3" aria-hidden="true" />
119
84
  </button>
120
85
  ) : null}
121
- </div>
86
+ </div></ContextMenu>
122
87
  <TooltipContent side="left">{label}</TooltipContent>
123
88
  </Tooltip>
124
89
  );
@@ -202,10 +167,10 @@ function hasExactActiveSideDockItem(items: SideDockItem[], currentTab?: DocBrows
202
167
  }
203
168
 
204
169
  function isSideDockUtilityItem(item: SideDockItem): boolean {
205
- return SIDE_DOCK_UTILITY_ITEM_IDS.has(item.id);
170
+ return item.id === SIDE_DOCK_GITHUB_PROJECT_ITEM_ID;
206
171
  }
207
172
 
208
- export function SideDock({ manager }: SideDockProps) {
173
+ export function SideDock({ manager, getItemMenuGroups }: SideDockProps) {
209
174
  const pinnedItems = useSideDockStore((state) => state.pinnedItems);
210
175
  const setSideDockVisible = useSideDockStore((state) => state.setVisible);
211
176
  const { currentTab, isOpen } = useDocBrowser();
@@ -237,6 +202,7 @@ export function SideDock({ manager }: SideDockProps) {
237
202
  {mainItems.map((item) => (
238
203
  <SideDockButton
239
204
  key={item.id}
205
+ menuGroups={getItemMenuGroups?.(item)}
240
206
  active={isSideDockItemActive(item, isOpen, currentTab, hasExactActiveItem)}
241
207
  item={item}
242
208
  onOpen={manager.openItem}
@@ -249,6 +215,7 @@ export function SideDock({ manager }: SideDockProps) {
249
215
  {utilityItems.map((item) => (
250
216
  <SideDockButton
251
217
  key={item.id}
218
+ menuGroups={getItemMenuGroups?.(item)}
252
219
  active={isSideDockItemActive(item, isOpen, currentTab, hasExactActiveItem)}
253
220
  item={item}
254
221
  onOpen={manager.openItem}
@@ -176,6 +176,8 @@ export class SideDockManager {
176
176
  };
177
177
 
178
178
  private getTabResourceUri = (tab?: DocBrowserTab): string | null => {
179
+ // Snapshot-backed previews cannot be reconstructed from a shortcut URI alone.
180
+ if (tab?.viewState != null) return null;
179
181
  const uri = tab?.resourceUri ?? tab?.currentUrl;
180
182
  const normalized = uri ? normalizeSideDockResourceUri(uri) : '';
181
183
  return normalized.length > 0 ? normalized : null;
@@ -181,6 +181,46 @@ describe('DesktopUpdateConfig', () => {
181
181
  expect(screen.getByText('fetch failed: getaddrinfo ENOTFOUND updates.nextclaw.io')).toBeTruthy();
182
182
  });
183
183
 
184
+ it('offers a manual Portable Edition download when in-app updates are blocked', () => {
185
+ useRuntimeUpdateStore.setState((state) => ({
186
+ ...state,
187
+ snapshot: state.snapshot
188
+ ? {
189
+ ...state.snapshot,
190
+ status: 'blocked',
191
+ installationKind: 'desktop-bundle',
192
+ blockReason: 'unsupported-installation',
193
+ errorMessage: 'Portable Edition does not support in-app updates yet. Download a newer Portable Edition and keep the data directory.'
194
+ }
195
+ : null
196
+ }));
197
+
198
+ renderDesktopUpdateConfig();
199
+
200
+ const downloadLink = screen.getByRole('link', { name: '下载最新 Portable Edition' });
201
+ expect(downloadLink.getAttribute('href')).toBe('https://github.com/Peiiii/nextclaw/releases');
202
+ expect(downloadLink.getAttribute('target')).toBe('_blank');
203
+ });
204
+
205
+ it('does not offer a Portable Edition download for non-desktop update blocks', () => {
206
+ useRuntimeUpdateStore.setState((state) => ({
207
+ ...state,
208
+ snapshot: state.snapshot
209
+ ? {
210
+ ...state.snapshot,
211
+ status: 'blocked',
212
+ installationKind: 'npm-runtime-bundle',
213
+ blockReason: 'unsupported-installation',
214
+ errorMessage: 'This runtime does not support updates.'
215
+ }
216
+ : null
217
+ }));
218
+
219
+ renderDesktopUpdateConfig();
220
+
221
+ expect(screen.queryByRole('link', { name: '下载最新 Portable Edition' })).toBeNull();
222
+ });
223
+
184
224
  it('loads structured release notes from the docs JSON endpoint', async () => {
185
225
  const fetchMock = vi.fn(async () => new Response(JSON.stringify({
186
226
  schemaVersion: 1,
@@ -16,7 +16,9 @@ import {
16
16
  type ReleaseNotesLocale,
17
17
  type ReleaseNotesSection
18
18
  } from '@/features/system-status/utils/update-release-notes.utils';
19
- import { RefreshCw, RotateCw } from 'lucide-react';
19
+ import { Download, RefreshCw, RotateCw } from 'lucide-react';
20
+
21
+ const PORTABLE_RELEASES_URL = 'https://github.com/Peiiii/nextclaw/releases';
20
22
 
21
23
  const STATUS_LABEL_KEYS: Record<string, string> = {
22
24
  checking: 'desktopUpdatesStatusChecking',
@@ -117,6 +119,12 @@ function getStatusTone(status: string): string {
117
119
  return 'bg-gray-100 text-gray-700 ring-gray-200';
118
120
  }
119
121
 
122
+ function isPortableUpdateBlocked(snapshot: UpdateSnapshot): boolean {
123
+ return snapshot.status === 'blocked'
124
+ && snapshot.installationKind === 'desktop-bundle'
125
+ && snapshot.blockReason === 'unsupported-installation';
126
+ }
127
+
120
128
  function getReleaseNotesLocale(): ReleaseNotesLocale {
121
129
  return getLanguage() === 'zh' ? 'zh-CN' : 'en-US';
122
130
  }
@@ -265,6 +273,16 @@ export function DesktopUpdateConfig() {
265
273
  <p className='text-sm font-semibold text-red-800'>{t('desktopUpdatesBlockedTitle')}</p>
266
274
  <p className='mt-1 text-sm text-red-700'>{snapshot.errorMessage ?? t('desktopUpdatesBlockedDescription')}</p>
267
275
  {snapshot.recoveryCommand ? <code className='mt-3 block rounded-lg bg-white/70 px-3 py-2 text-xs text-red-800'>{snapshot.recoveryCommand}</code> : null}
276
+ {isPortableUpdateBlocked(snapshot) ? (
277
+ <NavigationLink
278
+ href={PORTABLE_RELEASES_URL}
279
+ external
280
+ icon={Download}
281
+ className='mt-3 rounded-full border border-red-300 bg-white/70 px-3 py-2 text-red-800 no-underline hover:bg-white hover:text-red-900 hover:no-underline'
282
+ >
283
+ {t('desktopUpdatesManualPortableDownload')}
284
+ </NavigationLink>
285
+ ) : null}
268
286
  </div>
269
287
  ) : null}
270
288
  {snapshot.errorMessage && snapshot.status !== 'blocked' ? <div className='rounded-2xl border border-red-200 bg-red-50/70 p-4 text-sm text-red-700'>{snapshot.errorMessage}</div> : null}
@@ -167,3 +167,5 @@ describe("DesktopAppShell", () => {
167
167
  expect(screen.getByTestId("app-content")).toBeTruthy();
168
168
  });
169
169
  });
170
+
171
+ vi.mock("@/shared/components/doc-browser/doc-browser", () => ({ DocBrowser: () => null }));
@@ -36,8 +36,6 @@ type DesktopAppShellProps = {
36
36
  export function DesktopAppShell({
37
37
  pathname,
38
38
  isMobileLayout = false,
39
- isDocBrowserOpen,
40
- docBrowserMode,
41
39
  docBrowserDockControls,
42
40
  docBrowserRenderers = {},
43
41
  docBrowserTabMenuGroups,
@@ -133,7 +131,7 @@ export function DesktopAppShell({
133
131
  {shouldUseWindowsChrome ? (
134
132
  <DesktopWindowChrome sidebarCollapsed={isSidebarCollapsed} />
135
133
  ) : null}
136
- <div className="relative z-[1] flex min-h-0 flex-1 overflow-hidden">
134
+ <div className="relative flex min-h-0 flex-1 overflow-hidden">
137
135
  {!isMainRoute && <Sidebar />}
138
136
  <div className="flex-1 flex min-w-0 overflow-hidden relative">
139
137
  <div className="flex-1 flex flex-col min-w-0 overflow-hidden">
@@ -152,7 +150,7 @@ export function DesktopAppShell({
152
150
  </main>
153
151
  )}
154
152
  </div>
155
- {isDocBrowserOpen && docBrowserMode === "docked" ? (
153
+ {(
156
154
  <Suspense fallback={null}>
157
155
  <DocBrowser
158
156
  customTabRenderers={docBrowserRenderers}
@@ -160,20 +158,11 @@ export function DesktopAppShell({
160
158
  getTabMenuGroups={docBrowserTabMenuGroups}
161
159
  />
162
160
  </Suspense>
163
- ) : null}
161
+ )}
164
162
  {sideDock}
165
163
  </div>
166
164
  </div>
167
165
  {showMobileBottomNav ? <MobileBottomNav /> : null}
168
- {isDocBrowserOpen && docBrowserMode === "floating" ? (
169
- <Suspense fallback={null}>
170
- <DocBrowser
171
- customTabRenderers={docBrowserRenderers}
172
- dockControls={docBrowserDockControls}
173
- getTabMenuGroups={docBrowserTabMenuGroups}
174
- />
175
- </Suspense>
176
- ) : null}
177
166
  </div>
178
167
  );
179
168
  }
@@ -38,6 +38,7 @@ describe("MobileAppShell", () => {
38
38
  expect(shell.className).toContain("supports-[height:100dvh]:h-[100dvh]");
39
39
  expect(shell.className).not.toContain("h-screen");
40
40
  expect(screen.getByTestId("mobile-bottom-nav")).toBeTruthy();
41
+ expect(screen.queryByTestId('mobile-topbar')).toBeNull();
41
42
  });
42
43
 
43
44
  it("centers primary route titles without reserving back-button spacers", () => {
@@ -7,7 +7,8 @@ import { MobileBottomNav } from "@/platforms/mobile/components/mobile-bottom-nav
7
7
 
8
8
  const { openAppsMock } = vi.hoisted(() => ({ openAppsMock: vi.fn() }));
9
9
 
10
- vi.mock("@/features/panel-apps", () => ({ openApps: openAppsMock }));
10
+ vi.mock("@/features/panel-apps", async (importOriginal) => ({
11
+ ...await importOriginal<object>(), openApps: openAppsMock }));
11
12
  vi.mock("@/shared/components/doc-browser", () => ({
12
13
  useDocBrowser: () => ({ open: vi.fn() }),
13
14
  }));
@@ -39,7 +40,7 @@ describe("MobileBottomNav", () => {
39
40
  ).toBeNull();
40
41
  expect(screen.getByTestId("mobile-nav-active-indicator")).toBeTruthy();
41
42
  expect(screen.getByRole("link", { name: /settings/i }).className).toContain(
42
- "bg-gray-100",
43
+ "bg-muted",
43
44
  );
44
45
  expect(screen.getByTestId("mobile-nav-active-indicator").textContent).toMatch(
45
46
  /settings/i,
@@ -25,7 +25,6 @@ type MobileAppShellProps = {
25
25
 
26
26
  export function MobileAppShell({
27
27
  pathname,
28
- isDocBrowserOpen,
29
28
  docBrowserDockControls,
30
29
  docBrowserRenderers = {},
31
30
  docBrowserTabMenuGroups,
@@ -33,7 +32,7 @@ export function MobileAppShell({
33
32
  children,
34
33
  }: MobileAppShellProps) {
35
34
  const isMainRoute = isMainWorkspaceRoute(pathname);
36
- const showTopbar = !isChatSessionDetailRoute(pathname);
35
+ const showTopbar = pathname !== '/chat' && !isChatSessionDetailRoute(pathname);
37
36
  const showBottomNav = !isChatSessionDetailRoute(pathname);
38
37
 
39
38
  return (
@@ -49,7 +48,7 @@ export function MobileAppShell({
49
48
  )}
50
49
  </div>
51
50
  {showBottomNav ? <MobileBottomNav /> : null}
52
- {isDocBrowserOpen ? (
51
+ {(
53
52
  <Suspense fallback={null}>
54
53
  <DocBrowser
55
54
  customTabRenderers={docBrowserRenderers}
@@ -58,7 +57,7 @@ export function MobileAppShell({
58
57
  getTabMenuGroups={docBrowserTabMenuGroups}
59
58
  />
60
59
  </Suspense>
61
- ) : null}
60
+ )}
62
61
  </div>
63
62
  );
64
63
  }
@@ -20,7 +20,7 @@ export function MobileBottomNav() {
20
20
  <nav
21
21
  data-testid="mobile-bottom-nav"
22
22
  aria-label={t("settings")}
23
- className="shrink-0 border-t border-gray-200/80 bg-white/95 backdrop-blur-sm"
23
+ className="shrink-0 border-t border-border/60 bg-background text-foreground"
24
24
  style={{
25
25
  paddingBottom: "calc(env(safe-area-inset-bottom, 0px) + 0.25rem)",
26
26
  }}
@@ -39,19 +39,19 @@ export function MobileBottomNav() {
39
39
  className={cn(
40
40
  "group flex min-h-[2.875rem] flex-col items-center justify-center gap-0.5 rounded-xl px-2 py-1 text-[10px] font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
41
41
  active
42
- ? "bg-gray-100 text-gray-900"
43
- : "text-gray-500 hover:bg-gray-50 hover:text-gray-800",
42
+ ? "bg-muted text-foreground"
43
+ : "text-muted-foreground hover:bg-muted hover:text-foreground",
44
44
  )}
45
45
  >
46
46
  <span className="relative">
47
47
  <item.icon
48
48
  className={cn(
49
49
  "h-3.5 w-3.5",
50
- active ? "text-gray-900" : "text-gray-400",
50
+ active ? "text-foreground" : "text-muted-foreground",
51
51
  )}
52
52
  />
53
53
  {item.target === "/inbox" && unreadCount > 0 ? (
54
- <span className="absolute -right-1 -top-1 h-1.5 w-1.5 rounded-full bg-primary ring-1 ring-white" />
54
+ <span className="absolute -right-1 -top-1 h-1.5 w-1.5 rounded-full bg-primary ring-1 ring-background" />
55
55
  ) : null}
56
56
  </span>
57
57
  <span className="max-w-full truncate">{item.label}</span>
@@ -63,9 +63,9 @@ export function MobileBottomNav() {
63
63
  <button
64
64
  type="button"
65
65
  onClick={() => openApps(docBrowser)}
66
- className="group flex min-h-[2.875rem] w-full flex-col items-center justify-center gap-0.5 rounded-xl px-2 py-1 text-[10px] font-medium text-gray-500 transition-colors hover:bg-gray-50 hover:text-gray-800 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
66
+ className="group flex min-h-[2.875rem] w-full flex-col items-center justify-center gap-0.5 rounded-xl px-2 py-1 text-[10px] font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
67
67
  >
68
- <Boxes className="h-3.5 w-3.5 text-gray-400" />
68
+ <Boxes className="h-3.5 w-3.5 text-muted-foreground" />
69
69
  <span className="max-w-full truncate">{t("appsTitle")}</span>
70
70
  </button>
71
71
  </li>
@@ -1,12 +1,12 @@
1
1
  import { NavLink } from "react-router-dom";
2
- import { getSettingsNavItems } from "@/app/configs/app-navigation.config";
2
+ import { getSettingsNavSections } from "@/app/configs/app-navigation.config";
3
3
  import { t } from "@/shared/lib/i18n";
4
4
  import { cn } from "@/shared/lib/utils";
5
5
  import { useDesktopCapabilityAvailability } from "@/features/desktop-capabilities";
6
6
 
7
7
  export function MobileSettingsShell() {
8
8
  const desktopCapabilityAvailable = useDesktopCapabilityAvailability();
9
- const settingsNavItems = getSettingsNavItems(t, {
9
+ const settingsNavSections = getSettingsNavSections(t, {
10
10
  includeKeyboardShortcuts: false,
11
11
  includeDesktopCapabilities: desktopCapabilityAvailable,
12
12
  });
@@ -16,7 +16,10 @@ export function MobileSettingsShell() {
16
16
  data-testid="mobile-settings-shell"
17
17
  className="space-y-3 pb-4"
18
18
  >
19
- {settingsNavItems.map((item) => (
19
+ {settingsNavSections.map((section) => (
20
+ <section key={section.label} className="space-y-2">
21
+ <h2 className="px-1 pt-2 text-xs font-medium text-muted-foreground">{section.label}</h2>
22
+ {section.items.map((item) => (
20
23
  <NavLink
21
24
  key={item.target}
22
25
  to={item.target}
@@ -38,6 +41,8 @@ export function MobileSettingsShell() {
38
41
  </p>
39
42
  </div>
40
43
  </NavLink>
44
+ ))}
45
+ </section>
41
46
  ))}
42
47
  </div>
43
48
  );
@@ -11,7 +11,7 @@ export function MobileTopbar({ leadingInset }: { leadingInset?: string }) {
11
11
  return (
12
12
  <header
13
13
  data-testid="mobile-topbar"
14
- className="shrink-0 border-b border-gray-200/80 bg-white/95 backdrop-blur-sm"
14
+ className="shrink-0 border-b border-border/60 bg-secondary text-foreground"
15
15
  style={{
16
16
  paddingTop: "calc(env(safe-area-inset-top, 0px) + 0.25rem)",
17
17
  }}
@@ -24,18 +24,18 @@ export function MobileTopbar({ leadingInset }: { leadingInset?: string }) {
24
24
  <button
25
25
  type="button"
26
26
  onClick={() => navigate(routeMeta.backTarget as string)}
27
- className="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full border border-gray-200 text-gray-600 transition-colors hover:bg-gray-50 hover:text-gray-900"
27
+ className="inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-muted hover:text-foreground"
28
28
  aria-label={routeMeta.backLabel ?? t("backToMain")}
29
29
  >
30
30
  <ArrowLeft className="h-4 w-4" />
31
31
  </button>
32
32
  ) : null}
33
33
  <div className="min-w-0 flex-1">
34
- <h1 className="truncate text-center text-[15px] font-semibold text-gray-900">
34
+ <h1 className="truncate text-center text-[17px] font-semibold text-foreground">
35
35
  {routeMeta.title}
36
36
  </h1>
37
37
  </div>
38
- {routeMeta.backTarget ? <div className="h-8 w-8 shrink-0" aria-hidden="true" /> : null}
38
+ {routeMeta.backTarget ? <div className="h-11 w-11 shrink-0" aria-hidden="true" /> : null}
39
39
  </div>
40
40
  </header>
41
41
  );
@@ -1,3 +1,4 @@
1
+ import { WorkbenchSurfaceManager } from '@/shared/components/workbench/managers/workbench-surface.manager';
1
2
  import { act, renderHook, waitFor } from '@testing-library/react';
2
3
  import type { ReactNode } from 'react';
3
4
  import { DocBrowserProvider, useDocBrowser } from '@/shared/components/doc-browser/doc-browser-context';
@@ -18,7 +19,7 @@ const wrapper = ({ children }: { children: ReactNode }) => (
18
19
  <DocBrowserProvider manager={testDocBrowserManager}>{children}</DocBrowserProvider>
19
20
  );
20
21
 
21
- const testDocBrowserManager = new DocBrowserManager(new RightPanelResourceRouteResolver());
22
+ const testDocBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), new RightPanelResourceRouteResolver());
22
23
 
23
24
  const docBrowserStorageKey = 'nextclaw.doc-browser.state';
24
25
 
@@ -56,7 +57,7 @@ async function resetMemoryThenRehydrate(savedState: string | null) {
56
57
  describe('DocBrowserManager layout notifications', () => {
57
58
  it('notifies the app layout coordinator after opening the docked browser', () => {
58
59
  const onRightPanelOpened = vi.fn();
59
- const manager = new DocBrowserManager(
60
+ const manager = new DocBrowserManager(new WorkbenchSurfaceManager(),
60
61
  new RightPanelResourceRouteResolver(),
61
62
  onRightPanelOpened,
62
63
  );
@@ -71,7 +72,7 @@ describe('DocBrowserManager layout notifications', () => {
71
72
 
72
73
  it('notifies the app layout coordinator after changing dock mode', () => {
73
74
  const onRightPanelOpened = vi.fn();
74
- const manager = new DocBrowserManager(
75
+ const manager = new DocBrowserManager(new WorkbenchSurfaceManager(),
75
76
  new RightPanelResourceRouteResolver(),
76
77
  onRightPanelOpened,
77
78
  );
@@ -20,16 +20,11 @@ function renderTabStrip(tabs: DocBrowserTab[]) {
20
20
  activeTabId={tabs[0]?.id ?? ""}
21
21
  canGoBack={false}
22
22
  canGoForward={false}
23
- isDocked={true}
24
- isFullscreen={false}
25
23
  onGoBack={vi.fn()}
26
24
  onGoForward={vi.fn()}
27
25
  onOpenNewTab={vi.fn()}
28
26
  onSetActiveTab={vi.fn()}
29
27
  onCloseTab={vi.fn()}
30
- onClose={vi.fn()}
31
- onDragStart={vi.fn()}
32
- onToggleMode={vi.fn()}
33
28
  />,
34
29
  );
35
30
  }