@nextclaw/ui 0.25.4 → 0.26.0

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 (457) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/.vite/manifest.json +1146 -1390
  3. package/dist/assets/{abnfDiagram-VRR7QNED-DX_u5BBX.js → abnfDiagram-VRR7QNED-Bjrmb5-o.js} +1 -1
  4. package/dist/assets/account-panel-C1S3xtUB.js +1 -0
  5. package/dist/assets/{aiden0z-pptx-renderer.es-C-E9e5yB.js → aiden0z-pptx-renderer.es-DO4DCX3e.js} +1 -1
  6. package/dist/assets/api-D9e9cHtW.js +20 -0
  7. package/dist/assets/app-presenter-provider-J9IgTbc9.js +124 -0
  8. package/dist/assets/appearance-settings-page-BljTr6nB.js +1 -0
  9. package/dist/assets/{arc-Cxwa624o.js → arc-g4XaP3S4.js} +1 -1
  10. package/dist/assets/architecture-TIHT7OUA-BWywYH_m.js +1 -0
  11. package/dist/assets/{architectureDiagram-ZJ3FMSHR-D8mCj0H1.js → architectureDiagram-ZJ3FMSHR-CAP7YDux.js} +1 -1
  12. package/dist/assets/{blockDiagram-677ZJIJ3-CbGC1IHl.js → blockDiagram-677ZJIJ3-DhaP0zUG.js} +1 -1
  13. package/dist/assets/{book-open-xqEj1OLE.js → book-open-vxpV2eSM.js} +1 -1
  14. package/dist/assets/{c4Diagram-LMCZKHZV-BQhGC1Vc.js → c4Diagram-LMCZKHZV-DHCQJJkD.js} +1 -1
  15. package/dist/assets/card-D9NYhSdf.js +1 -0
  16. package/dist/assets/channel-1nKIAEXr.js +1 -0
  17. package/dist/assets/channels-list-page-BiHA1zZd.js +8 -0
  18. package/dist/assets/chunk-2Q5K7J3B-CAwv72v4.js +1 -0
  19. package/dist/assets/{chunk-32BRIVSS-B74ZZwYG.js → chunk-32BRIVSS-BcQlxl4v.js} +1 -1
  20. package/dist/assets/{chunk-52WLFC77-BvmxW_f_.js → chunk-52WLFC77-ClPpG-2S.js} +1 -1
  21. package/dist/assets/{chunk-5FCAYU7R-DQvBRnwL.js → chunk-5FCAYU7R-B_qmYOdX.js} +1 -1
  22. package/dist/assets/{chunk-5HE753X5-CDIH0_y3.js → chunk-5HE753X5-DTO-V56q.js} +1 -1
  23. package/dist/assets/{chunk-5JV3BV7I-CcevlKd-.js → chunk-5JV3BV7I-CU1SOaaG.js} +1 -1
  24. package/dist/assets/{chunk-5TONJI2A-_3dxVdnY.js → chunk-5TONJI2A-CzSDkWNa.js} +1 -1
  25. package/dist/assets/{chunk-5VM5RSS4-pGO5vvo-.js → chunk-5VM5RSS4-ChkfqIRE.js} +1 -1
  26. package/dist/assets/{chunk-7BUUIJ7U-DEKF5uAN.js → chunk-7BUUIJ7U-Du3Ozi62.js} +1 -1
  27. package/dist/assets/{chunk-BIQX33UG-CjBFgq2r.js → chunk-BIQX33UG-C-HVafHB.js} +1 -1
  28. package/dist/assets/{chunk-C7G6YPKG-e_K9OGTz.js → chunk-C7G6YPKG-BSjZ86D0.js} +1 -1
  29. package/dist/assets/{chunk-CQNSW5MT-C2IiHyHz.js → chunk-CQNSW5MT-1D1W2lF6.js} +1 -1
  30. package/dist/assets/{chunk-CYSBUYHQ-DCC6KmGp.js → chunk-CYSBUYHQ-ISpyj_lK.js} +1 -1
  31. package/dist/assets/{chunk-EMLP6XTP-BYGgekQ0.js → chunk-EMLP6XTP-Cp8iUBt2.js} +1 -1
  32. package/dist/assets/{chunk-EX3LRPZG-FGcwuVsA.js → chunk-EX3LRPZG-BN5RzF5j.js} +1 -1
  33. package/dist/assets/{chunk-FWX5IMBZ-CV3Ih_Os.js → chunk-FWX5IMBZ-DecJDW4r.js} +2 -2
  34. package/dist/assets/{chunk-HOUHSVGY-CXpq_hfV.js → chunk-HOUHSVGY-BE_XNgGk.js} +1 -1
  35. package/dist/assets/{chunk-ICXQ74PX-CZIpjupq.js → chunk-ICXQ74PX-BFOKMkWV.js} +1 -1
  36. package/dist/assets/{chunk-JG7HCLWE-CdgwBpW7.js → chunk-JG7HCLWE-DL-pl8VB.js} +1 -1
  37. package/dist/assets/{chunk-JWPE2WC7-BPjAZpOQ.js → chunk-JWPE2WC7-B-bcwfmh.js} +1 -1
  38. package/dist/assets/{chunk-MOJQB5TN-DbJDm8to.js → chunk-MOJQB5TN-BC0taFro.js} +1 -1
  39. package/dist/assets/{chunk-MOZMSUNE-BUa1fqKn.js → chunk-MOZMSUNE-RrhfU6MO.js} +1 -1
  40. package/dist/assets/{chunk-OGEWGWER-CtnzLgRu.js → chunk-OGEWGWER-TuI7SR7i.js} +1 -1
  41. package/dist/assets/{chunk-OSBZ3O6U-fUgdpTUM.js → chunk-OSBZ3O6U-C5jMBKlU.js} +1 -1
  42. package/dist/assets/{chunk-PUDLZKDR-CtDWZT9-.js → chunk-PUDLZKDR-C5lMBn0K.js} +1 -1
  43. package/dist/assets/{chunk-Q4XR5HBZ-BxnK2qxr.js → chunk-Q4XR5HBZ-B-kzUbwT.js} +1 -1
  44. package/dist/assets/{chunk-QBLGF6JB-CH4UKoCF.js → chunk-QBLGF6JB-CRb_WAEj.js} +1 -1
  45. package/dist/assets/{chunk-R7FJI6CG-BxwFoF1v.js → chunk-R7FJI6CG-De6Y7ozO.js} +1 -1
  46. package/dist/assets/{chunk-RYQCIY6F-DpHAmq7O.js → chunk-RYQCIY6F-Igv92q8k.js} +1 -1
  47. package/dist/assets/{chunk-U6XO7XAA-BjH2VUHU.js → chunk-U6XO7XAA-bCjRshkT.js} +1 -1
  48. package/dist/assets/{chunk-V7JOEXUC-DKJZ3HGj.js → chunk-V7JOEXUC-0J1s_Kgq.js} +1 -1
  49. package/dist/assets/chunk-VAUOI2AC-DnaryNw2.js +1 -0
  50. package/dist/assets/{chunk-VR4S4FIN-Cf-o2GtI.js → chunk-VR4S4FIN-DX6lXnNx.js} +1 -1
  51. package/dist/assets/{chunk-WYO6CB5R-zeNXGm20.js → chunk-WYO6CB5R-DLqMXfFC.js} +3 -3
  52. package/dist/assets/chunk-XXDRQBXY-BToo1uqb.js +1 -0
  53. package/dist/assets/{chunk-YOTPTUD7-Ck87Kqxe.js → chunk-YOTPTUD7-CY4obsV0.js} +1 -1
  54. package/dist/assets/{chunk-ZGVPDNZ5-BbfK6Bfd.js → chunk-ZGVPDNZ5-BleImZKe.js} +1 -1
  55. package/dist/assets/{chunk-ZIRB5QZD-BDpzh4Yl.js → chunk-ZIRB5QZD-C1TfdjpX.js} +1 -1
  56. package/dist/assets/{circle-dashed-CU3yApvP.js → circle-dashed-CEEssYIw.js} +1 -1
  57. package/dist/assets/classDiagram-OUVF2IWQ-D_TusZGx.js +1 -0
  58. package/dist/assets/classDiagram-v2-EOCWNBFH-B1NFZTmS.js +1 -0
  59. package/dist/assets/client-C6YQx7A-.js +1 -0
  60. package/dist/assets/config-split-page-DKPelvjR.js +1 -0
  61. package/dist/assets/confirm-dialog-BCGeh61X.js +1 -0
  62. package/dist/assets/{cose-bilkent-JH36ORCC-CQfMxKCT.js → cose-bilkent-JH36ORCC-CVgUHXkj.js} +1 -1
  63. package/dist/assets/createLucideIcon-CF8U9dh7.js +1 -0
  64. package/dist/assets/cynefin-VYW2F7L2-CJZSs5s_.js +1 -0
  65. package/dist/assets/{cynefinDiagram-TSTJHNR4-CxFTiC-p.js → cynefinDiagram-TSTJHNR4-cdfImbfI.js} +1 -1
  66. package/dist/assets/{dagre-CaBNMcB1.js → dagre-CHNN9L9I.js} +1 -1
  67. package/dist/assets/{dagre-VKFMJZFB-S_7Hc7bI.js → dagre-VKFMJZFB-PscaENwr.js} +1 -1
  68. package/dist/assets/desktop-capabilities-page-BENHdKfk.js +1 -0
  69. package/dist/assets/desktop-update-config-BJMTQMRS.js +1 -0
  70. package/dist/assets/{diagram-FQU43EPY-C7zENvFb.js → diagram-FQU43EPY-CH_wye41.js} +1 -1
  71. package/dist/assets/{diagram-G47NLZAW-DqYTCqZA.js → diagram-G47NLZAW-Dtjpmi6D.js} +1 -1
  72. package/dist/assets/{diagram-NH7WQ7WH-BfSJtXRc.js → diagram-NH7WQ7WH-UdjLHyaz.js} +1 -1
  73. package/dist/assets/{diagram-OA4YK3LP-CFO-j67H.js → diagram-OA4YK3LP-DYsToEaL.js} +1 -1
  74. package/dist/assets/{diagram-WEI45ONY-DBQDbTaJ.js → diagram-WEI45ONY-CA7kuIer.js} +1 -1
  75. package/dist/assets/dialog-DQXou6pg.js +5 -0
  76. package/dist/assets/dist-CiC9Fd9J.js +1 -0
  77. package/dist/assets/doc-browser-CCYS_csH.js +1 -0
  78. package/dist/assets/doc-browser-context-CPLWVFLd.js +1 -0
  79. package/dist/assets/{docx-preview-B4-aDfvO.js → docx-preview-D--EsUWi.js} +1 -1
  80. package/dist/assets/{ebnfDiagram-CCIWWBDH-CfDNIXFN.js → ebnfDiagram-CCIWWBDH-BrjaoOuq.js} +1 -1
  81. package/dist/assets/{erDiagram-Q63AITRT-D95rFXMM.js → erDiagram-Q63AITRT-nZQa2kCM.js} +1 -1
  82. package/dist/assets/es2015-DHRpDU-q.js +41 -0
  83. package/dist/assets/eventmodeling-45OFAUF4-rc7kUq4V.js +1 -0
  84. package/dist/assets/extensions-CsWT7x3v.js +1 -0
  85. package/dist/assets/{eye-C84inPcV.js → eye-DJtw5KJ5.js} +1 -1
  86. package/dist/assets/flowDiagram-23GEKE2U-DAjaeGO8.js +1 -0
  87. package/dist/assets/form-actions-DDQk0END.js +1 -0
  88. package/dist/assets/{ganttDiagram-NO4QXBWP-Bawg0P0r.js → ganttDiagram-NO4QXBWP-CyFZHIHN.js} +1 -1
  89. package/dist/assets/gitGraph-TEB2WS4Q-Ce0gf6ps.js +1 -0
  90. package/dist/assets/{gitGraphDiagram-IHSO6WYX-BbKh9nbL.js → gitGraphDiagram-IHSO6WYX-Dfpq3z2M.js} +1 -1
  91. package/dist/assets/{i18n-20rSH40D.js → i18n-BjPkAKMQ.js} +2 -2
  92. package/dist/assets/info-DKCQHKI2-Cp-Tr78m.js +1 -0
  93. package/dist/assets/{infoDiagram-FWYZ7A6U-DPffZXYh.js → infoDiagram-FWYZ7A6U-Diiz0k1E.js} +1 -1
  94. package/dist/assets/{ishikawaDiagram-FXEZZL3T-CBMsLwZ2.js → ishikawaDiagram-FXEZZL3T-B3R3SN4M.js} +1 -1
  95. package/dist/assets/{journeyDiagram-5HDEW3XC-Mz5U4OzU.js → journeyDiagram-5HDEW3XC-DFOLKiNv.js} +1 -1
  96. package/dist/assets/{kanban-definition-HUTT4EX6-FXZq2k19.js → kanban-definition-HUTT4EX6-BMXpDp3g.js} +1 -1
  97. package/dist/assets/katex-B4FQSo9k.js +1 -0
  98. package/dist/assets/keyboard-shortcuts-settings-page-hqTP7akj.js +1 -0
  99. package/dist/assets/{line-BZwCgT9K.js → line-64_FhCoJ.js} +1 -1
  100. package/dist/assets/{linear-CTe9mKUw.js → linear-aF1fg7bK.js} +1 -1
  101. package/dist/assets/loader-circle-B-4WwzBj.js +1 -0
  102. package/dist/assets/login-page-BUwshAq4.js +1 -0
  103. package/dist/assets/login-page-CdlI6B8e.js +1 -0
  104. package/dist/assets/main-BVYdyT60.css +1 -0
  105. package/dist/assets/main-DYEALeoQ.js +2 -0
  106. package/dist/assets/main-i18n-catalog.config-1o2hjZ0m.js +1 -0
  107. package/dist/assets/{map-Ci48ZwAp.js → map-BC3Amra3.js} +1 -1
  108. package/dist/assets/mcp-marketplace-page-CRRQT6SP.js +1 -0
  109. package/dist/assets/{mermaid-parser.core-CzPD3U_z.js → mermaid-parser.core-DdMcZwnE.js} +2 -2
  110. package/dist/assets/{mermaid.core-geIMNPbV.js → mermaid.core-BHdiEBbI.js} +3 -3
  111. package/dist/assets/{mindmap-definition-LN4V7U3C-xqlKxsr_.js → mindmap-definition-LN4V7U3C-CtHVaZyV.js} +1 -1
  112. package/dist/assets/model-config-page-BSsHOhV7.js +1 -0
  113. package/dist/assets/navigation-history-CyawyVz0.js +1 -0
  114. package/dist/assets/navigation-link-D-fxdv0i.js +3 -0
  115. package/dist/assets/{ordinal-MxnX8yhv.js → ordinal-6b3jw4cz.js} +1 -1
  116. package/dist/assets/packet-7NZHBO7P-BOJuCraS.js +1 -0
  117. package/dist/assets/panel-app-i18n-catalog.config-kQO7QAwH.js +1 -0
  118. package/dist/assets/panelStandalone-BeI0Ndsx.js +2 -0
  119. package/dist/assets/{pegDiagram-2B236MQR-D50MFTN1.js → pegDiagram-2B236MQR-BtbG3Bgu.js} +1 -1
  120. package/dist/assets/pie-RZYD4A2V-D-FEO81x.js +1 -0
  121. package/dist/assets/{pieDiagram-ENE6RG2P-CpA13oiC.js → pieDiagram-ENE6RG2P-FmLl2hzN.js} +1 -1
  122. package/dist/assets/privacy-settings-page-pW_1naDz.js +1 -0
  123. package/dist/assets/projects-k6SLda_A.js +1 -0
  124. package/dist/assets/provider-models-mVzuEQBS.js +1 -0
  125. package/dist/assets/provider-scoped-model-input-CVbtT8L9.js +1 -0
  126. package/dist/assets/providers-config-page-rBlVrHkb.js +1 -0
  127. package/dist/assets/{puzzle-D6gulz7u.js → puzzle-kKiVft9-.js} +1 -1
  128. package/dist/assets/pwa-BgGM4kkY.js +1 -0
  129. package/dist/assets/{quadrantDiagram-ABIIQ3AL-CYCgaj4l.js → quadrantDiagram-ABIIQ3AL-7-OzMNpF.js} +1 -1
  130. package/dist/assets/radar-I7S5WNFK-Bq3eK1vK.js +1 -0
  131. package/dist/assets/railroad-3IZDKUUU-C3uZ1esg.js +1 -0
  132. package/dist/assets/railroad-abnf-AHOZXSZD-D3iZd1KT.js +1 -0
  133. package/dist/assets/railroad-ebnf-EBAXGLYW-Dl0FWqZu.js +1 -0
  134. package/dist/assets/railroad-peg-LSFZ7HO6-B51SbzGp.js +1 -0
  135. package/dist/assets/{railroadDiagram-RFXS5EU6-4LKDGlXN.js → railroadDiagram-RFXS5EU6-B_UVtLJO.js} +1 -1
  136. package/dist/assets/{refresh-cw-h9Xq3LY3.js → refresh-cw-BeG0y6yZ.js} +1 -1
  137. package/dist/assets/remote-wYWqir2w.js +1 -0
  138. package/dist/assets/{requirementDiagram-TGXJPOKE-CxNOU0JH.js → requirementDiagram-TGXJPOKE-D8TO2YeZ.js} +1 -1
  139. package/dist/assets/{rotate-cw-B6xm41Wn.js → rotate-cw-Ci2dcTO5.js} +1 -1
  140. package/dist/assets/runtime-config-page-DCXN0nkS.js +1 -0
  141. package/dist/assets/{sankeyDiagram-HTMAVEWB-DbCBDe2S.js → sankeyDiagram-HTMAVEWB-CUzIcq0B.js} +1 -1
  142. package/dist/assets/{save-fff_WpY2.js → save-Cr895abt.js} +1 -1
  143. package/dist/assets/search-config-page-CNQd481d.js +1 -0
  144. package/dist/assets/secrets-config-page--q7M58L8.js +3 -0
  145. package/dist/assets/security-config-CJb2pK2O.js +1 -0
  146. package/dist/assets/select-Bq-UmfCK.js +1 -0
  147. package/dist/assets/{sequenceDiagram-DBY2YBRQ-DA6W2BS_.js → sequenceDiagram-DBY2YBRQ-kqJzXbwu.js} +1 -1
  148. package/dist/assets/service-apps-panel-iLLEByRF.js +1 -0
  149. package/dist/assets/{settings-2-CE3ELQyk.js → settings-2-IodCcaXd.js} +1 -1
  150. package/dist/assets/{sizeCapture-X5ZJPWSS-T_q_d_VW.js → sizeCapture-X5ZJPWSS-D9ISogq1.js} +1 -1
  151. package/dist/assets/{src-CYpUlx-4.js → src-Bc0PoUJ1.js} +1 -1
  152. package/dist/assets/{stateDiagram-2N3HPSRC-mi8z2G0a.js → stateDiagram-2N3HPSRC-CqH5xc9W.js} +1 -1
  153. package/dist/assets/stateDiagram-v2-6OUMAXLB-CcOGfDdx.js +1 -0
  154. package/dist/assets/status-dot-DUYSKRCU.js +1 -0
  155. package/dist/assets/{swimlanes-5IMT3BWC-DkBEhWE4.js → swimlanes-5IMT3BWC-mwejV-rW.js} +2 -2
  156. package/dist/assets/swimlanesDiagram-G3AALYLV-BMI2k8RZ.js +8 -0
  157. package/dist/assets/tag-chip-CQU51ST3.js +1 -0
  158. package/dist/assets/theme-provider-D-zZkXxS.js +1 -0
  159. package/dist/assets/{timeline-definition-FHXFAJF6-BoFmqBw1.js → timeline-definition-FHXFAJF6-CuikIDlX.js} +1 -1
  160. package/dist/assets/trash-2-BDdqDh6E.js +1 -0
  161. package/dist/assets/treeView-QDETBFTQ-C0_07QI1.js +1 -0
  162. package/dist/assets/treemap-6X3UGDF4-Djpx6ccG.js +1 -0
  163. package/dist/assets/use-config-Bxx7DdaL.js +1 -0
  164. package/dist/assets/{use-desktop-capabilities-BkuRd2cY.js → use-desktop-capabilities-BTgdFgJy.js} +1 -1
  165. package/dist/assets/use-viewport-layout-CDcca0YL.js +1 -0
  166. package/dist/assets/{vennDiagram-L72KCM5P-BlZ3Or5U.js → vennDiagram-L72KCM5P-BD0P0qHh.js} +1 -1
  167. package/dist/assets/wardley-OPB4EBWU-DZVFxu81.js +1 -0
  168. package/dist/assets/{wardleyDiagram-EHGQE667-yDfr33i3.js → wardleyDiagram-EHGQE667-C6ma3t5D.js} +1 -1
  169. package/dist/assets/x-LUUwl8rK.js +1 -0
  170. package/dist/assets/{xychartDiagram-FW5EYKEG-mIXwIGAQ.js → xychartDiagram-FW5EYKEG-D7E40NBk.js} +1 -1
  171. package/dist/index.html +37 -54
  172. package/dist/panel-standalone.html +11 -15
  173. package/package.json +5 -5
  174. package/src/app/components/layout/__tests__/app-layout.test.tsx +8 -0
  175. package/src/app/components/layout/app-layout.tsx +18 -46
  176. package/src/app/configs/__tests__/app-navigation.config.test.ts +4 -0
  177. package/src/app/configs/app-navigation.config.ts +2 -0
  178. package/src/app/configs/page-resource-renderers.config.ts +13 -0
  179. package/src/app/index.tsx +4 -0
  180. package/src/app/presenters/app.presenter.ts +13 -2
  181. package/src/features/agents/components/__tests__/agents-page.test.tsx +4 -0
  182. package/src/features/agents/components/agent-details-dialog.tsx +3 -0
  183. package/src/features/agents/components/agents-page.tsx +7 -3
  184. package/src/features/apps/components/app-package-card.tsx +2 -2
  185. package/src/features/chat/components/conversation/chat-conversation-content.tsx +32 -19
  186. package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +1 -0
  187. package/src/features/chat/components/conversation/chat-conversation-header.tsx +1 -1
  188. package/src/features/chat/components/conversation/chat-conversation-panel.tsx +2 -2
  189. package/src/features/chat/components/conversation/chat-conversation-workspace-section.tsx +1 -0
  190. package/src/features/chat/components/layout/__tests__/chat-page-shell.test.tsx +7 -6
  191. package/src/features/chat/components/layout/__tests__/chat-sidebar-toolbar.test.tsx +14 -12
  192. package/src/features/chat/components/layout/chat-page-shell.tsx +33 -64
  193. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +8 -4
  194. package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +64 -256
  195. package/src/features/chat/components/layout/chat-sidebar.tsx +8 -30
  196. package/src/features/chat/components/providers/chat-runtime.provider.tsx +62 -0
  197. package/src/features/chat/features/conversation/components/__tests__/floating-session-conversation.test.tsx +70 -0
  198. package/src/features/chat/features/conversation/components/floating-session-conversation.tsx +27 -0
  199. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +1 -0
  200. package/src/features/chat/features/conversation/components/session-conversation-panel-tab.tsx +25 -0
  201. package/src/features/chat/features/conversation/hooks/use-chat-composer-reference-intent.ts +2 -1
  202. package/src/features/chat/features/message/components/__tests__/chat-inline-panel-app-card.test.tsx +2 -1
  203. package/src/features/chat/features/message/components/__tests__/chat-message-assistant-header.container.test.tsx +3 -0
  204. package/src/features/chat/features/message/components/__tests__/chat-message-list-skill-preview.container.test.tsx +3 -0
  205. package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +3 -0
  206. package/src/features/chat/features/message/hooks/use-chat-inline-token-actions.ts +7 -3
  207. package/src/features/chat/features/session/components/__tests__/chat-sidebar-session-item.test.tsx +20 -0
  208. package/src/features/chat/features/session/components/chat-mobile-session-row.tsx +61 -0
  209. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +0 -35
  210. package/src/features/chat/features/session/components/chat-sidebar-session-entry.tsx +2 -0
  211. package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +13 -5
  212. package/src/features/chat/features/session/components/chat-sidebar-session-list.tsx +5 -3
  213. package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +8 -0
  214. package/src/features/chat/features/session/components/session-header/chat-session-header-actions.tsx +3 -0
  215. package/src/features/chat/features/session/components/session-header/chat-session-more-actions-menu.tsx +6 -0
  216. package/src/features/chat/features/session/utils/chat-session-route.utils.ts +12 -0
  217. package/src/features/chat/features/workspace/components/__tests__/chat-session-child-sessions.test.tsx +28 -0
  218. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.test.tsx +9 -0
  219. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +6 -2
  220. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel.test.tsx +49 -12
  221. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +13 -6
  222. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +6 -0
  223. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +21 -36
  224. package/src/features/chat/features/workspace/components/chat-session-workspace-panel.tsx +40 -31
  225. package/src/features/chat/features/workspace/components/child-sessions/chat-session-child-sessions.tsx +6 -1
  226. package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +2 -2
  227. package/src/features/chat/features/workspace/components/project-files/workspace-project-files-toolbar.tsx +2 -2
  228. package/src/features/chat/features/workspace/utils/__tests__/chat-workspace-panel-view-model.utils.test.ts +27 -0
  229. package/src/features/chat/features/workspace/utils/__tests__/workspace-file-panel-route.utils.test.ts +94 -0
  230. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab-persistence.utils.ts +2 -0
  231. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab.utils.ts +15 -0
  232. package/src/features/chat/features/workspace/utils/chat-workspace-panel-view-model.utils.ts +11 -0
  233. package/src/features/chat/features/workspace/utils/workspace-file-panel-route.utils.ts +147 -0
  234. package/src/features/chat/index.ts +20 -4
  235. package/src/features/chat/managers/__tests__/chat-completion-notification.manager.test.ts +8 -0
  236. package/src/features/chat/managers/__tests__/chat-thread-workspace.manager.test.ts +7 -2
  237. package/src/features/chat/managers/__tests__/session-surface.manager.test.ts +45 -0
  238. package/src/features/chat/managers/chat-completion-notification.manager.ts +5 -0
  239. package/src/features/chat/managers/chat-composer-intent.manager.ts +16 -0
  240. package/src/features/chat/managers/chat-thread.manager.ts +18 -27
  241. package/src/features/chat/managers/session-surface.manager.ts +46 -0
  242. package/src/features/chat/pages/__tests__/ncp-chat-page.test.tsx +23 -5
  243. package/src/features/chat/pages/ncp-chat-page.tsx +6 -86
  244. package/src/features/chat/presenters/chat.presenter.ts +2 -1
  245. package/src/features/chat/stores/__tests__/chat-thread.store.test.ts +2 -2
  246. package/src/features/chat/stores/chat-thread.store.ts +7 -1
  247. package/src/features/chat/stores/floating-session.store.ts +11 -0
  248. package/src/features/cron/components/__tests__/cron-config.test.tsx +4 -0
  249. package/src/features/cron/components/cron-job-detail-dialog.tsx +3 -1
  250. package/src/features/cron/components/cron-job-row.tsx +5 -1
  251. package/src/features/inbox/components/inbox-reader-dialog.test.tsx +3 -0
  252. package/src/features/inbox/components/inbox-reader-dialog.tsx +3 -0
  253. package/src/features/inbox/pages/inbox-page.test.ts +3 -0
  254. package/src/features/inbox/pages/inbox-page.tsx +3 -0
  255. package/src/features/marketplace/components/__tests__/marketplace-page-detail.test.tsx +5 -1
  256. package/src/features/marketplace/components/__tests__/marketplace-page.test.tsx +3 -0
  257. package/src/features/marketplace/components/curated-shelves/__tests__/marketplace-curated-scene-route.test.tsx +2 -0
  258. package/src/features/marketplace/components/marketplace-list-card.tsx +4 -0
  259. package/src/features/marketplace/components/mcp/__tests__/mcp-marketplace-page.test.tsx +2 -0
  260. package/src/features/marketplace/components/mcp/mcp-marketplace-card.tsx +3 -0
  261. package/src/features/notifications/components/__tests__/app-notification-toast.test.tsx +19 -0
  262. package/src/features/notifications/components/app-notification-toast.tsx +33 -15
  263. package/src/features/notifications/managers/app-notification.manager.ts +2 -0
  264. package/src/features/panel-apps/components/__tests__/panel-app-list-item.test.tsx +11 -4
  265. package/src/features/panel-apps/components/__tests__/panel-app-toolbar.test.tsx +11 -5
  266. package/src/features/panel-apps/components/panel-app-main-sidebar-menu-item.tsx +5 -38
  267. package/src/features/panel-apps/index.ts +1 -1
  268. package/src/features/projects/components/project-materials.test.tsx +2 -0
  269. package/src/features/projects/components/project-skills.tsx +7 -3
  270. package/src/features/projects/components/work/project-work-item-drawer.test.tsx +2 -0
  271. package/src/features/projects/components/work/project-work-item-drawer.tsx +3 -1
  272. package/src/features/right-panel-resources/components/__tests__/page-resource-icon.test.tsx +67 -0
  273. package/src/features/right-panel-resources/components/__tests__/page-resource-sidebar-nav.test.tsx +158 -0
  274. package/src/features/right-panel-resources/components/__tests__/system-object-resource.test.tsx +42 -0
  275. package/src/features/right-panel-resources/components/current-page-actions.tsx +36 -0
  276. package/src/features/right-panel-resources/components/page-resource-actions-menu.tsx +71 -0
  277. package/src/features/right-panel-resources/components/page-resource-icon.tsx +245 -0
  278. package/src/features/right-panel-resources/components/page-resource-sidebar-nav.tsx +122 -0
  279. package/src/features/right-panel-resources/components/system-object-resource.tsx +100 -0
  280. package/src/features/right-panel-resources/components/workspace-file-resource.tsx +56 -0
  281. package/src/features/right-panel-resources/configs/right-panel-resource-routes.config.ts +46 -3
  282. package/src/features/right-panel-resources/hooks/use-page-resource-actions.ts +137 -0
  283. package/src/features/right-panel-resources/index.ts +22 -8
  284. package/src/features/right-panel-resources/managers/__tests__/page-resource.manager.test.ts +149 -0
  285. package/src/features/right-panel-resources/managers/page-resource.manager.ts +342 -0
  286. package/src/features/right-panel-resources/pages/resource-page.tsx +114 -0
  287. package/src/features/right-panel-resources/stores/page-navigation.store.ts +55 -0
  288. package/src/features/right-panel-resources/types/page-resource.types.ts +11 -0
  289. package/src/features/right-panel-resources/utils/__tests__/right-panel-resource-route-resolver.utils.test.ts +10 -0
  290. package/src/features/right-panel-resources/utils/page-resource-identity.utils.ts +61 -0
  291. package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +2 -6
  292. package/src/features/service-apps/components/__tests__/service-apps-panel.test.tsx +2 -0
  293. package/src/features/service-apps/components/service-app-list-item.tsx +5 -1
  294. package/src/features/settings/pages/providers-config-page.tsx +2 -2
  295. package/src/features/side-dock/components/__tests__/side-dock.test.tsx +9 -8
  296. package/src/features/side-dock/components/side-dock.tsx +14 -47
  297. package/src/features/side-dock/managers/side-dock.manager.ts +2 -0
  298. package/src/platforms/desktop/components/__tests__/desktop-app-shell.test.tsx +3 -0
  299. package/src/platforms/desktop/components/desktop-app-shell.tsx +5 -14
  300. package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +1 -0
  301. package/src/platforms/mobile/components/__tests__/mobile-bottom-nav.test.tsx +3 -2
  302. package/src/platforms/mobile/components/mobile-app-shell.tsx +5 -4
  303. package/src/platforms/mobile/components/mobile-bottom-nav.tsx +7 -7
  304. package/src/platforms/mobile/components/mobile-topbar.tsx +4 -4
  305. package/src/shared/components/doc-browser/__tests__/doc-browser-context.test.tsx +4 -3
  306. package/src/shared/components/doc-browser/__tests__/doc-browser-tab-strip.test.tsx +0 -5
  307. package/src/shared/components/doc-browser/__tests__/doc-browser.test.tsx +57 -73
  308. package/src/shared/components/doc-browser/__tests__/resource-link-interceptor.test.tsx +104 -0
  309. package/src/shared/components/doc-browser/doc-browser-context.tsx +5 -1
  310. package/src/shared/components/doc-browser/doc-browser-panel-parts.tsx +1 -1
  311. package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +6 -118
  312. package/src/shared/components/doc-browser/doc-browser.tsx +30 -194
  313. package/src/shared/components/doc-browser/hooks/use-doc-browser-scroll-restoration.ts +1 -1
  314. package/src/shared/components/doc-browser/managers/doc-browser.manager.ts +11 -1
  315. package/src/shared/components/doc-browser/stores/doc-browser.store.ts +3 -7
  316. package/src/shared/components/doc-browser/types/doc-browser.types.ts +8 -1
  317. package/src/shared/components/doc-browser/use-doc-link-interceptor.ts +30 -32
  318. package/src/shared/components/doc-browser/utils/doc-browser-state.utils.ts +6 -6
  319. package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +22 -0
  320. package/src/shared/components/ui/context-menu/context-menu.tsx +18 -10
  321. package/src/shared/components/workbench/__tests__/workbench-surface.manager.test.ts +70 -0
  322. package/src/shared/components/workbench/__tests__/workbench-surface.test.tsx +111 -0
  323. package/src/shared/components/workbench/managers/workbench-surface.manager.ts +120 -0
  324. package/src/shared/components/workbench/stores/workbench-surface.store.ts +83 -0
  325. package/src/shared/components/workbench/types/workbench-surface.types.ts +32 -0
  326. package/src/shared/components/workbench/utils/workbench-surface-geometry.utils.ts +46 -0
  327. package/src/shared/components/workbench/workbench-surface-toolbar.tsx +102 -0
  328. package/src/shared/components/workbench/workbench-surface.tsx +401 -0
  329. package/src/shared/hooks/use-panel-app-scroll-restoration.test.tsx +19 -0
  330. package/src/shared/hooks/use-panel-app-scroll-restoration.ts +8 -6
  331. package/src/shared/hooks/use-scroll-restoration.test.tsx +39 -2
  332. package/src/shared/hooks/use-scroll-restoration.ts +33 -33
  333. package/src/shared/lib/api/marketplace.types.ts +1 -0
  334. package/src/shared/lib/i18n/locales/en-US/chat.json +38 -0
  335. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +1 -1
  336. package/src/shared/lib/i18n/locales/zh-CN/chat.json +38 -0
  337. package/src/shared/lib/navigation-history/index.ts +1 -0
  338. package/src/shared/lib/navigation-history/navigation-history.utils.ts +1 -1
  339. package/src/shared/lib/navigation-history/scroll-restoration.manager.test.ts +11 -0
  340. package/src/shared/lib/navigation-history/scroll-restoration.manager.ts +36 -7
  341. package/src/shared/lib/navigation-history/view-memory-storage.store.test.ts +37 -0
  342. package/src/shared/lib/navigation-history/view-memory-storage.store.ts +21 -0
  343. package/src/shared/lib/ui-document-title/index.ts +1 -0
  344. package/dist/assets/account-panel-BW4GbzQd.js +0 -1
  345. package/dist/assets/api-DqzQ-_3w.js +0 -13
  346. package/dist/assets/app-data-C54N2p8b.js +0 -1
  347. package/dist/assets/app-presenter-provider-CBZ_-ewx.js +0 -115
  348. package/dist/assets/appearance-settings-page-C-uZ2Wkf.js +0 -1
  349. package/dist/assets/architecture-TIHT7OUA-DEt0Abz9.js +0 -1
  350. package/dist/assets/boxes-D6uPnkGo.js +0 -1
  351. package/dist/assets/card-BhfAZv5L.js +0 -1
  352. package/dist/assets/channel-CxQkbwRD.js +0 -1
  353. package/dist/assets/channels-list-page-Bv7CVSqV.js +0 -8
  354. package/dist/assets/chevron-down-BL-yMYcX.js +0 -1
  355. package/dist/assets/chunk-2Q5K7J3B-ClVhziok.js +0 -1
  356. package/dist/assets/chunk-VAUOI2AC-DZQxkIsv.js +0 -1
  357. package/dist/assets/chunk-XXDRQBXY-BkExtw5C.js +0 -1
  358. package/dist/assets/circle-alert-lSa3LRvS.js +0 -1
  359. package/dist/assets/classDiagram-OUVF2IWQ-Bd6apBb-.js +0 -1
  360. package/dist/assets/classDiagram-v2-EOCWNBFH-CYxUZGCI.js +0 -1
  361. package/dist/assets/client-BtGBwLTs.js +0 -1
  362. package/dist/assets/config-split-page-DqAXKLmG.js +0 -1
  363. package/dist/assets/confirm-dialog-BTKCWMn6.js +0 -1
  364. package/dist/assets/createLucideIcon-BNKf0_kc.js +0 -1
  365. package/dist/assets/cynefin-VYW2F7L2-CV0bFLH9.js +0 -1
  366. package/dist/assets/desktop-capabilities-page-zLzCSB7A.js +0 -1
  367. package/dist/assets/desktop-update-config-PmofcFf6.js +0 -1
  368. package/dist/assets/dialog-Xe73hpQz.js +0 -5
  369. package/dist/assets/dist-BiIcnf9j.js +0 -1
  370. package/dist/assets/dist-C5I0v8Qn.js +0 -1
  371. package/dist/assets/dist-czPa8xFO.js +0 -1
  372. package/dist/assets/doc-browser-BJrre2S_.js +0 -1
  373. package/dist/assets/doc-browser-BPqA-zQx.js +0 -1
  374. package/dist/assets/doc-browser-context-TILuCY5c.js +0 -1
  375. package/dist/assets/ellipsis-C5YXdOUx.js +0 -1
  376. package/dist/assets/es2015-cuwbYI-l.js +0 -41
  377. package/dist/assets/eventmodeling-45OFAUF4-BzkLWWdP.js +0 -1
  378. package/dist/assets/extensions-CVUFK6Jj.js +0 -1
  379. package/dist/assets/flowDiagram-23GEKE2U-ukkCsB0j.js +0 -1
  380. package/dist/assets/form-actions-BRESe-m_.js +0 -1
  381. package/dist/assets/gitGraph-TEB2WS4Q-BYFhT0Q5.js +0 -1
  382. package/dist/assets/i18n-provider-BPRq6S7O.js +0 -1
  383. package/dist/assets/info-DKCQHKI2-CTmlJdcH.js +0 -1
  384. package/dist/assets/katex-DbZC06Q5.js +0 -1
  385. package/dist/assets/keyboard-shortcuts-settings-page-CScSXYS4.js +0 -1
  386. package/dist/assets/loader-circle-K1BDdHR5.js +0 -1
  387. package/dist/assets/login-page-Dlyvp-81.js +0 -1
  388. package/dist/assets/login-page-f8qQ4xKY.js +0 -1
  389. package/dist/assets/logo-badge-C-5-zim6.js +0 -1
  390. package/dist/assets/main-D2dWy8fM.css +0 -1
  391. package/dist/assets/main-DMNmwcJE.js +0 -2
  392. package/dist/assets/main-i18n-catalog.config-DZ-5ollN.js +0 -1
  393. package/dist/assets/mcp-marketplace-page-FfIfEo6w.js +0 -10
  394. package/dist/assets/mcp-marketplace-page-sH7VptN_.js +0 -1
  395. package/dist/assets/model-config-page-Bcm6-pCX.js +0 -1
  396. package/dist/assets/navigation-link-BAQjgx2F.js +0 -3
  397. package/dist/assets/packet-7NZHBO7P-BbrI0ZlN.js +0 -1
  398. package/dist/assets/panel-app-i18n-catalog.config-p3qAY_Eq.js +0 -1
  399. package/dist/assets/panelStandalone-By-6dDXS.js +0 -2
  400. package/dist/assets/pie-RZYD4A2V-B7zE1ZIr.js +0 -1
  401. package/dist/assets/plus-LA8-jpxP.js +0 -1
  402. package/dist/assets/popover-NkrFlWHp.js +0 -1
  403. package/dist/assets/privacy-settings-page-B1sHLAc1.js +0 -1
  404. package/dist/assets/projects-Voql-cvx.js +0 -1
  405. package/dist/assets/provider-models-hrHMcHqg.js +0 -1
  406. package/dist/assets/provider-scoped-model-input-BQsugx1v.js +0 -1
  407. package/dist/assets/providers-config-page-BDEdHJbw.js +0 -1
  408. package/dist/assets/pwa-CzqfYjFx.js +0 -1
  409. package/dist/assets/radar-I7S5WNFK-1X_q11Ed.js +0 -1
  410. package/dist/assets/railroad-3IZDKUUU-CIXnuFyE.js +0 -1
  411. package/dist/assets/railroad-abnf-AHOZXSZD-D6ImKl2r.js +0 -1
  412. package/dist/assets/railroad-ebnf-EBAXGLYW-2j9d3twU.js +0 -1
  413. package/dist/assets/railroad-peg-LSFZ7HO6-DMVaJGbm.js +0 -1
  414. package/dist/assets/remote-BekqL5nA.js +0 -1
  415. package/dist/assets/runtime-config-page-BH9uF4u_.js +0 -1
  416. package/dist/assets/search-CUe41wjm.js +0 -1
  417. package/dist/assets/search-config-page-DWKlMHgH.js +0 -1
  418. package/dist/assets/secrets-config-page-DiQL088Y.js +0 -3
  419. package/dist/assets/security-config-DmTDKKY4.js +0 -1
  420. package/dist/assets/select-CG5YWnwe.js +0 -1
  421. package/dist/assets/service-apps-panel-CEnyYsQp.js +0 -1
  422. package/dist/assets/skeleton-Drvn83YW.js +0 -1
  423. package/dist/assets/stateDiagram-v2-6OUMAXLB-OlIMT57r.js +0 -1
  424. package/dist/assets/swimlanesDiagram-G3AALYLV-sLThrh07.js +0 -8
  425. package/dist/assets/tabs-BuE0qKMh.js +0 -1
  426. package/dist/assets/tag-chip-B1AYPOKL.js +0 -1
  427. package/dist/assets/theme-provider-DzvAi3pe.js +0 -1
  428. package/dist/assets/tooltip-DYcuWhuP.js +0 -1
  429. package/dist/assets/trash-2-BPPYt2NV.js +0 -1
  430. package/dist/assets/treeView-QDETBFTQ-CCFyazDE.js +0 -1
  431. package/dist/assets/treemap-6X3UGDF4-D6wvq1Hz.js +0 -1
  432. package/dist/assets/use-config-BEdbtpD4.js +0 -1
  433. package/dist/assets/use-panel-app-scroll-restoration-ZnicIfo3.js +0 -1
  434. package/dist/assets/use-viewport-layout-BS18drMT.js +0 -1
  435. package/dist/assets/utils-CBZPzC_b.js +0 -8
  436. package/dist/assets/wardley-OPB4EBWU-BRzaRyFf.js +0 -1
  437. package/dist/assets/x-DdXOqLnX.js +0 -1
  438. package/src/features/panel-apps/components/__tests__/panel-app-main-sidebar-nav.test.tsx +0 -219
  439. package/src/features/panel-apps/components/panel-app-main-sidebar-nav.tsx +0 -258
  440. package/src/shared/components/doc-browser/utils/doc-browser-floating-panel.utils.ts +0 -83
  441. /package/dist/assets/{array-D0DyKZdT.js → array-B0sEvCP9.js} +0 -0
  442. /package/dist/assets/{chunk-KEIR6QF5-CuZFOa6q.js → chunk-KEIR6QF5-BeO7fxDQ.js} +0 -0
  443. /package/dist/assets/{chunk-Y2CYZVJY-Frut-1TF.js → chunk-Y2CYZVJY-JQfgEV36.js} +0 -0
  444. /package/dist/assets/{config-hints-B_C9DAp5.js → config-hints-D3OuwoEY.js} +0 -0
  445. /package/dist/assets/{cytoscape.esm-BibuhnZD.js → cytoscape.esm-CzJ9uXgi.js} +0 -0
  446. /package/dist/assets/{defaultLocale-q7sRUXPc.js → defaultLocale-USmzX3VG.js} +0 -0
  447. /package/dist/assets/{dist-DhMddrrH.js → dist-BYF6XVna.js} +0 -0
  448. /package/dist/assets/{graphlib-BM63WsW3.js → graphlib-DEFMkHdW.js} +0 -0
  449. /package/dist/assets/{host-capabilities-B107nwS3.js → host-capabilities-C0MmWd3M.js} +0 -0
  450. /package/dist/assets/{init-CRMkf9sL.js → init-04ErALoz.js} +0 -0
  451. /package/dist/assets/{jszip.min-6thm2J_a.js → jszip.min-BnQ5NRy2.js} +0 -0
  452. /package/dist/assets/{katex-B26hhTOT.js → katex-CsAM73R9.js} +0 -0
  453. /package/dist/assets/{middleware-0o3JF3tS.js → middleware-CAXxl-af.js} +0 -0
  454. /package/dist/assets/{panel-app-B39rJPj8.js → panel-app-2EACRB8p.js} +0 -0
  455. /package/dist/assets/{path-BFMmafCM.js → path-CzxQ9n2G.js} +0 -0
  456. /package/dist/assets/{rough.esm-5Tjchx1D.js → rough.esm-pT9fdsW3.js} +0 -0
  457. /package/dist/assets/{xlsx-BC8ibjXK.js → xlsx-BRpCSiE4.js} +0 -0
@@ -0,0 +1,114 @@
1
+ import {
2
+ isDocsUrl,
3
+ normalizeDocUrl,
4
+ } from "@/shared/components/doc-browser/utils/doc-browser-url.utils";
5
+ import { useEffect, useMemo, useRef, useState } from "react";
6
+ import { useNavigate, useSearchParams } from "react-router-dom";
7
+ import { useAppPresenter } from "@/app/components/app-presenter-provider";
8
+ import { PAGE_RESOURCE_RENDERERS } from "@/app/configs/page-resource-renderers.config";
9
+ import { DocBrowserFrameContent } from "@/shared/components/doc-browser/doc-browser-panel-parts";
10
+ import { useDocBrowserScrollRestoration } from "@/shared/components/doc-browser/hooks/use-doc-browser-scroll-restoration";
11
+ import { PageResourceActionsMenu } from "@/features/right-panel-resources/components/page-resource-actions-menu";
12
+ import { PageResourceIcon } from "@/features/right-panel-resources/components/page-resource-icon";
13
+ import { pageResourceTab } from "@/features/right-panel-resources/managers/page-resource.manager";
14
+ import { pageResourceFromTarget } from "@/features/right-panel-resources/utils/page-resource-identity.utils";
15
+ import type { PageResource } from "@/features/right-panel-resources/types/page-resource.types";
16
+ import { t } from "@/shared/lib/i18n";
17
+
18
+ function ResourcePageContent({ page }: { page: PageResource }) {
19
+ const app = useAppPresenter();
20
+ const navigate = useNavigate();
21
+ const iframeRef = useRef<HTMLIFrameElement>(null);
22
+ const [revision, setRevision] = useState(0);
23
+ const tab = useMemo(() => pageResourceTab(page), [page]);
24
+ const renderer = PAGE_RESOURCE_RENDERERS[tab.kind];
25
+ const iframeInstanceId = `main:${page.uri}:${revision}`;
26
+ const restore = useDocBrowserScrollRestoration({
27
+ currentTab: tab,
28
+ iframeRef,
29
+ isEnabled: Boolean(renderer?.supportsScrollRestoration),
30
+ });
31
+ useEffect(() => {
32
+ const handler = (event: MessageEvent) => {
33
+ if (event.source !== iframeRef.current?.contentWindow) return;
34
+ if (
35
+ tab.kind === "docs" &&
36
+ event.data?.type === "docs-route-change" &&
37
+ typeof event.data.url === "string" &&
38
+ isDocsUrl(event.data.url) &&
39
+ normalizeDocUrl(event.data.url) !== normalizeDocUrl(tab.currentUrl)
40
+ ) {
41
+ const next = app.pageResourceManager.resolve(event.data.url);
42
+ if (next) app.pageResourceManager.open(next, "main", navigate);
43
+ }
44
+ renderer?.onIframeMessage?.({
45
+ event,
46
+ iframe: iframeRef.current,
47
+ iframeInstanceId,
48
+ tab,
49
+ });
50
+ };
51
+ window.addEventListener("message", handler);
52
+ return () => window.removeEventListener("message", handler);
53
+ }, [app, navigate, iframeInstanceId, renderer, tab]);
54
+ const params = {
55
+ tab,
56
+ currentUrl: tab.currentUrl,
57
+ refreshIframe: () => setRevision((value) => value + 1),
58
+ open: (uri?: string) => {
59
+ const next = uri ? app.pageResourceManager.resolve(uri) : null;
60
+ if (next) app.pageResourceManager.open(next, "main", navigate);
61
+ },
62
+ openTarget: (target: PageResource["target"]) =>
63
+ app.pageResourceManager.open(
64
+ pageResourceFromTarget(target),
65
+ "main",
66
+ navigate,
67
+ ),
68
+ };
69
+ return (
70
+ <div
71
+ className="flex h-full min-h-0 flex-col bg-background"
72
+ data-testid="resource-main-page"
73
+ >
74
+ <header className="flex min-h-10 shrink-0 items-center gap-2 border-b border-border/60 px-3">
75
+ <PageResourceIcon uri={page.uri} icon={page.target.dockIcon} />
76
+ <span className="min-w-0 flex-1 truncate text-sm">{page.title}</span>
77
+ <PageResourceActionsMenu page={page} />
78
+ </header>
79
+ {renderer?.renderToolbar?.(params)}
80
+ <DocBrowserFrameContent
81
+ currentTab={tab}
82
+ currentUrl={tab.currentUrl}
83
+ customContent={renderer?.renderContent?.(params)}
84
+ iframeRef={iframeRef}
85
+ iframeInstanceId={iframeInstanceId}
86
+ iframeSandbox={renderer?.getIframeSandbox?.(tab)}
87
+ isDragging={false}
88
+ isResizing={false}
89
+ onIframeLoad={restore}
90
+ onIframePointerOver={renderer?.onIframePointerOver}
91
+ />
92
+ </div>
93
+ );
94
+ }
95
+
96
+ export function ResourcePage() {
97
+ const app = useAppPresenter();
98
+ const [search] = useSearchParams();
99
+ const navigate = useNavigate();
100
+ const uri = search.get("uri") ?? "";
101
+ const page = useMemo(() => app.pageResourceManager.resolve(uri), [app, uri]);
102
+ useEffect(() => {
103
+ if (page?.target.kind === "workspace")
104
+ app.pageResourceManager.open(page, "main", navigate);
105
+ }, [app, navigate, page]);
106
+ if (page?.target.kind === "workspace") return null;
107
+ if (!page)
108
+ return (
109
+ <p role="status" className="p-4 text-sm text-muted-foreground">
110
+ {t("pageUnavailable")}
111
+ </p>
112
+ );
113
+ return <ResourcePageContent key={page.uri} page={page} />;
114
+ }
@@ -0,0 +1,55 @@
1
+ import { ViewMemoryStorage } from "@/shared/lib/navigation-history";
2
+ import { create } from "zustand";
3
+ import { createJSONStorage, persist } from "zustand/middleware";
4
+ import type { PageResource } from "@/features/right-panel-resources/types/page-resource.types";
5
+
6
+ function safeTargetUrl(value: string): boolean {
7
+ if (/^\/(?!\/)/.test(value) && !value.includes("\\")) return true;
8
+ try {
9
+ return ["nextclaw:", "http:", "https:"].includes(new URL(value).protocol);
10
+ } catch {
11
+ return false;
12
+ }
13
+ }
14
+
15
+ function readPages(value: unknown): PageResource[] {
16
+ if (
17
+ !value ||
18
+ typeof value !== "object" ||
19
+ !("pinned" in value) ||
20
+ !Array.isArray(value.pinned)
21
+ )
22
+ return [];
23
+ return value.pinned
24
+ .filter((page): page is PageResource => {
25
+ if (!page || typeof page !== "object") return false;
26
+ return (
27
+ typeof page.uri === "string" &&
28
+ /^(nextclaw:\/\/|https?:\/\/)/.test(page.uri) &&
29
+ typeof page.title === "string" &&
30
+ typeof page.target?.url === "string" &&
31
+ safeTargetUrl(page.target.url) &&
32
+ (page.mainPath === undefined ||
33
+ (typeof page.mainPath === "string" &&
34
+ /^\/(?!\/)/.test(page.mainPath) &&
35
+ !page.mainPath.includes("\\"))) &&
36
+ typeof page.target?.kind === "string" &&
37
+ typeof page.target?.title === "string" &&
38
+ ["managed", "none"].includes(page.target.historyPolicy)
39
+ );
40
+ })
41
+ .filter(
42
+ (page, index, pages) =>
43
+ pages.findIndex((candidate) => candidate.uri === page.uri) === index,
44
+ )
45
+ .slice(-64);
46
+ }
47
+
48
+ export const usePageNavigationStore = create<{ pinned: PageResource[] }>()(
49
+ persist((): { pinned: PageResource[] } => ({ pinned: [] }), {
50
+ name: "nextclaw.page-navigation",
51
+ version: 1,
52
+ storage: createJSONStorage(() => new ViewMemoryStorage()),
53
+ merge: (saved, current) => ({ ...current, pinned: readPages(saved) }),
54
+ }),
55
+ );
@@ -0,0 +1,11 @@
1
+ import type { DocBrowserRouteTarget } from "@/shared/components/doc-browser/types/doc-browser.types";
2
+
3
+ /** Resource identity is independent of the surface currently presenting it. */
4
+ export type PageResource = {
5
+ uri: string;
6
+ title: string;
7
+ target: DocBrowserRouteTarget;
8
+ mainPath?: string;
9
+ };
10
+
11
+ export type PageOpenLocation = "default" | "main" | "sidebar" | "floating";
@@ -2,6 +2,16 @@ import { describe, expect, it } from 'vitest';
2
2
  import { RightPanelResourceRouteResolver } from '@/features/right-panel-resources';
3
3
 
4
4
  describe('RightPanelResourceRouteResolver', () => {
5
+ it.each(['cron-job', 'inbox-delivery', 'skill', 'agent', 'project'])('resolves %s as an object, not an unsupported website', (type) => {
6
+ const uri = 'nextclaw://objects/' + type + '/' + encodeURIComponent('workspace:项目/对象');
7
+ expect(new RightPanelResourceRouteResolver().resolve(uri)).toMatchObject({ kind: 'system-object', url: uri, resourceUri: uri });
8
+ });
9
+ it('distinguishes a marketplace skill detail from its collection', () => {
10
+ const resolver = new RightPanelResourceRouteResolver();
11
+ expect(resolver.resolve('nextclaw://marketplace-detail/skill%3Aexample')).toMatchObject({ kind:'marketplace-detail' });
12
+ expect(resolver.resolve('nextclaw://marketplace')).toMatchObject({ kind:'route', url:'/skills' });
13
+ });
14
+
5
15
  it('normalizes apps resources and keeps service apps distinct', () => {
6
16
  const resolver = new RightPanelResourceRouteResolver();
7
17
 
@@ -0,0 +1,61 @@
1
+ import { createSystemObjectReferenceUri } from "@nextclaw/shared";
2
+ import type {
3
+ DocBrowserRouteTarget,
4
+ DocBrowserTab,
5
+ } from "@/shared/components/doc-browser/types/doc-browser.types";
6
+ import {
7
+ buildSessionPath,
8
+ parseSessionKeyFromPanelUrl,
9
+ } from "@/features/chat";
10
+ import { readPanelAppIdFromTab } from "./right-panel-resource-uri.utils";
11
+ import type { PageResource } from "@/features/right-panel-resources/types/page-resource.types";
12
+
13
+ export function pageResourceFromTarget(
14
+ target: DocBrowserRouteTarget,
15
+ ): PageResource {
16
+ const uri = target.resourceUri ?? target.url;
17
+ const sessionKey = parseSessionKeyFromPanelUrl(uri);
18
+ const appId = readPanelAppIdFromTab({
19
+ resourceUri: uri,
20
+ currentUrl: target.url,
21
+ });
22
+ return {
23
+ uri,
24
+ title: target.title,
25
+ target,
26
+ ...(target.kind === "route"
27
+ ? { mainPath: target.url }
28
+ : sessionKey
29
+ ? { mainPath: buildSessionPath(sessionKey) }
30
+ : appId
31
+ ? { mainPath: `/apps/panel/${encodeURIComponent(appId)}` }
32
+ : {}),
33
+ };
34
+ }
35
+
36
+ export function pageResourceFromTab(tab: DocBrowserTab): PageResource {
37
+ return pageResourceFromTarget({
38
+ ...tab,
39
+ url: tab.currentUrl,
40
+ historyPolicy: "managed",
41
+ });
42
+ }
43
+
44
+ export function pageResourceMainPath(page: PageResource): string {
45
+ return page.mainPath ?? `/resource?uri=${encodeURIComponent(page.uri)}`;
46
+ }
47
+
48
+ export function pageResourceFromSystemObject(
49
+ objectType: string,
50
+ objectId: string,
51
+ title: string,
52
+ ): PageResource {
53
+ const uri = createSystemObjectReferenceUri(objectType, objectId);
54
+ return pageResourceFromTarget({
55
+ kind: "system-object",
56
+ title,
57
+ url: uri,
58
+ resourceUri: uri,
59
+ historyPolicy: "none",
60
+ });
61
+ }
@@ -1,3 +1,5 @@
1
+ import { createPanelAppResourceUri } from '@nextclaw/shared';
2
+ export { createPanelAppResourceUri } from '@nextclaw/shared';
1
3
  import {
2
4
  readChatUiResourceReference,
3
5
  type ChatUiResourceReference,
@@ -67,12 +69,6 @@ export function normalizeRightPanelAppsUrl(url: string): string {
67
69
  return createRightPanelAppsUrl(getRightPanelAppsTabFromUrl(url));
68
70
  }
69
71
 
70
- export function createPanelAppResourceUri(appId: string, sourcePath?: string): string {
71
- const uri = `nextclaw://panel-app/${encodeURIComponent(appId)}`;
72
- const path = sourcePath?.trim();
73
- return path ? `${uri}?${new URLSearchParams({ path }).toString()}` : uri;
74
- }
75
-
76
72
  export function createPanelAppContentPath(appId: string, sourcePath?: string): string {
77
73
  const url = `/api/panel-apps/${encodeURIComponent(appId)}/content`;
78
74
  const path = sourcePath?.trim();
@@ -206,3 +206,5 @@ describe('ServiceAppsPanel', () => {
206
206
  });
207
207
  });
208
208
  });
209
+
210
+ vi.mock("@/features/right-panel-resources/hooks/use-page-resource-actions", () => ({ usePageResourceActions: () => () => [] }));
@@ -1,3 +1,5 @@
1
+ import { PageResourceActionItems } from "@/features/right-panel-resources";
2
+ import { pageResourceFromSystemObject } from "@/features/right-panel-resources";
1
3
  import { useState } from "react";
2
4
  import type {
3
5
  AgentProfileView,
@@ -165,7 +167,9 @@ export function ServiceAppListItem({
165
167
  {t("serviceAppsMoreActions")}
166
168
  </TooltipContent>
167
169
  </Tooltip>
168
- <PopoverContent align="end" className="w-48 rounded-xl p-1.5">
170
+ <PopoverContent align="end" className="w-56 rounded-xl p-1.5">
171
+ <PageResourceActionItems page={pageResourceFromSystemObject("service-app", app.id, app.title)} onSelect={() => setIsMenuOpen(false)} />
172
+ <div className="my-1 h-px bg-border" />
169
173
  <ServiceAppMenuItem
170
174
  disabled={!canDisconnectRuntime}
171
175
  icon={Unplug}
@@ -1,5 +1,5 @@
1
1
  import { useMemo, useState } from 'react';
2
- import { KeyRound, MoreHorizontal, Plus, Search, Trash2 } from 'lucide-react';
2
+ import { KeyRound, MoreVertical, Plus, Search, Trash2 } from 'lucide-react';
3
3
  import {
4
4
  useCreateProvider,
5
5
  useDeleteProvider,
@@ -304,7 +304,7 @@ export function ProvidersConfigPage() {
304
304
  onClick={(event) => event.stopPropagation()}
305
305
  title={t('more')}
306
306
  >
307
- <MoreHorizontal className='h-4 w-4' />
307
+ <MoreVertical className='h-4 w-4' />
308
308
  </button>
309
309
  </PopoverTrigger>
310
310
  <PopoverContent className='w-40 p-1' align='end' onClick={(event) => event.stopPropagation()}>
@@ -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;
@@ -167,3 +167,6 @@ 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 }));
172
+ vi.mock("@/features/right-panel-resources/components/current-page-actions", () => ({ CurrentPageActions: () => null }));
@@ -1,3 +1,4 @@
1
+ import { CurrentPageActions } from '@/features/right-panel-resources';
1
2
  import { lazy, Suspense } from "react";
2
3
  import type { CSSProperties } from "react";
3
4
  import {
@@ -36,8 +37,6 @@ type DesktopAppShellProps = {
36
37
  export function DesktopAppShell({
37
38
  pathname,
38
39
  isMobileLayout = false,
39
- isDocBrowserOpen,
40
- docBrowserMode,
41
40
  docBrowserDockControls,
42
41
  docBrowserRenderers = {},
43
42
  docBrowserTabMenuGroups,
@@ -133,10 +132,11 @@ export function DesktopAppShell({
133
132
  {shouldUseWindowsChrome ? (
134
133
  <DesktopWindowChrome sidebarCollapsed={isSidebarCollapsed} />
135
134
  ) : null}
136
- <div className="relative z-[1] flex min-h-0 flex-1 overflow-hidden">
135
+ <div className="relative flex min-h-0 flex-1 overflow-hidden">
137
136
  {!isMainRoute && <Sidebar />}
138
137
  <div className="flex-1 flex min-w-0 overflow-hidden relative">
139
138
  <div className="flex-1 flex flex-col min-w-0 overflow-hidden">
139
+ {!isMainRoute ? <CurrentPageActions /> : null}
140
140
  {isMainRoute ? (
141
141
  <div className="flex-1 h-full overflow-hidden">{children}</div>
142
142
  ) : (
@@ -152,7 +152,7 @@ export function DesktopAppShell({
152
152
  </main>
153
153
  )}
154
154
  </div>
155
- {isDocBrowserOpen && docBrowserMode === "docked" ? (
155
+ {(
156
156
  <Suspense fallback={null}>
157
157
  <DocBrowser
158
158
  customTabRenderers={docBrowserRenderers}
@@ -160,20 +160,11 @@ export function DesktopAppShell({
160
160
  getTabMenuGroups={docBrowserTabMenuGroups}
161
161
  />
162
162
  </Suspense>
163
- ) : null}
163
+ )}
164
164
  {sideDock}
165
165
  </div>
166
166
  </div>
167
167
  {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
168
  </div>
178
169
  );
179
170
  }
@@ -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,