@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
@@ -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");
@@ -1,6 +1,10 @@
1
- import { useCallback, useEffect } from "react";
2
- import { useLocation, useNavigate } from "react-router-dom";
3
- import { MessageSquarePlus } from "lucide-react";
1
+ import { ChatResourceLinkProvider } from '@nextclaw/agent-chat-ui';
2
+ import { PageResourceIcon } from '@/features/right-panel-resources';
3
+ import { usePageResourceActions } from '@/features/right-panel-resources';
4
+ import { pageResourceFromTab } from '@/features/right-panel-resources';
5
+ import { PAGE_RESOURCE_RENDERERS } from '@/app/configs/page-resource-renderers.config';
6
+ import { useEffect } from "react";
7
+ import { useLocation } from "react-router-dom";
4
8
  import {
5
9
  DocBrowserProvider,
6
10
  useDocBrowser,
@@ -10,30 +14,21 @@ import { useI18n } from "@/app/components/i18n-provider";
10
14
  import { useViewportLayout } from "@/app/hooks/use-viewport-layout";
11
15
  import { DesktopAppShell, getDesktopHostPlatform } from "@/platforms/desktop";
12
16
  import { MobileAppShell } from "@/platforms/mobile";
13
- import { PANEL_APPS_DOC_BROWSER_RENDERERS } from "@/features/panel-apps";
14
- import { MARKETPLACE_DETAIL_DOC_BROWSER_RENDERERS } from "@/features/marketplace";
15
17
  import {
16
18
  SideDock,
17
19
  type SideDockManager,
18
20
  useSideDockStore,
19
21
  } from "@/features/side-dock";
20
22
  import { getPresenter } from "@/app/presenters/app.presenter";
21
- import { CHAT_DRAFT_SESSION_PATH } from "@/features/chat";
22
- import { parseSessionKeyFromRoute } from "@/features/chat/features/session/utils/chat-session-route.utils";
23
- import { createChatUiResourceReferenceFromTab } from "@/features/right-panel-resources/utils/right-panel-resource-uri.utils";
24
23
  import { resolveUiDocumentTitle } from "@/shared/lib/ui-document-title";
25
24
  import type { DocBrowserDockControls } from "@/shared/components/doc-browser/doc-browser-context";
26
25
  import type { DocBrowserTabMenuGroupsResolver } from "@/shared/components/doc-browser/doc-browser";
27
- import { t } from "@/shared/lib/i18n";
28
26
 
29
27
  interface AppLayoutProps {
30
28
  children: React.ReactNode;
31
29
  }
32
30
 
33
- const DOC_BROWSER_RENDERERS = {
34
- ...PANEL_APPS_DOC_BROWSER_RENDERERS,
35
- ...MARKETPLACE_DETAIL_DOC_BROWSER_RENDERERS,
36
- };
31
+ const renderResourceIcon = (uri: string) => <PageResourceIcon uri={uri} />;
37
32
 
38
33
  function AppLayoutInner({
39
34
  children,
@@ -42,8 +37,6 @@ function AppLayoutInner({
42
37
  const { isOpen, mode } = useDocBrowser();
43
38
  useDocLinkInterceptor();
44
39
  const { pathname } = useLocation();
45
- const navigate = useNavigate();
46
- const presenter = getPresenter();
47
40
  const { language } = useI18n();
48
41
  const { isMobile } = useViewportLayout();
49
42
  const desktopHostPlatform = getDesktopHostPlatform();
@@ -54,32 +47,8 @@ function AppLayoutInner({
54
47
  pinTab: sideDockManager.pinTab,
55
48
  unpinTab: sideDockManager.unpinTab,
56
49
  };
57
- const getDocBrowserTabMenuGroups = useCallback<DocBrowserTabMenuGroupsResolver>((tab) => {
58
- const reference = createChatUiResourceReferenceFromTab(tab);
59
- if (!reference) return undefined;
60
- return [{
61
- key: "chat",
62
- items: [{
63
- key: "add-to-chat",
64
- icon: <MessageSquarePlus className="h-4 w-4" />,
65
- label: t("docBrowserAddToChat"),
66
- restoreFocus: false,
67
- onSelect: () => {
68
- const isChatRoute = pathname === "/chat" || pathname.startsWith("/chat/");
69
- const routeSessionKey = pathname === "/chat"
70
- ? null
71
- : parseSessionKeyFromRoute(pathname.slice("/chat/".length));
72
- presenter.chatComposerIntentManager.requestUiResourceReference({
73
- targetSessionKey: isChatRoute ? routeSessionKey : null,
74
- reference,
75
- });
76
- if (!isChatRoute) {
77
- navigate(CHAT_DRAFT_SESSION_PATH);
78
- }
79
- },
80
- }],
81
- }];
82
- }, [navigate, pathname, presenter]);
50
+ const pageActions = usePageResourceActions();
51
+ const getDocBrowserTabMenuGroups: DocBrowserTabMenuGroupsResolver = (tab) => pageActions(pageResourceFromTab(tab), 'global');
83
52
 
84
53
  useEffect(() => {
85
54
  document.title = resolveUiDocumentTitle(pathname, window.location);
@@ -91,7 +60,7 @@ function AppLayoutInner({
91
60
  pathname={pathname}
92
61
  isDocBrowserOpen={isOpen}
93
62
  docBrowserDockControls={docBrowserDockControls}
94
- docBrowserRenderers={DOC_BROWSER_RENDERERS}
63
+ docBrowserRenderers={PAGE_RESOURCE_RENDERERS}
95
64
  docBrowserTabMenuGroups={getDocBrowserTabMenuGroups}
96
65
  topbarLeadingInset={
97
66
  desktopHostPlatform === "darwin" ? "4.75rem" : undefined
@@ -109,9 +78,12 @@ function AppLayoutInner({
109
78
  isDocBrowserOpen={isOpen}
110
79
  docBrowserMode={mode}
111
80
  docBrowserDockControls={docBrowserDockControls}
112
- docBrowserRenderers={DOC_BROWSER_RENDERERS}
81
+ docBrowserRenderers={PAGE_RESOURCE_RENDERERS}
113
82
  docBrowserTabMenuGroups={getDocBrowserTabMenuGroups}
114
- sideDock={isSideDockVisible ? <SideDock manager={sideDockManager} /> : null}
83
+ sideDock={isSideDockVisible ? <SideDock manager={sideDockManager} getItemMenuGroups={(item) => {
84
+ const page = getPresenter().pageResourceManager.resolve(item.target.type === 'right-panel-resource' ? item.target.uri : item.target.url);
85
+ return page ? pageActions(page) : [];
86
+ }} /> : null}
115
87
  >
116
88
  {children}
117
89
  </DesktopAppShell>
@@ -123,9 +95,9 @@ export function AppLayout({ children }: AppLayoutProps) {
123
95
 
124
96
  return (
125
97
  <DocBrowserProvider manager={presenter.docBrowserManager}>
126
- <AppLayoutInner sideDockManager={presenter.sideDockManager}>
98
+ <ChatResourceLinkProvider renderIcon={renderResourceIcon}><AppLayoutInner sideDockManager={presenter.sideDockManager}>
127
99
  {children}
128
100
  </AppLayoutInner>
129
- </DocBrowserProvider>
101
+ </ChatResourceLinkProvider></DocBrowserProvider>
130
102
  );
131
103
  }
@@ -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,
@@ -7,6 +7,10 @@ import {
7
7
  } from "@/app/configs/app-navigation.config";
8
8
 
9
9
  describe("panel app main navigation", () => {
10
+ it("labels resource pages as resources, not settings", () => {
11
+ expect(isMainWorkspaceRoute("/resource")).toBe(true);
12
+ expect(resolveMobileRouteMeta("/resource", key => key).title).toBe("resourcePageTitle");
13
+ });
10
14
  it("keeps panel app routes inside the main workspace shell", () => {
11
15
  expect(isMainWorkspaceRoute("/apps/panel/rust-todo")).toBe(true);
12
16
  expect(isMainWorkspaceRoute("/apps")).toBe(false);
@@ -52,6 +52,7 @@ export function matchesRouteTarget(pathname: string, target: string): boolean {
52
52
  export function isMainWorkspaceRoute(pathname: string): boolean {
53
53
  const normalized = pathname.toLowerCase();
54
54
  return (
55
+ normalized === "/resource" ||
55
56
  normalized === "/chat" ||
56
57
  normalized.startsWith("/chat/") ||
57
58
  normalized === "/inbox" ||
@@ -137,107 +138,60 @@ export function getMainSidebarNavItems(
137
138
  ];
138
139
  }
139
140
 
140
- export function getSettingsNavItems(
141
+ export function getSettingsNavSections(
141
142
  translate: Translate,
142
143
  options: SettingsNavigationOptions = {},
143
- ): AppNavigationItem[] {
144
- const items = [
145
- {
146
- target: "/model",
147
- label: translate("model"),
148
- icon: Cpu,
149
- },
150
- {
151
- target: "/providers",
152
- label: translate("providers"),
153
- icon: Sparkles,
154
- },
155
- {
156
- target: "/channels",
157
- label: translate("channels"),
158
- icon: MessageSquare,
159
- },
160
- {
161
- target: "/extensions",
162
- label: translate("extensions"),
163
- icon: Puzzle,
164
- },
165
- {
166
- target: "/appearance",
167
- label: translate("appearance"),
168
- icon: Palette,
169
- },
170
- {
171
- target: "/keyboard-shortcuts",
172
- label: translate("keyboardShortcuts"),
173
- icon: Keyboard,
174
- },
175
- {
176
- target: "/security",
177
- label: translate("security"),
178
- icon: Shield,
179
- },
180
- {
181
- target: "/privacy",
182
- label: translate("privacy"),
183
- icon: Activity,
184
- },
185
- {
186
- target: "/desktop-capabilities",
187
- label: translate("desktopCapabilities"),
188
- icon: MonitorCog,
189
- },
190
- {
191
- target: "/search",
192
- label: translate("searchChannels"),
193
- icon: Search,
194
- },
195
- {
196
- target: "/updates",
197
- label: translate("updates"),
198
- icon: Download,
199
- },
144
+ ): AppNavigationSection[] {
145
+ const sections = [
200
146
  {
201
- target: "/remote",
202
- label: translate("remote"),
203
- 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
+ ],
204
153
  },
205
154
  {
206
- target: "/runtime",
207
- label: translate("runtime"),
208
- 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
+ ],
209
162
  },
210
163
  {
211
- target: "/secrets",
212
- label: translate("secrets"),
213
- 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
+ ],
214
171
  },
215
172
  {
216
- target: "/marketplace/mcp",
217
- label: translate("marketplaceFilterMcp"),
218
- 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
+ ],
219
180
  },
220
181
  ];
221
- return items.filter((item) =>
222
- (options.includeDesktopCapabilities !== false || item.target !== "/desktop-capabilities") &&
223
- (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);
224
188
  }
225
189
 
226
- export function getSettingsNavSections(
190
+ export function getSettingsNavItems(
227
191
  translate: Translate,
228
192
  options: SettingsNavigationOptions = {},
229
- ): AppNavigationSection[] {
230
- const items = getSettingsNavItems(translate, options);
231
- return [
232
- {
233
- label: translate("settingsGroupBasic"),
234
- items: items.slice(0, 3),
235
- },
236
- {
237
- label: translate("settingsGroupAdvanced"),
238
- items: items.slice(3),
239
- },
240
- ];
193
+ ): AppNavigationItem[] {
194
+ return getSettingsNavSections(translate, options).flatMap((section) => section.items);
241
195
  }
242
196
 
243
197
  export function isSettingsRoute(pathname: string): boolean {
@@ -260,6 +214,7 @@ export function resolveMobileRouteMeta(
260
214
  } {
261
215
  const normalized = pathname.toLowerCase();
262
216
  const settingsItems = getSettingsNavItems(translate);
217
+ if (normalized === "/resource") return { title: translate("resourcePageTitle"), backTarget: null, backLabel: null };
263
218
 
264
219
  if (isChatSessionDetailRoute(normalized)) {
265
220
  return {
@@ -0,0 +1,13 @@
1
+ import { SYSTEM_OBJECT_RESOURCE_RENDERERS } from "@/features/right-panel-resources";
2
+ import { WORKSPACE_FILE_PANEL_RENDERERS } from "@/features/right-panel-resources";
3
+ import { CHAT_SESSION_PANEL_RENDERERS } from "@/features/chat";
4
+ import { PANEL_APPS_DOC_BROWSER_RENDERERS } from "@/features/panel-apps";
5
+ import { MARKETPLACE_DETAIL_DOC_BROWSER_RENDERERS } from "@/features/marketplace";
6
+
7
+ export const PAGE_RESOURCE_RENDERERS = {
8
+ ...SYSTEM_OBJECT_RESOURCE_RENDERERS,
9
+ ...WORKSPACE_FILE_PANEL_RENDERERS,
10
+ ...CHAT_SESSION_PANEL_RENDERERS,
11
+ ...PANEL_APPS_DOC_BROWSER_RENDERERS,
12
+ ...MARKETPLACE_DETAIL_DOC_BROWSER_RENDERERS,
13
+ };
package/src/app/index.tsx CHANGED
@@ -11,6 +11,7 @@ import { SIDEBAR_RAIL_WIDTH_PX } from "@/app/components/layout/sidebar-rail.styl
11
11
  import { SettingsEntryPage } from "@/app/components/layout/settings-entry-page";
12
12
  import { LoginPage } from "@/components/auth/login-page";
13
13
  import { ChatPage } from "@/components/chat/chat-page";
14
+ import { ChatRuntimeProvider } from "@/features/chat";
14
15
  import { loadAccountPanel } from "@/features/account";
15
16
  import { InboxRuntime } from "@/features/inbox";
16
17
  import { PanelAppServiceActionAuthorizationDialog } from "@/features/panel-apps";
@@ -117,6 +118,7 @@ function createLazyElement(element: ReactElement): ReactElement {
117
118
  }
118
119
 
119
120
  const protectedRouteDefinitions: ProtectedRouteDefinition[] = [
121
+ { path: '/resource', element: createLazyElement(<ChatPage view="resource" />) },
120
122
  {
121
123
  path: "/projects/:projectId/:tab",
122
124
  element: createLazyElement(<ChatPage view="projects" />),
@@ -274,6 +276,7 @@ function ProtectedApp() {
274
276
 
275
277
  return (
276
278
  <AppPresenterProvider>
279
+ <ChatRuntimeProvider>
277
280
  <AppNotificationRuntime />
278
281
  <InboxRuntime />
279
282
  <AppLayout>
@@ -284,6 +287,7 @@ function ProtectedApp() {
284
287
  </Suspense>
285
288
  <PanelAppServiceActionAuthorizationDialog />
286
289
  <DesktopAuthorizationDialog />
290
+ </ChatRuntimeProvider>
287
291
  </AppPresenterProvider>
288
292
  );
289
293
  }
@@ -1,3 +1,4 @@
1
+ import { PageResourceManager } from '@/features/right-panel-resources';
1
2
  import { AccountManager } from '@/features/account';
2
3
  import { viewportLayoutManager } from '@/app/managers/viewport-layout.manager';
3
4
  import {
@@ -15,14 +16,17 @@ import { RemoteAccessManager } from '@/features/remote';
15
16
  import { SideDockManager } from '@/features/side-dock';
16
17
  import { DocBrowserManager } from '@/shared/components/doc-browser/managers/doc-browser.manager';
17
18
  import { useDocBrowserStore } from '@/shared/components/doc-browser/stores/doc-browser.store';
19
+ import { GLOBAL_WORKBENCH_SURFACE } from '@/shared/components/workbench/types/workbench-surface.types';
20
+ import { workbenchSurfaceManager } from '@/shared/components/workbench/managers/workbench-surface.manager';
18
21
 
19
22
  type ChatThreadSnapshot = ReturnType<typeof useChatThreadStore.getState>['snapshot'];
20
23
 
21
24
  function isChatWorkspacePanelOpen(snapshot: ChatThreadSnapshot): boolean {
22
- return snapshot.activeWorkspacePanelKind != null;
25
+ return snapshot.activeWorkspacePanelKind != null && !snapshot.workspacePanelHidden;
23
26
  }
24
27
 
25
28
  export class AppPresenter {
29
+ workbenchSurfaceManager = workbenchSurfaceManager;
26
30
  notificationManager = new AppNotificationManager();
27
31
  inboxManager = new InboxManager();
28
32
  chatCompletionNotificationManager = new ChatCompletionNotificationManager(
@@ -34,15 +38,22 @@ export class AppPresenter {
34
38
  const docBrowser = useDocBrowserStore.getState().snapshot;
35
39
  const chatThread = useChatThreadStore.getState().snapshot;
36
40
  viewportLayoutManager.collapseSidebarForDenseRightPanels({
37
- isDocBrowserDocked: docBrowser.mode === 'docked',
41
+ isDocBrowserDocked: this.workbenchSurfaceManager.get(GLOBAL_WORKBENCH_SURFACE).placement === 'docked',
38
42
  isDocBrowserOpen: docBrowser.isOpen,
39
43
  isWorkspacePanelOpen: isChatWorkspacePanelOpen(chatThread),
40
44
  });
41
45
  };
46
+ notifyWorkspacePanelOpened = () => {
47
+ const parentKey = useChatThreadStore.getState().snapshot.workspacePanelParentKey;
48
+ this.workbenchSurfaceManager.restore(`session-workspace:${parentKey ?? 'draft'}`);
49
+ this.notifyRightPanelOpened();
50
+ };
42
51
  docBrowserManager = new DocBrowserManager(
52
+ this.workbenchSurfaceManager,
43
53
  this.rightPanelResourceRouteResolver,
44
54
  this.notifyRightPanelOpened,
45
55
  );
56
+ pageResourceManager = new PageResourceManager(this);
46
57
  appPackageOperationSettlementManager = new AppPackageOperationSettlementManager(
47
58
  this.docBrowserManager,
48
59
  );