@nextclaw/ui 0.25.4 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (492) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/dist/.vite/manifest.json +1158 -1392
  3. package/dist/assets/{abnfDiagram-VRR7QNED-DX_u5BBX.js → abnfDiagram-VRR7QNED-Dcw10Yt1.js} +1 -1
  4. package/dist/assets/account-panel-ZM2qzKF4.js +1 -0
  5. package/dist/assets/{aiden0z-pptx-renderer.es-C-E9e5yB.js → aiden0z-pptx-renderer.es--oNqetPA.js} +1 -1
  6. package/dist/assets/api-Cjq-o1VN.js +20 -0
  7. package/dist/assets/app-presenter-provider-C02YPoMr.js +124 -0
  8. package/dist/assets/appearance-settings-page-B4zouKzg.js +1 -0
  9. package/dist/assets/{arc-Cxwa624o.js → arc-DBRedCax.js} +1 -1
  10. package/dist/assets/architecture-TIHT7OUA-CvnC-LeA.js +1 -0
  11. package/dist/assets/{architectureDiagram-ZJ3FMSHR-D8mCj0H1.js → architectureDiagram-ZJ3FMSHR-Dufhtuv-.js} +1 -1
  12. package/dist/assets/{blockDiagram-677ZJIJ3-CbGC1IHl.js → blockDiagram-677ZJIJ3-BUk0vtJ7.js} +1 -1
  13. package/dist/assets/{book-open-xqEj1OLE.js → book-open-AteA89HX.js} +1 -1
  14. package/dist/assets/{c4Diagram-LMCZKHZV-BQhGC1Vc.js → c4Diagram-LMCZKHZV-CxDcVE9p.js} +1 -1
  15. package/dist/assets/card-BLXvBstA.js +1 -0
  16. package/dist/assets/channel-CpMstUPF.js +1 -0
  17. package/dist/assets/channels-list-page-fj8kMo-T.js +8 -0
  18. package/dist/assets/chunk-2Q5K7J3B-Djp3VF0s.js +1 -0
  19. package/dist/assets/{chunk-32BRIVSS-B74ZZwYG.js → chunk-32BRIVSS-DSF3KElA.js} +1 -1
  20. package/dist/assets/{chunk-52WLFC77-BvmxW_f_.js → chunk-52WLFC77-Costxzr3.js} +1 -1
  21. package/dist/assets/{chunk-5FCAYU7R-DQvBRnwL.js → chunk-5FCAYU7R-rhqzGGZo.js} +1 -1
  22. package/dist/assets/{chunk-5HE753X5-CDIH0_y3.js → chunk-5HE753X5-BsEsmIao.js} +1 -1
  23. package/dist/assets/{chunk-5JV3BV7I-CcevlKd-.js → chunk-5JV3BV7I-Dqw_DCoN.js} +1 -1
  24. package/dist/assets/{chunk-5TONJI2A-_3dxVdnY.js → chunk-5TONJI2A-Cft82fp8.js} +1 -1
  25. package/dist/assets/{chunk-5VM5RSS4-pGO5vvo-.js → chunk-5VM5RSS4-DqNHn9Dl.js} +1 -1
  26. package/dist/assets/{chunk-7BUUIJ7U-DEKF5uAN.js → chunk-7BUUIJ7U-A5SBEMYY.js} +1 -1
  27. package/dist/assets/{chunk-BIQX33UG-CjBFgq2r.js → chunk-BIQX33UG-1Ng3mTrH.js} +1 -1
  28. package/dist/assets/{chunk-C7G6YPKG-e_K9OGTz.js → chunk-C7G6YPKG-DRJEy8ZI.js} +1 -1
  29. package/dist/assets/{chunk-CQNSW5MT-C2IiHyHz.js → chunk-CQNSW5MT-Bydv_J3J.js} +1 -1
  30. package/dist/assets/{chunk-CYSBUYHQ-DCC6KmGp.js → chunk-CYSBUYHQ-HkMIg12u.js} +1 -1
  31. package/dist/assets/{chunk-EMLP6XTP-BYGgekQ0.js → chunk-EMLP6XTP-C5ndDvm3.js} +1 -1
  32. package/dist/assets/{chunk-EX3LRPZG-FGcwuVsA.js → chunk-EX3LRPZG-DzeloZRo.js} +1 -1
  33. package/dist/assets/{chunk-FWX5IMBZ-CV3Ih_Os.js → chunk-FWX5IMBZ-n_2_CLTQ.js} +2 -2
  34. package/dist/assets/{chunk-HOUHSVGY-CXpq_hfV.js → chunk-HOUHSVGY-kx_slvu3.js} +1 -1
  35. package/dist/assets/{chunk-ICXQ74PX-CZIpjupq.js → chunk-ICXQ74PX-sQLMURqL.js} +1 -1
  36. package/dist/assets/{chunk-JG7HCLWE-CdgwBpW7.js → chunk-JG7HCLWE-CMUn5Elc.js} +1 -1
  37. package/dist/assets/{chunk-JWPE2WC7-BPjAZpOQ.js → chunk-JWPE2WC7-Cra3s-Uk.js} +1 -1
  38. package/dist/assets/{chunk-MOJQB5TN-DbJDm8to.js → chunk-MOJQB5TN-umcrg5Bi.js} +1 -1
  39. package/dist/assets/{chunk-MOZMSUNE-BUa1fqKn.js → chunk-MOZMSUNE-BnljD1ig.js} +1 -1
  40. package/dist/assets/{chunk-OGEWGWER-CtnzLgRu.js → chunk-OGEWGWER-BXx5pQjU.js} +1 -1
  41. package/dist/assets/{chunk-OSBZ3O6U-fUgdpTUM.js → chunk-OSBZ3O6U-D-1qfdWu.js} +1 -1
  42. package/dist/assets/{chunk-PUDLZKDR-CtDWZT9-.js → chunk-PUDLZKDR-DLzX78LC.js} +1 -1
  43. package/dist/assets/{chunk-Q4XR5HBZ-BxnK2qxr.js → chunk-Q4XR5HBZ-DTK-rtW6.js} +1 -1
  44. package/dist/assets/{chunk-QBLGF6JB-CH4UKoCF.js → chunk-QBLGF6JB-CsFeIGfr.js} +1 -1
  45. package/dist/assets/{chunk-R7FJI6CG-BxwFoF1v.js → chunk-R7FJI6CG-4xNYUeng.js} +1 -1
  46. package/dist/assets/{chunk-RYQCIY6F-DpHAmq7O.js → chunk-RYQCIY6F-DJiHiTE5.js} +1 -1
  47. package/dist/assets/{chunk-U6XO7XAA-BjH2VUHU.js → chunk-U6XO7XAA-BVYkauHz.js} +1 -1
  48. package/dist/assets/{chunk-V7JOEXUC-DKJZ3HGj.js → chunk-V7JOEXUC-BsazE8cS.js} +1 -1
  49. package/dist/assets/chunk-VAUOI2AC-BrbiIC1Q.js +1 -0
  50. package/dist/assets/{chunk-VR4S4FIN-Cf-o2GtI.js → chunk-VR4S4FIN-7RoZQffO.js} +1 -1
  51. package/dist/assets/{chunk-WYO6CB5R-zeNXGm20.js → chunk-WYO6CB5R-DEuS6N1R.js} +3 -3
  52. package/dist/assets/chunk-XXDRQBXY-Cx9N40wF.js +1 -0
  53. package/dist/assets/{chunk-YOTPTUD7-Ck87Kqxe.js → chunk-YOTPTUD7-9KBrosZL.js} +1 -1
  54. package/dist/assets/{chunk-ZGVPDNZ5-BbfK6Bfd.js → chunk-ZGVPDNZ5-IYgN9f5A.js} +1 -1
  55. package/dist/assets/{chunk-ZIRB5QZD-BDpzh4Yl.js → chunk-ZIRB5QZD-BUo0-zcp.js} +1 -1
  56. package/dist/assets/{circle-dashed-CU3yApvP.js → circle-dashed-LSYZTzM7.js} +1 -1
  57. package/dist/assets/classDiagram-OUVF2IWQ-DFN1v3PQ.js +1 -0
  58. package/dist/assets/classDiagram-v2-EOCWNBFH-DRvglADa.js +1 -0
  59. package/dist/assets/client-DudCRJw4.js +1 -0
  60. package/dist/assets/config-split-page-G7Kt2BnV.js +1 -0
  61. package/dist/assets/confirm-dialog-DShT64F6.js +1 -0
  62. package/dist/assets/context-menu-rd7b_kVD.js +1 -0
  63. package/dist/assets/{cose-bilkent-JH36ORCC-CQfMxKCT.js → cose-bilkent-JH36ORCC-DhqbC1fR.js} +1 -1
  64. package/dist/assets/createLucideIcon-D7hvIHV-.js +1 -0
  65. package/dist/assets/cynefin-VYW2F7L2-DXUGnpJH.js +1 -0
  66. package/dist/assets/{cynefinDiagram-TSTJHNR4-CxFTiC-p.js → cynefinDiagram-TSTJHNR4-C-TBRi5V.js} +1 -1
  67. package/dist/assets/{dagre-CaBNMcB1.js → dagre-CrgsRasE.js} +1 -1
  68. package/dist/assets/{dagre-VKFMJZFB-S_7Hc7bI.js → dagre-VKFMJZFB-BmafJymp.js} +1 -1
  69. package/dist/assets/desktop-capabilities-page-CzqzFZUY.js +1 -0
  70. package/dist/assets/desktop-update-config-CgeQ0Ffo.js +1 -0
  71. package/dist/assets/{diagram-FQU43EPY-C7zENvFb.js → diagram-FQU43EPY-BoOMwa6D.js} +1 -1
  72. package/dist/assets/{diagram-G47NLZAW-DqYTCqZA.js → diagram-G47NLZAW-Le7N6Uym.js} +1 -1
  73. package/dist/assets/{diagram-NH7WQ7WH-BfSJtXRc.js → diagram-NH7WQ7WH-Fbpj3-MO.js} +1 -1
  74. package/dist/assets/{diagram-OA4YK3LP-CFO-j67H.js → diagram-OA4YK3LP-D3QuGGuu.js} +1 -1
  75. package/dist/assets/{diagram-WEI45ONY-DBQDbTaJ.js → diagram-WEI45ONY-Cxu1uiN6.js} +1 -1
  76. package/dist/assets/dialog-C7glmAQJ.js +5 -0
  77. package/dist/assets/doc-browser-context-BlhBAOLH.js +1 -0
  78. package/dist/assets/doc-browser-dBiR9Qi0.js +1 -0
  79. package/dist/assets/{docx-preview-B4-aDfvO.js → docx-preview-CkU2psnd.js} +1 -1
  80. package/dist/assets/download-BYgECE0n.js +1 -0
  81. package/dist/assets/{ebnfDiagram-CCIWWBDH-CfDNIXFN.js → ebnfDiagram-CCIWWBDH-CCAjuQM6.js} +1 -1
  82. package/dist/assets/{erDiagram-Q63AITRT-D95rFXMM.js → erDiagram-Q63AITRT-BuzUAq-d.js} +1 -1
  83. package/dist/assets/es2015-CsjAAQ6X.js +41 -0
  84. package/dist/assets/eventmodeling-45OFAUF4-ZBfVS3ZC.js +1 -0
  85. package/dist/assets/extensions-qYL-NpL3.js +1 -0
  86. package/dist/assets/{eye-C84inPcV.js → eye-BBuTzJ53.js} +1 -1
  87. package/dist/assets/flowDiagram-23GEKE2U-CqdsKk6x.js +1 -0
  88. package/dist/assets/form-actions-CLGWO52v.js +1 -0
  89. package/dist/assets/{ganttDiagram-NO4QXBWP-Bawg0P0r.js → ganttDiagram-NO4QXBWP-cJmWVY8F.js} +1 -1
  90. package/dist/assets/gitGraph-TEB2WS4Q-fHYFd9Es.js +1 -0
  91. package/dist/assets/{gitGraphDiagram-IHSO6WYX-BbKh9nbL.js → gitGraphDiagram-IHSO6WYX-F58o-vtP.js} +1 -1
  92. package/dist/assets/{i18n-20rSH40D.js → i18n-qBGEbcW6.js} +2 -2
  93. package/dist/assets/info-DKCQHKI2-CSaOL_bb.js +1 -0
  94. package/dist/assets/{infoDiagram-FWYZ7A6U-DPffZXYh.js → infoDiagram-FWYZ7A6U-Gt59b83C.js} +1 -1
  95. package/dist/assets/{ishikawaDiagram-FXEZZL3T-CBMsLwZ2.js → ishikawaDiagram-FXEZZL3T-1u4IAj1I.js} +1 -1
  96. package/dist/assets/{journeyDiagram-5HDEW3XC-Mz5U4OzU.js → journeyDiagram-5HDEW3XC-CCQsfV-5.js} +1 -1
  97. package/dist/assets/{kanban-definition-HUTT4EX6-FXZq2k19.js → kanban-definition-HUTT4EX6-vlB6O_Zn.js} +1 -1
  98. package/dist/assets/katex-B4FQSo9k.js +1 -0
  99. package/dist/assets/keyboard-shortcuts-settings-page-B-wK_6zG.js +1 -0
  100. package/dist/assets/{line-BZwCgT9K.js → line-D_bHubTL.js} +1 -1
  101. package/dist/assets/{linear-CTe9mKUw.js → linear-ChlwuS5y.js} +1 -1
  102. package/dist/assets/loader-circle-BA7EMkih.js +1 -0
  103. package/dist/assets/login-page-Cd84lpVV.js +1 -0
  104. package/dist/assets/login-page-VdMyNkFf.js +1 -0
  105. package/dist/assets/main-CR0SrTBf.js +2 -0
  106. package/dist/assets/main-DXH6EdXI.css +1 -0
  107. package/dist/assets/main-i18n-catalog.config-Btp_OowF.js +1 -0
  108. package/dist/assets/{map-Ci48ZwAp.js → map-oGHTsIu8.js} +1 -1
  109. package/dist/assets/mcp-marketplace-page-jacRwiI-.js +1 -0
  110. package/dist/assets/{mermaid-parser.core-CzPD3U_z.js → mermaid-parser.core-CuRe1ZG4.js} +2 -2
  111. package/dist/assets/{mermaid.core-geIMNPbV.js → mermaid.core-u4YCFKRf.js} +3 -3
  112. package/dist/assets/{mindmap-definition-LN4V7U3C-xqlKxsr_.js → mindmap-definition-LN4V7U3C-DeJAQYTu.js} +1 -1
  113. package/dist/assets/model-config-page-D0DQlSDa.js +1 -0
  114. package/dist/assets/navigation-history-CzErJuPG.js +1 -0
  115. package/dist/assets/navigation-link-32iM1-e6.js +3 -0
  116. package/dist/assets/{ordinal-MxnX8yhv.js → ordinal-C6JFfkKN.js} +1 -1
  117. package/dist/assets/packet-7NZHBO7P-D-YFTczs.js +1 -0
  118. package/dist/assets/panel-app-CC0bVSu4.js +1 -0
  119. package/dist/assets/panel-app-i18n-catalog.config-LUSBp5Ce.js +1 -0
  120. package/dist/assets/panelStandalone-C9EKaApN.js +2 -0
  121. package/dist/assets/{pegDiagram-2B236MQR-D50MFTN1.js → pegDiagram-2B236MQR-nVMkxShH.js} +1 -1
  122. package/dist/assets/pie-RZYD4A2V-VEnYu9s5.js +1 -0
  123. package/dist/assets/{pieDiagram-ENE6RG2P-CpA13oiC.js → pieDiagram-ENE6RG2P-8aUH44QZ.js} +1 -1
  124. package/dist/assets/privacy-settings-page-Bxxx12OO.js +1 -0
  125. package/dist/assets/projects-D56yAPNT.js +1 -0
  126. package/dist/assets/provider-models-C3frdXeW.js +1 -0
  127. package/dist/assets/provider-scoped-model-input-CYetrPYZ.js +1 -0
  128. package/dist/assets/providers-config-page-DESB1h8g.js +1 -0
  129. package/dist/assets/{puzzle-D6gulz7u.js → puzzle-CWHfFyYN.js} +1 -1
  130. package/dist/assets/pwa-CiGUjpcd.js +1 -0
  131. package/dist/assets/{quadrantDiagram-ABIIQ3AL-CYCgaj4l.js → quadrantDiagram-ABIIQ3AL-EY8hpFv8.js} +1 -1
  132. package/dist/assets/radar-I7S5WNFK-BFNIekC1.js +1 -0
  133. package/dist/assets/railroad-3IZDKUUU-lVqJ3Hak.js +1 -0
  134. package/dist/assets/railroad-abnf-AHOZXSZD-DYaefdFC.js +1 -0
  135. package/dist/assets/railroad-ebnf-EBAXGLYW-CTAk6lVq.js +1 -0
  136. package/dist/assets/railroad-peg-LSFZ7HO6-Cob294tg.js +1 -0
  137. package/dist/assets/{railroadDiagram-RFXS5EU6-4LKDGlXN.js → railroadDiagram-RFXS5EU6-CNhcIeji.js} +1 -1
  138. package/dist/assets/{refresh-cw-h9Xq3LY3.js → refresh-cw-y3L6PyLt.js} +1 -1
  139. package/dist/assets/remote-DiGFV8nP.js +1 -0
  140. package/dist/assets/{requirementDiagram-TGXJPOKE-CxNOU0JH.js → requirementDiagram-TGXJPOKE-D8Dcs-Rt.js} +1 -1
  141. package/dist/assets/{rotate-cw-B6xm41Wn.js → rotate-cw-CNE9qSHi.js} +1 -1
  142. package/dist/assets/runtime-config-page-5o98T-TD.js +1 -0
  143. package/dist/assets/{sankeyDiagram-HTMAVEWB-DbCBDe2S.js → sankeyDiagram-HTMAVEWB-HTrb6aa-.js} +1 -1
  144. package/dist/assets/{save-fff_WpY2.js → save-B0p5a0ET.js} +1 -1
  145. package/dist/assets/search-config-page-CpGcnIzi.js +1 -0
  146. package/dist/assets/secrets-config-page-C4VTiW3r.js +3 -0
  147. package/dist/assets/security-config-C5-RQVpS.js +1 -0
  148. package/dist/assets/select-CctTN205.js +1 -0
  149. package/dist/assets/{sequenceDiagram-DBY2YBRQ-DA6W2BS_.js → sequenceDiagram-DBY2YBRQ-6f_4X16Y.js} +1 -1
  150. package/dist/assets/service-apps-panel-CKE5HKNY.js +1 -0
  151. package/dist/assets/{settings-2-CE3ELQyk.js → settings-2-EPflrNk6.js} +1 -1
  152. package/dist/assets/{sizeCapture-X5ZJPWSS-T_q_d_VW.js → sizeCapture-X5ZJPWSS-Ck9rsuwL.js} +1 -1
  153. package/dist/assets/{src-CYpUlx-4.js → src-C8AUg09O.js} +1 -1
  154. package/dist/assets/{stateDiagram-2N3HPSRC-mi8z2G0a.js → stateDiagram-2N3HPSRC-Cm33MLHu.js} +1 -1
  155. package/dist/assets/stateDiagram-v2-6OUMAXLB-BrNv-raG.js +1 -0
  156. package/dist/assets/status-dot-CensgJZC.js +1 -0
  157. package/dist/assets/{swimlanes-5IMT3BWC-DkBEhWE4.js → swimlanes-5IMT3BWC-B107vmvM.js} +2 -2
  158. package/dist/assets/swimlanesDiagram-G3AALYLV-ntcxaPXp.js +8 -0
  159. package/dist/assets/tag-chip-Bjzb4-qW.js +1 -0
  160. package/dist/assets/theme-provider-hlle7Skk.js +1 -0
  161. package/dist/assets/{timeline-definition-FHXFAJF6-BoFmqBw1.js → timeline-definition-FHXFAJF6-CJEoAj33.js} +1 -1
  162. package/dist/assets/trash-2-C5KH5Rw9.js +1 -0
  163. package/dist/assets/treeView-QDETBFTQ-DbFmr-gw.js +1 -0
  164. package/dist/assets/treemap-6X3UGDF4-C8aY96pi.js +1 -0
  165. package/dist/assets/use-config-CPl_F79t.js +1 -0
  166. package/dist/assets/use-desktop-capabilities-CEg9-DrQ.js +1 -0
  167. package/dist/assets/use-viewport-layout-CPZUmTPi.js +1 -0
  168. package/dist/assets/{vennDiagram-L72KCM5P-BlZ3Or5U.js → vennDiagram-L72KCM5P-DzsUHk5I.js} +1 -1
  169. package/dist/assets/wardley-OPB4EBWU-D8d6DbbJ.js +1 -0
  170. package/dist/assets/{wardleyDiagram-EHGQE667-yDfr33i3.js → wardleyDiagram-EHGQE667-1NfFs5ua.js} +1 -1
  171. package/dist/assets/x--xxUvHKW.js +1 -0
  172. package/dist/assets/{xychartDiagram-FW5EYKEG-mIXwIGAQ.js → xychartDiagram-FW5EYKEG-Ci8AI3Qo.js} +1 -1
  173. package/dist/index.html +38 -54
  174. package/dist/panel-standalone.html +11 -15
  175. package/package.json +8 -8
  176. package/src/app/components/layout/__tests__/app-layout.test.tsx +7 -0
  177. package/src/app/components/layout/__tests__/sidebar.layout.test.tsx +36 -16
  178. package/src/app/components/layout/app-layout.tsx +18 -46
  179. package/src/app/components/layout/sidebar-items.tsx +27 -18
  180. package/src/app/components/layout/sidebar-rail.styles.ts +11 -2
  181. package/src/app/components/layout/sidebar.tsx +3 -2
  182. package/src/app/configs/__tests__/app-navigation.config.test.ts +4 -0
  183. package/src/app/configs/app-navigation.config.ts +41 -86
  184. package/src/app/configs/page-resource-renderers.config.ts +13 -0
  185. package/src/app/index.tsx +4 -0
  186. package/src/app/presenters/app.presenter.ts +13 -2
  187. package/src/features/agents/components/__tests__/agents-page.test.tsx +4 -0
  188. package/src/features/agents/components/agent-details-dialog.tsx +5 -2
  189. package/src/features/agents/components/agents-page.tsx +9 -4
  190. package/src/features/apps/components/app-package-card.tsx +2 -2
  191. package/src/features/chat/components/conversation/chat-conversation-content.tsx +32 -19
  192. package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +1 -0
  193. package/src/features/chat/components/conversation/chat-conversation-header.tsx +1 -1
  194. package/src/features/chat/components/conversation/chat-conversation-panel.tsx +2 -2
  195. package/src/features/chat/components/conversation/chat-conversation-workspace-section.tsx +1 -0
  196. package/src/features/chat/components/layout/__tests__/chat-page-shell.test.tsx +5 -6
  197. package/src/features/chat/components/layout/__tests__/chat-sidebar-toolbar.test.tsx +14 -12
  198. package/src/features/chat/components/layout/chat-page-shell.tsx +31 -64
  199. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +8 -5
  200. package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +64 -256
  201. package/src/features/chat/components/layout/chat-sidebar.tsx +8 -30
  202. package/src/features/chat/components/providers/chat-runtime.provider.tsx +62 -0
  203. package/src/features/chat/features/conversation/components/__tests__/floating-session-conversation.test.tsx +70 -0
  204. package/src/features/chat/features/conversation/components/chat-voice-input-panel.tsx +3 -2
  205. package/src/features/chat/features/conversation/components/floating-session-conversation.tsx +27 -0
  206. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +1 -0
  207. package/src/features/chat/features/conversation/components/session-conversation-panel-tab.tsx +25 -0
  208. package/src/features/chat/features/conversation/hooks/__tests__/use-chat-voice-input.test.tsx +4 -0
  209. package/src/features/chat/features/conversation/hooks/use-chat-composer-reference-intent.ts +2 -1
  210. package/src/features/chat/features/message/components/__tests__/chat-inline-panel-app-card.test.tsx +2 -1
  211. package/src/features/chat/features/message/components/__tests__/chat-message-assistant-header.container.test.tsx +3 -0
  212. package/src/features/chat/features/message/components/__tests__/chat-message-list-skill-preview.container.test.tsx +3 -0
  213. package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +35 -47
  214. package/src/features/chat/features/message/components/chat-message-list.container.tsx +6 -10
  215. package/src/features/chat/features/message/hooks/use-chat-inline-token-actions.ts +7 -3
  216. package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +52 -6
  217. package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +22 -37
  218. package/src/features/chat/features/session/components/__tests__/chat-sidebar-project-groups.test.tsx +1 -1
  219. package/src/features/chat/features/session/components/__tests__/chat-sidebar-session-item.test.tsx +21 -0
  220. package/src/features/chat/features/session/components/chat-mobile-session-row.tsx +61 -0
  221. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +4 -37
  222. package/src/features/chat/features/session/components/chat-sidebar-session-entry.tsx +2 -0
  223. package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +18 -7
  224. package/src/features/chat/features/session/components/chat-sidebar-session-list.tsx +5 -3
  225. package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +10 -2
  226. package/src/features/chat/features/session/components/session-header/chat-session-header-actions.tsx +20 -17
  227. package/src/features/chat/features/session/components/session-header/chat-session-header-menu-item.tsx +4 -4
  228. package/src/features/chat/features/session/components/session-header/chat-session-more-actions-menu.tsx +18 -5
  229. package/src/features/chat/features/session/utils/chat-session-route.utils.ts +12 -0
  230. package/src/features/chat/features/workspace/components/__tests__/chat-session-child-sessions.test.tsx +28 -0
  231. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.test.tsx +9 -0
  232. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +6 -2
  233. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel.test.tsx +49 -12
  234. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +13 -6
  235. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +6 -0
  236. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +21 -36
  237. package/src/features/chat/features/workspace/components/chat-session-workspace-panel.tsx +40 -31
  238. package/src/features/chat/features/workspace/components/child-sessions/chat-session-child-sessions.tsx +6 -1
  239. package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +2 -2
  240. package/src/features/chat/features/workspace/components/project-files/workspace-project-files-toolbar.tsx +2 -2
  241. package/src/features/chat/features/workspace/utils/__tests__/chat-workspace-panel-view-model.utils.test.ts +27 -0
  242. package/src/features/chat/features/workspace/utils/__tests__/workspace-file-panel-route.utils.test.ts +94 -0
  243. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab-persistence.utils.ts +2 -0
  244. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab.utils.ts +15 -0
  245. package/src/features/chat/features/workspace/utils/chat-workspace-panel-view-model.utils.ts +11 -0
  246. package/src/features/chat/features/workspace/utils/workspace-file-panel-route.utils.ts +147 -0
  247. package/src/features/chat/index.ts +20 -4
  248. package/src/features/chat/managers/__tests__/chat-completion-notification.manager.test.ts +8 -0
  249. package/src/features/chat/managers/__tests__/chat-thread-workspace.manager.test.ts +7 -2
  250. package/src/features/chat/managers/__tests__/session-surface.manager.test.ts +45 -0
  251. package/src/features/chat/managers/chat-completion-notification.manager.ts +5 -0
  252. package/src/features/chat/managers/chat-composer-intent.manager.ts +16 -0
  253. package/src/features/chat/managers/chat-thread.manager.ts +18 -27
  254. package/src/features/chat/managers/chat-voice-input.manager.ts +5 -3
  255. package/src/features/chat/managers/session-surface.manager.ts +46 -0
  256. package/src/features/chat/pages/__tests__/ncp-chat-page.test.tsx +23 -5
  257. package/src/features/chat/pages/ncp-chat-page.tsx +6 -86
  258. package/src/features/chat/presenters/chat.presenter.ts +2 -1
  259. package/src/features/chat/stores/__tests__/chat-thread.store.test.ts +2 -2
  260. package/src/features/chat/stores/chat-thread.store.ts +7 -1
  261. package/src/features/chat/stores/floating-session.store.ts +11 -0
  262. package/src/features/chat/utils/chat-voice-permissions.utils.test.ts +12 -1
  263. package/src/features/chat/utils/chat-voice-permissions.utils.ts +6 -1
  264. package/src/features/cron/components/__tests__/cron-config.test.tsx +4 -0
  265. package/src/features/cron/components/cron-job-detail-dialog.tsx +3 -1
  266. package/src/features/cron/components/cron-job-row.tsx +14 -8
  267. package/src/features/inbox/components/inbox-reader-dialog.test.tsx +3 -0
  268. package/src/features/inbox/components/inbox-reader-dialog.tsx +6 -1
  269. package/src/features/inbox/pages/inbox-page.test.ts +3 -0
  270. package/src/features/inbox/pages/inbox-page.tsx +12 -4
  271. package/src/features/marketplace/components/__tests__/marketplace-page-detail.test.tsx +5 -1
  272. package/src/features/marketplace/components/__tests__/marketplace-page.test.tsx +3 -0
  273. package/src/features/marketplace/components/curated-shelves/__tests__/marketplace-curated-scene-route.test.tsx +2 -0
  274. package/src/features/marketplace/components/marketplace-list-card.tsx +4 -0
  275. package/src/features/marketplace/components/mcp/__tests__/mcp-marketplace-page.test.tsx +2 -0
  276. package/src/features/marketplace/components/mcp/mcp-marketplace-card.tsx +3 -0
  277. package/src/features/notifications/components/__tests__/app-notification-toast.test.tsx +19 -0
  278. package/src/features/notifications/components/app-notification-toast.tsx +33 -15
  279. package/src/features/notifications/managers/app-notification.manager.ts +2 -0
  280. package/src/features/panel-apps/components/__tests__/panel-app-list-item.test.tsx +13 -4
  281. package/src/features/panel-apps/components/__tests__/panel-app-toolbar.test.tsx +13 -5
  282. package/src/features/panel-apps/components/panel-app-list-item.tsx +1 -1
  283. package/src/features/panel-apps/components/panel-app-main-sidebar-menu-item.tsx +5 -38
  284. package/src/features/panel-apps/components/panel-app-toolbar.tsx +7 -7
  285. package/src/features/panel-apps/index.ts +1 -1
  286. package/src/features/projects/components/project-materials.test.tsx +2 -0
  287. package/src/features/projects/components/project-skills.tsx +7 -3
  288. package/src/features/projects/components/work/project-work-item-drawer.test.tsx +2 -0
  289. package/src/features/projects/components/work/project-work-item-drawer.tsx +3 -1
  290. package/src/features/right-panel-resources/components/__tests__/page-resource-icon.test.tsx +67 -0
  291. package/src/features/right-panel-resources/components/__tests__/page-resource-sidebar-nav.test.tsx +183 -0
  292. package/src/features/right-panel-resources/components/__tests__/system-object-resource.test.tsx +42 -0
  293. package/src/features/right-panel-resources/components/page-resource-actions-menu.tsx +53 -0
  294. package/src/features/right-panel-resources/components/page-resource-icon.tsx +245 -0
  295. package/src/features/right-panel-resources/components/page-resource-sidebar-nav.tsx +119 -0
  296. package/src/features/right-panel-resources/components/system-object-resource.tsx +100 -0
  297. package/src/features/right-panel-resources/components/workspace-file-resource.tsx +56 -0
  298. package/src/features/right-panel-resources/configs/right-panel-resource-routes.config.ts +46 -3
  299. package/src/features/right-panel-resources/hooks/use-page-resource-actions.ts +190 -0
  300. package/src/features/right-panel-resources/index.ts +21 -8
  301. package/src/features/right-panel-resources/managers/__tests__/page-resource.manager.test.ts +149 -0
  302. package/src/features/right-panel-resources/managers/page-resource.manager.ts +342 -0
  303. package/src/features/right-panel-resources/pages/resource-page.tsx +114 -0
  304. package/src/features/right-panel-resources/stores/page-navigation.store.ts +55 -0
  305. package/src/features/right-panel-resources/types/page-resource.types.ts +11 -0
  306. package/src/features/right-panel-resources/utils/__tests__/right-panel-resource-route-resolver.utils.test.ts +10 -0
  307. package/src/features/right-panel-resources/utils/page-resource-identity.utils.ts +61 -0
  308. package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +2 -6
  309. package/src/features/service-apps/components/__tests__/service-apps-panel.test.tsx +2 -0
  310. package/src/features/service-apps/components/service-app-list-item.tsx +6 -1
  311. package/src/features/settings/pages/providers-config-page.tsx +2 -2
  312. package/src/features/side-dock/components/__tests__/side-dock.test.tsx +9 -8
  313. package/src/features/side-dock/components/side-dock.tsx +14 -47
  314. package/src/features/side-dock/managers/side-dock.manager.ts +2 -0
  315. package/src/features/system-status/components/__tests__/desktop-update-config.test.tsx +40 -0
  316. package/src/features/system-status/components/desktop-update-config.tsx +19 -1
  317. package/src/platforms/desktop/components/__tests__/desktop-app-shell.test.tsx +2 -0
  318. package/src/platforms/desktop/components/desktop-app-shell.tsx +3 -14
  319. package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +1 -0
  320. package/src/platforms/mobile/components/__tests__/mobile-bottom-nav.test.tsx +3 -2
  321. package/src/platforms/mobile/components/mobile-app-shell.tsx +3 -4
  322. package/src/platforms/mobile/components/mobile-bottom-nav.tsx +7 -7
  323. package/src/platforms/mobile/components/mobile-settings-shell.tsx +8 -3
  324. package/src/platforms/mobile/components/mobile-topbar.tsx +4 -4
  325. package/src/shared/components/doc-browser/__tests__/doc-browser-context.test.tsx +4 -3
  326. package/src/shared/components/doc-browser/__tests__/doc-browser-tab-strip.test.tsx +0 -5
  327. package/src/shared/components/doc-browser/__tests__/doc-browser.test.tsx +57 -73
  328. package/src/shared/components/doc-browser/__tests__/resource-link-interceptor.test.tsx +104 -0
  329. package/src/shared/components/doc-browser/doc-browser-context.tsx +5 -1
  330. package/src/shared/components/doc-browser/doc-browser-panel-parts.tsx +1 -1
  331. package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +6 -118
  332. package/src/shared/components/doc-browser/doc-browser.tsx +30 -194
  333. package/src/shared/components/doc-browser/hooks/use-doc-browser-scroll-restoration.ts +1 -1
  334. package/src/shared/components/doc-browser/managers/doc-browser.manager.ts +11 -1
  335. package/src/shared/components/doc-browser/stores/doc-browser.store.ts +3 -7
  336. package/src/shared/components/doc-browser/types/doc-browser.types.ts +8 -1
  337. package/src/shared/components/doc-browser/use-doc-link-interceptor.ts +30 -32
  338. package/src/shared/components/doc-browser/utils/doc-browser-state.utils.ts +6 -6
  339. package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +105 -1
  340. package/src/shared/components/ui/context-menu/context-menu-items.tsx +173 -0
  341. package/src/shared/components/ui/context-menu/context-menu.tsx +99 -112
  342. package/src/shared/components/ui/dialog.tsx +4 -0
  343. package/src/shared/components/ui/overlays/sheet.tsx +4 -0
  344. package/src/shared/components/ui/popover.tsx +10 -4
  345. package/src/shared/components/workbench/__tests__/workbench-surface.manager.test.ts +70 -0
  346. package/src/shared/components/workbench/__tests__/workbench-surface.test.tsx +111 -0
  347. package/src/shared/components/workbench/managers/workbench-surface.manager.ts +120 -0
  348. package/src/shared/components/workbench/stores/workbench-surface.store.ts +83 -0
  349. package/src/shared/components/workbench/types/workbench-surface.types.ts +32 -0
  350. package/src/shared/components/workbench/utils/workbench-surface-geometry.utils.ts +46 -0
  351. package/src/shared/components/workbench/workbench-surface-toolbar.tsx +102 -0
  352. package/src/shared/components/workbench/workbench-surface.tsx +401 -0
  353. package/src/shared/hooks/use-panel-app-scroll-restoration.test.tsx +19 -0
  354. package/src/shared/hooks/use-panel-app-scroll-restoration.ts +8 -6
  355. package/src/shared/hooks/use-scroll-restoration.test.tsx +39 -2
  356. package/src/shared/hooks/use-scroll-restoration.ts +33 -33
  357. package/src/shared/lib/api/marketplace.types.ts +1 -0
  358. package/src/shared/lib/i18n/locales/en-US/chat.json +46 -1
  359. package/src/shared/lib/i18n/locales/en-US/core.json +3 -1
  360. package/src/shared/lib/i18n/locales/en-US/desktop-update.json +1 -0
  361. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +1 -1
  362. package/src/shared/lib/i18n/locales/zh-CN/chat.json +46 -1
  363. package/src/shared/lib/i18n/locales/zh-CN/core.json +11 -9
  364. package/src/shared/lib/i18n/locales/zh-CN/desktop-update.json +1 -0
  365. package/src/shared/lib/navigation-history/index.ts +1 -0
  366. package/src/shared/lib/navigation-history/navigation-history.utils.ts +1 -1
  367. package/src/shared/lib/navigation-history/scroll-restoration.manager.test.ts +11 -0
  368. package/src/shared/lib/navigation-history/scroll-restoration.manager.ts +36 -7
  369. package/src/shared/lib/navigation-history/view-memory-storage.store.test.ts +37 -0
  370. package/src/shared/lib/navigation-history/view-memory-storage.store.ts +21 -0
  371. package/src/shared/lib/transport/__tests__/browser-realtime-recovery.service.test.ts +27 -2
  372. package/src/shared/lib/transport/__tests__/local-transport.service.test.ts +20 -0
  373. package/src/shared/lib/transport/__tests__/remote.transport.test.ts +26 -0
  374. package/src/shared/lib/transport/browser-realtime-recovery.service.ts +32 -5
  375. package/src/shared/lib/transport/local-transport.service.ts +1 -6
  376. package/src/shared/lib/transport/remote-transport.service.ts +22 -1
  377. package/src/shared/lib/ui-document-title/index.ts +1 -0
  378. package/dist/assets/account-panel-BW4GbzQd.js +0 -1
  379. package/dist/assets/api-DqzQ-_3w.js +0 -13
  380. package/dist/assets/app-data-C54N2p8b.js +0 -1
  381. package/dist/assets/app-presenter-provider-CBZ_-ewx.js +0 -115
  382. package/dist/assets/appearance-settings-page-C-uZ2Wkf.js +0 -1
  383. package/dist/assets/architecture-TIHT7OUA-DEt0Abz9.js +0 -1
  384. package/dist/assets/boxes-D6uPnkGo.js +0 -1
  385. package/dist/assets/card-BhfAZv5L.js +0 -1
  386. package/dist/assets/channel-CxQkbwRD.js +0 -1
  387. package/dist/assets/channels-list-page-Bv7CVSqV.js +0 -8
  388. package/dist/assets/chevron-down-BL-yMYcX.js +0 -1
  389. package/dist/assets/chunk-2Q5K7J3B-ClVhziok.js +0 -1
  390. package/dist/assets/chunk-VAUOI2AC-DZQxkIsv.js +0 -1
  391. package/dist/assets/chunk-XXDRQBXY-BkExtw5C.js +0 -1
  392. package/dist/assets/circle-alert-lSa3LRvS.js +0 -1
  393. package/dist/assets/classDiagram-OUVF2IWQ-Bd6apBb-.js +0 -1
  394. package/dist/assets/classDiagram-v2-EOCWNBFH-CYxUZGCI.js +0 -1
  395. package/dist/assets/client-BtGBwLTs.js +0 -1
  396. package/dist/assets/config-split-page-DqAXKLmG.js +0 -1
  397. package/dist/assets/confirm-dialog-BTKCWMn6.js +0 -1
  398. package/dist/assets/createLucideIcon-BNKf0_kc.js +0 -1
  399. package/dist/assets/cynefin-VYW2F7L2-CV0bFLH9.js +0 -1
  400. package/dist/assets/desktop-capabilities-page-zLzCSB7A.js +0 -1
  401. package/dist/assets/desktop-update-config-PmofcFf6.js +0 -1
  402. package/dist/assets/dialog-Xe73hpQz.js +0 -5
  403. package/dist/assets/dist-BiIcnf9j.js +0 -1
  404. package/dist/assets/dist-C5I0v8Qn.js +0 -1
  405. package/dist/assets/dist-czPa8xFO.js +0 -1
  406. package/dist/assets/doc-browser-BJrre2S_.js +0 -1
  407. package/dist/assets/doc-browser-BPqA-zQx.js +0 -1
  408. package/dist/assets/doc-browser-context-TILuCY5c.js +0 -1
  409. package/dist/assets/ellipsis-C5YXdOUx.js +0 -1
  410. package/dist/assets/es2015-cuwbYI-l.js +0 -41
  411. package/dist/assets/eventmodeling-45OFAUF4-BzkLWWdP.js +0 -1
  412. package/dist/assets/extensions-CVUFK6Jj.js +0 -1
  413. package/dist/assets/flowDiagram-23GEKE2U-ukkCsB0j.js +0 -1
  414. package/dist/assets/form-actions-BRESe-m_.js +0 -1
  415. package/dist/assets/gitGraph-TEB2WS4Q-BYFhT0Q5.js +0 -1
  416. package/dist/assets/i18n-provider-BPRq6S7O.js +0 -1
  417. package/dist/assets/info-DKCQHKI2-CTmlJdcH.js +0 -1
  418. package/dist/assets/katex-DbZC06Q5.js +0 -1
  419. package/dist/assets/keyboard-shortcuts-settings-page-CScSXYS4.js +0 -1
  420. package/dist/assets/loader-circle-K1BDdHR5.js +0 -1
  421. package/dist/assets/login-page-Dlyvp-81.js +0 -1
  422. package/dist/assets/login-page-f8qQ4xKY.js +0 -1
  423. package/dist/assets/logo-badge-C-5-zim6.js +0 -1
  424. package/dist/assets/main-D2dWy8fM.css +0 -1
  425. package/dist/assets/main-DMNmwcJE.js +0 -2
  426. package/dist/assets/main-i18n-catalog.config-DZ-5ollN.js +0 -1
  427. package/dist/assets/mcp-marketplace-page-FfIfEo6w.js +0 -10
  428. package/dist/assets/mcp-marketplace-page-sH7VptN_.js +0 -1
  429. package/dist/assets/model-config-page-Bcm6-pCX.js +0 -1
  430. package/dist/assets/navigation-link-BAQjgx2F.js +0 -3
  431. package/dist/assets/packet-7NZHBO7P-BbrI0ZlN.js +0 -1
  432. package/dist/assets/panel-app-B39rJPj8.js +0 -1
  433. package/dist/assets/panel-app-i18n-catalog.config-p3qAY_Eq.js +0 -1
  434. package/dist/assets/panelStandalone-By-6dDXS.js +0 -2
  435. package/dist/assets/pie-RZYD4A2V-B7zE1ZIr.js +0 -1
  436. package/dist/assets/plus-LA8-jpxP.js +0 -1
  437. package/dist/assets/popover-NkrFlWHp.js +0 -1
  438. package/dist/assets/privacy-settings-page-B1sHLAc1.js +0 -1
  439. package/dist/assets/projects-Voql-cvx.js +0 -1
  440. package/dist/assets/provider-models-hrHMcHqg.js +0 -1
  441. package/dist/assets/provider-scoped-model-input-BQsugx1v.js +0 -1
  442. package/dist/assets/providers-config-page-BDEdHJbw.js +0 -1
  443. package/dist/assets/pwa-CzqfYjFx.js +0 -1
  444. package/dist/assets/radar-I7S5WNFK-1X_q11Ed.js +0 -1
  445. package/dist/assets/railroad-3IZDKUUU-CIXnuFyE.js +0 -1
  446. package/dist/assets/railroad-abnf-AHOZXSZD-D6ImKl2r.js +0 -1
  447. package/dist/assets/railroad-ebnf-EBAXGLYW-2j9d3twU.js +0 -1
  448. package/dist/assets/railroad-peg-LSFZ7HO6-DMVaJGbm.js +0 -1
  449. package/dist/assets/remote-BekqL5nA.js +0 -1
  450. package/dist/assets/runtime-config-page-BH9uF4u_.js +0 -1
  451. package/dist/assets/search-CUe41wjm.js +0 -1
  452. package/dist/assets/search-config-page-DWKlMHgH.js +0 -1
  453. package/dist/assets/secrets-config-page-DiQL088Y.js +0 -3
  454. package/dist/assets/security-config-DmTDKKY4.js +0 -1
  455. package/dist/assets/select-CG5YWnwe.js +0 -1
  456. package/dist/assets/service-apps-panel-CEnyYsQp.js +0 -1
  457. package/dist/assets/skeleton-Drvn83YW.js +0 -1
  458. package/dist/assets/stateDiagram-v2-6OUMAXLB-OlIMT57r.js +0 -1
  459. package/dist/assets/swimlanesDiagram-G3AALYLV-sLThrh07.js +0 -8
  460. package/dist/assets/tabs-BuE0qKMh.js +0 -1
  461. package/dist/assets/tag-chip-B1AYPOKL.js +0 -1
  462. package/dist/assets/theme-provider-DzvAi3pe.js +0 -1
  463. package/dist/assets/tooltip-DYcuWhuP.js +0 -1
  464. package/dist/assets/trash-2-BPPYt2NV.js +0 -1
  465. package/dist/assets/treeView-QDETBFTQ-CCFyazDE.js +0 -1
  466. package/dist/assets/treemap-6X3UGDF4-D6wvq1Hz.js +0 -1
  467. package/dist/assets/use-config-BEdbtpD4.js +0 -1
  468. package/dist/assets/use-desktop-capabilities-BkuRd2cY.js +0 -1
  469. package/dist/assets/use-panel-app-scroll-restoration-ZnicIfo3.js +0 -1
  470. package/dist/assets/use-viewport-layout-BS18drMT.js +0 -1
  471. package/dist/assets/utils-CBZPzC_b.js +0 -8
  472. package/dist/assets/wardley-OPB4EBWU-BRzaRyFf.js +0 -1
  473. package/dist/assets/x-DdXOqLnX.js +0 -1
  474. package/src/features/panel-apps/components/__tests__/panel-app-main-sidebar-nav.test.tsx +0 -219
  475. package/src/features/panel-apps/components/panel-app-main-sidebar-nav.tsx +0 -258
  476. package/src/shared/components/doc-browser/utils/doc-browser-floating-panel.utils.ts +0 -83
  477. /package/dist/assets/{array-D0DyKZdT.js → array-BV9OtnO8.js} +0 -0
  478. /package/dist/assets/{chunk-KEIR6QF5-CuZFOa6q.js → chunk-KEIR6QF5-Cx-8EJ4_.js} +0 -0
  479. /package/dist/assets/{chunk-Y2CYZVJY-Frut-1TF.js → chunk-Y2CYZVJY-Dy1ufvjf.js} +0 -0
  480. /package/dist/assets/{config-hints-B_C9DAp5.js → config-hints-DbmiyTKg.js} +0 -0
  481. /package/dist/assets/{cytoscape.esm-BibuhnZD.js → cytoscape.esm-CSCjuT4Z.js} +0 -0
  482. /package/dist/assets/{defaultLocale-q7sRUXPc.js → defaultLocale-DWTiNsbT.js} +0 -0
  483. /package/dist/assets/{dist-DhMddrrH.js → dist-BVCSkfWY.js} +0 -0
  484. /package/dist/assets/{graphlib-BM63WsW3.js → graphlib-B1yb1Wl8.js} +0 -0
  485. /package/dist/assets/{host-capabilities-B107nwS3.js → host-capabilities-DuIFVsvM.js} +0 -0
  486. /package/dist/assets/{init-CRMkf9sL.js → init-BF6GH5oe.js} +0 -0
  487. /package/dist/assets/{jszip.min-6thm2J_a.js → jszip.min-D12teKzP.js} +0 -0
  488. /package/dist/assets/{katex-B26hhTOT.js → katex-CsAM73R9.js} +0 -0
  489. /package/dist/assets/{middleware-0o3JF3tS.js → middleware-B--6mAUM.js} +0 -0
  490. /package/dist/assets/{path-BFMmafCM.js → path-C56XkznJ.js} +0 -0
  491. /package/dist/assets/{rough.esm-5Tjchx1D.js → rough.esm-CGfeEbtE.js} +0 -0
  492. /package/dist/assets/{xlsx-BC8ibjXK.js → xlsx-sds5nUpL.js} +0 -0
@@ -1,100 +1,20 @@
1
- import {
2
- useEffect,
3
- useMemo,
4
- } from "react";
5
- import { useLocation, useNavigate, useParams } from "react-router-dom";
1
+ import { useParams } from "react-router-dom";
6
2
  import {
7
3
  ChatPageLayout,
8
4
  type ChatPageProps,
9
5
  useChatSessionSync,
10
6
  } from "@/features/chat/components/layout/chat-page-shell";
11
7
  import { parseSessionKeyFromRoute } from "@/features/chat/features/session/utils/chat-session-route.utils";
12
- import { ChatPresenter } from "@/features/chat/presenters/chat.presenter";
13
- import { useChatQueryStoreSync } from "@/features/chat/features/ncp/hooks/use-ncp-chat-query-store-sync";
14
- import {
15
- ChatPresenterProvider,
16
- usePresenter,
17
- } from "@/features/chat/components/providers/chat-presenter.provider";
18
- import { useConfirmDialog } from "@/shared/hooks/use-confirm-dialog";
19
- import { useAppPresenter } from "@/app/components/app-presenter-provider";
8
+ import { usePresenter } from "@/features/chat/components/providers/chat-presenter.provider";
20
9
  import { useUiShowContentEvent } from "@/features/chat/features/ncp/hooks/use-ui-show-content-event";
21
- import { useChatThreadStore } from "@/features/chat/stores/chat-thread.store";
22
-
23
- function useNcpChatRouteSelection() {
24
- const { sessionId: routeSessionIdParam } = useParams<{ sessionId?: string }>();
25
- const routeSessionKey = useMemo(
26
- () => parseSessionKeyFromRoute(routeSessionIdParam),
27
- [routeSessionIdParam],
28
- );
29
- return {
30
- routeSessionKey,
31
- sessionKey: routeSessionKey ?? undefined,
32
- };
33
- }
34
-
35
- function useNcpChatUiBindings() {
36
- const presenter = usePresenter();
37
- const { confirm, ConfirmDialog } = useConfirmDialog();
38
- const location = useLocation();
39
- const navigate = useNavigate();
40
- useEffect(() => {
41
- presenter.chatUiManager.syncState({
42
- pathname: location.pathname,
43
- });
44
- presenter.chatUiManager.bindActions({
45
- navigate,
46
- confirm,
47
- });
48
- }, [confirm, location.pathname, navigate, presenter]);
49
- return <ConfirmDialog />;
50
- }
51
10
 
52
11
  export function NcpChatPage({ view }: ChatPageProps) {
53
- const appPresenter = useAppPresenter();
54
- const presenter = useMemo(() => new ChatPresenter(appPresenter), [appPresenter]);
55
- return (
56
- <ChatPresenterProvider presenter={presenter}>
57
- <NcpChatPageContent view={view} />
58
- </ChatPresenterProvider>
59
- );
60
- }
61
-
62
- function NcpChatPageContent({ view }: ChatPageProps) {
63
- const appPresenter = useAppPresenter();
64
12
  const presenter = usePresenter();
65
- const confirmDialog = useNcpChatUiBindings();
66
- const routeSelection = useNcpChatRouteSelection();
67
- const { routeSessionKey, sessionKey } = routeSelection;
68
- const visibleWorkspaceSessionKey = useChatThreadStore((state) => {
69
- const { snapshot } = state;
70
- if (
71
- snapshot.workspacePanelParentKey !== (sessionKey ?? null) ||
72
- snapshot.activeWorkspacePanelKind !== "child-session"
73
- ) {
74
- return null;
75
- }
76
- return snapshot.activeChildSessionKey?.trim() || null;
77
- });
78
- useEffect(() => {
79
- appPresenter.chatCompletionNotificationManager.syncVisibleSessions(
80
- [sessionKey, visibleWorkspaceSessionKey],
81
- );
82
- return () => {
83
- appPresenter.chatCompletionNotificationManager.syncVisibleSessions([]);
84
- };
85
- }, [
86
- appPresenter.chatCompletionNotificationManager,
87
- sessionKey,
88
- visibleWorkspaceSessionKey,
89
- ]);
90
- useChatQueryStoreSync({
91
- sessionKey: sessionKey ?? null,
92
- });
13
+ const { sessionId } = useParams<{ sessionId?: string }>();
93
14
  useChatSessionSync({
94
- routeSessionKey,
95
- syncRouteSessionSelection:
96
- presenter.chatSessionListManager.syncRouteSessionSelection,
15
+ routeSessionKey: parseSessionKeyFromRoute(sessionId),
16
+ syncRouteSessionSelection: presenter.chatSessionListManager.syncRouteSessionSelection,
97
17
  });
98
18
  useUiShowContentEvent();
99
- return <ChatPageLayout view={view} confirmDialog={confirmDialog} />;
19
+ return <ChatPageLayout view={view} />;
100
20
  }
@@ -22,7 +22,8 @@ export class ChatPresenter {
22
22
  this.chatThreadManager = new ChatThreadManager(
23
23
  this.chatUiManager,
24
24
  this.chatSessionListManager,
25
- appPresenter.notifyRightPanelOpened,
25
+ appPresenter.notifyWorkspacePanelOpened,
26
26
  );
27
+ appPresenter.pageResourceManager.bindWorkspace(this.chatThreadManager);
27
28
  }
28
29
  }
@@ -99,7 +99,7 @@ describe('chat thread workspace panel persistence', () => {
99
99
  expect(persisted.state.snapshot.workspaceFileTabs[0].params).toEqual({
100
100
  chart: { series: [3, 5, 8] },
101
101
  });
102
- expect(persisted.state.snapshot.workspaceFileTabs[0].fullLines).toBeUndefined();
102
+ expect(persisted.state.snapshot.workspaceFileTabs[0].fullLines).toEqual([]);
103
103
  });
104
104
 
105
105
  it('does not persist an unmaterialized side chat draft', () => {
@@ -228,7 +228,7 @@ describe('chat thread workspace panel persistence', () => {
228
228
  ],
229
229
  },
230
230
  },
231
- version: 2,
231
+ version: 3,
232
232
  }),
233
233
  );
234
234
 
@@ -1,3 +1,4 @@
1
+ import { ViewMemoryStorage } from '@/shared/lib/navigation-history';
1
2
  import { create } from 'zustand';
2
3
  import { createJSONStorage, persist } from 'zustand/middleware';
3
4
  import type { NcpMessage } from '@nextclaw/ncp';
@@ -71,6 +72,7 @@ export type ChatWorkspaceNavigationEntry =
71
72
  | { kind: 'continuous-attention' };
72
73
 
73
74
  export type ChatThreadSnapshot = {
75
+ workspacePanelHidden?: boolean;
74
76
  sessionTypeLabel?: string | null;
75
77
  sessionTypeIcon?: SessionTypeIconView | null;
76
78
  sessionKey: string | null;
@@ -115,6 +117,7 @@ type ChatThreadStore = {
115
117
  type PersistedChatThreadStore = {
116
118
  snapshot?: {
117
119
  workspacePanelParentKey?: unknown;
120
+ workspacePanelHidden?: unknown;
118
121
  activeWorkspacePanelKind?: unknown;
119
122
  activeChildSessionKey?: unknown;
120
123
  workspaceFileTabs?: unknown;
@@ -130,6 +133,7 @@ type PersistedChatThreadStore = {
130
133
 
131
134
  type PersistedChatWorkspaceSnapshot = Pick<
132
135
  ChatThreadSnapshot,
136
+ | 'workspacePanelHidden'
133
137
  | 'workspacePanelParentKey'
134
138
  | 'activeWorkspacePanelKind'
135
139
  | 'activeChildSessionKey'
@@ -280,6 +284,7 @@ function normalizePersistedWorkspaceSnapshot(value: unknown): PersistedChatWorks
280
284
  : 0;
281
285
 
282
286
  return {
287
+ workspacePanelHidden: value.workspacePanelHidden === true,
283
288
  workspacePanelParentKey,
284
289
  activeWorkspacePanelKind: resolvedActiveWorkspacePanelKind,
285
290
  activeChildSessionKey,
@@ -309,7 +314,7 @@ export const useChatThreadStore = create<ChatThreadStore>()(
309
314
  {
310
315
  name: CHAT_THREAD_WORKSPACE_STORAGE_KEY,
311
316
  version: CHAT_THREAD_WORKSPACE_STORAGE_VERSION,
312
- storage: createJSONStorage(() => window.localStorage),
317
+ storage: createJSONStorage(() => new ViewMemoryStorage()),
313
318
  partialize: (state): PersistedChatThreadStore => {
314
319
  const workspaceNavigationHistory = state.snapshot.workspaceNavigationHistory.filter(
315
320
  (entry) => entry.kind !== 'side-chat-draft',
@@ -320,6 +325,7 @@ export const useChatThreadStore = create<ChatThreadStore>()(
320
325
  : 0;
321
326
  return {
322
327
  snapshot: {
328
+ workspacePanelHidden: state.snapshot.workspacePanelHidden,
323
329
  workspacePanelParentKey: state.snapshot.workspacePanelParentKey,
324
330
  activeWorkspacePanelKind:
325
331
  state.snapshot.activeWorkspacePanelKind === 'side-chat-draft'
@@ -0,0 +1,11 @@
1
+ import { create } from 'zustand';
2
+
3
+ export type FloatingSession = { sessionKey: string; title: string };
4
+
5
+ type FloatingSessionStore = {
6
+ session: FloatingSession | null;
7
+ };
8
+
9
+ export const useFloatingSessionStore = create<FloatingSessionStore>(() => ({
10
+ session: null,
11
+ }));
@@ -1,5 +1,6 @@
1
1
  import { afterEach, expect, it, vi } from 'vitest';
2
2
  import { checkMicrophoneAccess, classifyMicrophoneError, voicePermissionInstructionKeys } from './chat-voice-permissions.utils';
3
+ import { setLanguage, t } from '@/shared/lib/i18n';
3
4
 
4
5
  afterEach(() => vi.unstubAllGlobals());
5
6
 
@@ -20,8 +21,11 @@ it('rechecks access and immediately releases every captured track', async () =>
20
21
  expect(stop).toHaveBeenCalledTimes(2);
21
22
  });
22
23
 
23
- it('reports unavailable media API and an actual denial without caching', async () => {
24
+ it('distinguishes insecure HTTP from an unsupported media API and an actual denial', async () => {
25
+ vi.stubGlobal('isSecureContext', false);
24
26
  vi.stubGlobal('navigator', {});
27
+ expect(await checkMicrophoneAccess()).toBe('insecure-context');
28
+ vi.stubGlobal('isSecureContext', true);
25
29
  expect(await checkMicrophoneAccess()).toBe('unsupported');
26
30
  vi.stubGlobal('navigator', { mediaDevices: { getUserMedia: vi.fn().mockRejectedValue(new DOMException('', 'NotAllowedError')) } });
27
31
  expect(await checkMicrophoneAccess()).toBe('permission');
@@ -34,3 +38,10 @@ it.each([
34
38
  expect(voicePermissionInstructionKeys(ua)).toEqual(['chatInputVoicePermissionBrowser', `chatInputVoicePermission${platform}`]);
35
39
  expect(voicePermissionInstructionKeys(`${ua} Electron`)[0]).toBe('chatInputVoicePermissionDesktop');
36
40
  });
41
+
42
+ it('explains the VPS HTTPS recovery path in both supported languages', () => {
43
+ setLanguage('zh');
44
+ expect(t('chatInputVoiceInsecureContext')).toContain('VPS 配置 HTTPS');
45
+ setLanguage('en');
46
+ expect(t('chatInputVoiceInsecureContext')).toContain('Configure HTTPS for a VPS');
47
+ });
@@ -1,4 +1,8 @@
1
- export type MicrophoneError = 'permission' | 'no-device' | 'device-busy' | 'unsupported' | 'failed';
1
+ export type MicrophoneError = 'insecure-context' | 'permission' | 'no-device' | 'device-busy' | 'unsupported' | 'failed';
2
+
3
+ export function isMicrophoneSecureContext(): boolean {
4
+ return globalThis.isSecureContext !== false;
5
+ }
2
6
 
3
7
  export function classifyMicrophoneError(error: unknown): MicrophoneError {
4
8
  const name = error instanceof DOMException || error instanceof Error ? error.name : '';
@@ -11,6 +15,7 @@ export function classifyMicrophoneError(error: unknown): MicrophoneError {
11
15
 
12
16
  /** Check on explicit start/retry; release every track even if the panel was closed. */
13
17
  export async function checkMicrophoneAccess(): Promise<MicrophoneError | null> {
18
+ if (!isMicrophoneSecureContext()) return 'insecure-context';
14
19
  if (!navigator.mediaDevices?.getUserMedia) return 'unsupported';
15
20
  try {
16
21
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
@@ -350,3 +350,7 @@ describe("CronConfig", () => {
350
350
  });
351
351
  });
352
352
  });
353
+
354
+ vi.mock("@/features/right-panel-resources/hooks/use-page-resource-actions", () => ({ usePageResourceActions: () => () => [] }));
355
+
356
+ vi.mock("@/features/right-panel-resources", () => ({ PageResourceActionsMenu: () => null, PageResourceActionItems: () => null, pageResourceFromSystemObject: vi.fn() }));
@@ -1,3 +1,5 @@
1
+ import { PageResourceActionsMenu } from '@/features/right-panel-resources';
2
+ import { pageResourceFromSystemObject } from '@/features/right-panel-resources';
1
3
  import type { ReactNode } from "react";
2
4
  import { Play, Trash2 } from "lucide-react";
3
5
 
@@ -87,7 +89,7 @@ export function CronJobDetailDialog({
87
89
  {isBound ? t("cronBoundSession") : t("cronDedicatedSession")}
88
90
  </span>
89
91
  </div>
90
- <SheetTitle>{job.name || job.id}</SheetTitle>
92
+ <div className="flex items-center justify-between gap-2"><SheetTitle>{job.name || job.id}</SheetTitle><PageResourceActionsMenu page={pageResourceFromSystemObject('cron-job', job.id, job.name || job.id)} /></div>
91
93
  <SheetDescription>{t("cronDetailDescription")}</SheetDescription>
92
94
  </SheetHeader>
93
95
 
@@ -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 {
3
5
  CalendarClock,
@@ -157,8 +159,14 @@ export function CronJobRow({
157
159
  </button>
158
160
 
159
161
  <TooltipProvider delayDuration={250}>
160
- <div className="relative flex shrink-0 items-center">
161
- <div className="absolute right-11 top-1/2 flex -translate-y-1/2 items-center gap-0.5 opacity-100 transition-opacity duration-150 [@media(hover:hover)]:pointer-events-none [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-focus-within:pointer-events-auto [@media(hover:hover)]:group-focus-within:opacity-100 [@media(hover:hover)]:group-hover:pointer-events-auto [@media(hover:hover)]:group-hover:opacity-100">
162
+ <div className="relative flex shrink-0 items-center gap-1">
163
+ <Switch
164
+ checked={job.enabled}
165
+ onCheckedChange={(checked) => onToggle(job, checked)}
166
+ aria-label={job.enabled ? t("cronDisable") : t("cronEnable")}
167
+ />
168
+
169
+ <div className="flex items-center gap-0.5 opacity-100 transition-opacity duration-150 [@media(hover:hover)]:pointer-events-none [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-focus-within:pointer-events-auto [@media(hover:hover)]:group-focus-within:opacity-100 [@media(hover:hover)]:group-hover:pointer-events-auto [@media(hover:hover)]:group-hover:opacity-100">
162
170
  <Tooltip>
163
171
  <TooltipTrigger asChild>
164
172
  <Button
@@ -190,7 +198,8 @@ export function CronJobRow({
190
198
  </TooltipTrigger>
191
199
  <TooltipContent>{t("cronMoreActions")}</TooltipContent>
192
200
  </Tooltip>
193
- <PopoverContent align="end" sideOffset={4} className="w-40 p-1">
201
+ <PopoverContent align="end" sideOffset={4} variant="menu">
202
+ <div className="my-1 h-px bg-border" />
194
203
  <button
195
204
  type="button"
196
205
  onClick={() => {
@@ -213,14 +222,11 @@ export function CronJobRow({
213
222
  <Trash2 className="h-3.5 w-3.5" />
214
223
  {t("delete")}
215
224
  </button>
225
+ <div className="my-1 h-px bg-border" />
226
+ <PageResourceActionItems page={pageResourceFromSystemObject("cron-job", job.id, jobLabel)} onSelect={() => setMenuOpen(false)} />
216
227
  </PopoverContent>
217
228
  </Popover>
218
229
  </div>
219
- <Switch
220
- checked={job.enabled}
221
- onCheckedChange={(checked) => onToggle(job, checked)}
222
- aria-label={job.enabled ? t("cronDisable") : t("cronEnable")}
223
- />
224
230
  </div>
225
231
  </TooltipProvider>
226
232
  </div>
@@ -114,3 +114,6 @@ describe("InboxReaderDialog", () => {
114
114
  );
115
115
  });
116
116
  });
117
+
118
+ // Resource policy has separate integration coverage; keep this fixture scoped to its business UI.
119
+ vi.mock("@/features/right-panel-resources/hooks/use-page-resource-actions", () => ({ usePageResourceActions: () => () => [] }));
@@ -1,3 +1,5 @@
1
+ import { PageResourceActionsMenu } from '@/features/right-panel-resources';
2
+ import { pageResourceFromSystemObject } from '@/features/right-panel-resources';
1
3
  import { useRef, useState } from "react";
2
4
  import { ChevronLeft, ChevronRight, Inbox } from "lucide-react";
3
5
  import { useNavigate } from "react-router-dom";
@@ -151,7 +153,10 @@ export function InboxReaderDialog() {
151
153
  {formatDateTime(activeDelivery.createdAt)}
152
154
  </time>
153
155
  </div>
154
- {positionControls}
156
+ <div className="flex shrink-0 items-center gap-1">
157
+ {positionControls}
158
+ <PageResourceActionsMenu page={pageResourceFromSystemObject("inbox-delivery", activeDelivery.id, activeDelivery.title)} />
159
+ </div>
155
160
  </div>
156
161
  <DialogDescription className="sr-only">
157
162
  {activeDelivery.summary ?? t("inboxNoSummary")}
@@ -145,3 +145,6 @@ describe("InboxPage", () => {
145
145
  );
146
146
  });
147
147
  });
148
+
149
+ // Resource policy has separate integration coverage; keep this fixture scoped to its business UI.
150
+ vi.mock("@/features/right-panel-resources/hooks/use-page-resource-actions", () => ({ usePageResourceActions: () => () => [] }));
@@ -1,3 +1,5 @@
1
+ import { PageResourceActionsMenu } from '@/features/right-panel-resources';
2
+ import { pageResourceFromSystemObject } from '@/features/right-panel-resources';
1
3
  import { useEffect, useMemo, useState } from "react";
2
4
  import type { InboxDelivery } from "@nextclaw/shared";
3
5
  import { Archive, ArrowLeft, Inbox, MessageCircle, RotateCcw, Trash2 } from "lucide-react";
@@ -113,14 +115,17 @@ function InboxListPane({
113
115
  {filteredDeliveries.length > 0 ? (
114
116
  <ul className="space-y-0.5">
115
117
  {filteredDeliveries.map((delivery) => (
116
- <li key={delivery.id}>
118
+ <li key={delivery.id} className={cn(
119
+ "group/page-row relative rounded-lg hover:bg-[var(--interaction-hover)] focus-within:bg-[var(--interaction-hover)] has-[[data-context-menu-open]]:bg-[var(--interaction-hover)]",
120
+ activeDeliveryId === delivery.id && "bg-[var(--interaction-selection)]",
121
+ )}>
117
122
  <Link
118
123
  to={`/inbox/${encodeURIComponent(delivery.id)}`}
119
124
  className={cn(
120
- "block rounded-lg px-2.5 py-2 text-[13px] transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
125
+ "block rounded-lg px-2.5 py-2 pr-10 text-[13px] transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
121
126
  activeDeliveryId === delivery.id
122
- ? "bg-[var(--interaction-selection)] text-foreground"
123
- : "text-foreground/80 hover:bg-[var(--interaction-hover)] hover:text-foreground",
127
+ ? "text-foreground"
128
+ : "text-foreground/80 hover:text-foreground",
124
129
  )}
125
130
  >
126
131
  <h2 className={cn(
@@ -145,6 +150,9 @@ function InboxListPane({
145
150
  )}
146
151
  </div>
147
152
  </Link>
153
+ <span className="absolute right-1 top-1.5">
154
+ <PageResourceActionsMenu revealOnHover page={pageResourceFromSystemObject("inbox-delivery", delivery.id, delivery.title)} />
155
+ </span>
148
156
  </li>
149
157
  ))}
150
158
  </ul>
@@ -43,7 +43,8 @@ vi.mock("@/shared/components/doc-browser", () => ({
43
43
  }),
44
44
  }));
45
45
 
46
- vi.mock("@/shared/lib/api", () => ({
46
+ vi.mock("@/shared/lib/api", async (importOriginal) => ({
47
+ ...await importOriginal<object>(),
47
48
  fetchMarketplaceSkillContent: mocks.fetchMarketplaceSkillContent,
48
49
  }));
49
50
 
@@ -348,3 +349,6 @@ describe("MarketplacePage detail loading", () => {
348
349
  expect(useMarketplaceDetailDocStore.getState().entries["skill:web-search"]?.contentRaw).not.toContain("Stale");
349
350
  });
350
351
  });
352
+
353
+ // Resource policy has separate integration coverage; keep this fixture scoped to its business UI.
354
+ vi.mock("@/features/right-panel-resources/hooks/use-page-resource-actions", () => ({ usePageResourceActions: () => () => [] }));
@@ -449,3 +449,6 @@ describe("MarketplacePage", () => {
449
449
  );
450
450
  });
451
451
  });
452
+
453
+ // Resource policy has separate integration coverage; keep this fixture scoped to its business UI.
454
+ vi.mock("@/features/right-panel-resources/hooks/use-page-resource-actions", () => ({ usePageResourceActions: () => () => [] }));
@@ -273,3 +273,5 @@ describe("Marketplace curated scene routes", () => {
273
273
  expect(screen.queryByRole("button", { name: /Development/ })).toBeNull();
274
274
  });
275
275
  });
276
+
277
+ vi.mock("@/features/right-panel-resources/hooks/use-page-resource-actions", () => ({ usePageResourceActions: () => () => [] }));
@@ -1,3 +1,6 @@
1
+ import { PageResourceActionsMenu } from '@/features/right-panel-resources';
2
+ import { pageResourceFromTarget } from '@/features/right-panel-resources';
3
+ import { createMarketplaceDetailDocTarget } from '@/features/marketplace/components/marketplace-detail-doc';
1
4
  import type {
2
5
  MarketplaceInstalledRecord,
3
6
  MarketplaceItemSummary,
@@ -273,6 +276,7 @@ export function MarketplaceListCard(props: {
273
276
  </div>
274
277
 
275
278
  <MarketplaceListCardStatus record={record} disabled={isDisabled} />
279
+ {record?.resourceUri ? <PageResourceActionsMenu page={{ uri: record.resourceUri, title, target: { kind: "system-object", title, url: record.resourceUri, resourceUri: record.resourceUri, historyPolicy: "none" } }} /> : item && <PageResourceActionsMenu page={pageResourceFromTarget(createMarketplaceDetailDocTarget({ id: `skill:${item.slug}`, title, typeLabel: t("marketplaceTypeSkill"), spec, status: "loading" }))} />}
276
280
  </div>
277
281
 
278
282
  <div className="mt-2 flex min-w-0 flex-1 flex-col">
@@ -226,3 +226,5 @@ describe("McpMarketplacePage", () => {
226
226
  expect(screen.getByText("Disable")).toBeTruthy();
227
227
  });
228
228
  });
229
+
230
+ vi.mock("@/features/right-panel-resources/hooks/use-page-resource-actions", () => ({ usePageResourceActions: () => () => [] }));
@@ -1,3 +1,5 @@
1
+ import { PageResourceActionsMenu } from "@/features/right-panel-resources";
2
+ import { pageResourceFromSystemObject } from "@/features/right-panel-resources";
1
3
  import type {
2
4
  MarketplaceInstalledRecord,
3
5
  MarketplaceItemSummary,
@@ -121,6 +123,7 @@ export function McpMarketplaceCard(props: {
121
123
  ) : null}
122
124
  </>
123
125
  ) : null}
126
+ {record?.id && <PageResourceActionsMenu page={pageResourceFromSystemObject("mcp-server", record.id, name)} />}
124
127
  </div>
125
128
  </div>
126
129
  </article>
@@ -9,6 +9,25 @@ function CurrentPathname() {
9
9
  }
10
10
 
11
11
  describe("AppNotificationToast", () => {
12
+ it("expands through a separate keyboard action without navigating", async () => {
13
+ const onDismiss = vi.fn();
14
+ const onExpand = vi.fn();
15
+ const user = userEvent.setup();
16
+ render(
17
+ <MemoryRouter initialEntries={['/chat/current']}>
18
+ <AppNotificationToast title="Reply" href="/chat/other" dismissLabel="Dismiss"
19
+ onDismiss={onDismiss} action={{ label: 'Expand', onClick: onExpand }} />
20
+ <CurrentPathname />
21
+ </MemoryRouter>,
22
+ );
23
+ await user.tab();
24
+ await user.tab();
25
+ expect(document.activeElement).toBe(screen.getByRole('button', { name: 'Expand' }));
26
+ await user.keyboard('{Enter}');
27
+ expect(onExpand).toHaveBeenCalledOnce();
28
+ expect(onDismiss).toHaveBeenCalledOnce();
29
+ expect(screen.getByTestId('current-pathname').textContent).toBe('/chat/current');
30
+ });
12
31
  it("keeps opening and dismissing a route notification as separate actions", async () => {
13
32
  const onDismiss = vi.fn();
14
33
  const user = userEvent.setup();
@@ -1,4 +1,4 @@
1
- import { X } from "lucide-react";
1
+ import { Maximize2, X } from "lucide-react";
2
2
  import { Link } from "react-router-dom";
3
3
  import { IconActionButton } from "@/shared/components/ui/actions/icon-action-button";
4
4
 
@@ -10,13 +10,14 @@ export type AppNotificationToastProps = {
10
10
  ariaLabel?: string;
11
11
  dismissLabel: string;
12
12
  onDismiss: () => void;
13
+ action?: { label: string; onClick: () => void };
13
14
  };
14
15
 
15
16
  const NOTIFICATION_CARD_CLASS =
16
- "relative ml-auto flex min-h-[74px] w-[320px] max-w-[calc(100vw-2rem)] rounded-[20px] border border-border/80 bg-background text-left text-foreground shadow-[0_8px_18px_rgba(0,0,0,0.12),0_2px_5px_rgba(0,0,0,0.06)]";
17
+ "relative ml-auto flex min-h-[68px] w-[360px] max-w-[calc(100vw-2rem)] items-center rounded-2xl border border-border/80 bg-background text-left text-foreground shadow-[0_8px_18px_rgba(0,0,0,0.12),0_2px_5px_rgba(0,0,0,0.06)]";
17
18
 
18
19
  const NOTIFICATION_CONTENT_CLASS =
19
- "flex min-h-[72px] min-w-0 flex-1 items-center gap-3 rounded-[inherit] py-3 pl-[18px] pr-[52px]";
20
+ "flex min-h-[66px] min-w-0 flex-1 items-center gap-2.5 rounded-[inherit] py-3 pl-3.5 pr-1";
20
21
 
21
22
  function AppNotificationContent({
22
23
  title,
@@ -47,19 +48,33 @@ function AppNotificationContent({
47
48
  );
48
49
  }
49
50
 
50
- function AppNotificationDismissButton({
51
+ function AppNotificationActions({
51
52
  dismissLabel,
52
53
  onDismiss,
53
- }: Pick<AppNotificationToastProps, "dismissLabel" | "onDismiss">) {
54
+ action,
55
+ }: Pick<AppNotificationToastProps, "dismissLabel" | "onDismiss" | "action">) {
54
56
  return (
55
- <IconActionButton
56
- className="absolute right-2.5 top-2.5 z-10"
57
- icon={<X className="h-4 w-4" aria-hidden="true" />}
58
- label={dismissLabel}
59
- onClick={onDismiss}
60
- size="lg"
61
- tooltipSide="left"
62
- />
57
+ <div className="flex shrink-0 items-center gap-0.5 pr-2">
58
+ {action ? (
59
+ <IconActionButton
60
+ icon={<Maximize2 className="h-4 w-4" aria-hidden="true" />}
61
+ label={action.label}
62
+ className="h-9 w-9"
63
+ size="lg"
64
+ onClick={() => {
65
+ action.onClick();
66
+ onDismiss();
67
+ }}
68
+ />
69
+ ) : null}
70
+ <IconActionButton
71
+ icon={<X className="h-4 w-4" aria-hidden="true" />}
72
+ label={dismissLabel}
73
+ onClick={onDismiss}
74
+ className="h-9 w-9"
75
+ size="lg"
76
+ />
77
+ </div>
63
78
  );
64
79
  }
65
80
 
@@ -71,6 +86,7 @@ export function AppNotificationToast({
71
86
  ariaLabel,
72
87
  dismissLabel,
73
88
  onDismiss,
89
+ action,
74
90
  }: AppNotificationToastProps) {
75
91
  const accessibleLabel = ariaLabel ?? [title, description].filter(Boolean).join(": ");
76
92
 
@@ -89,7 +105,8 @@ export function AppNotificationToast({
89
105
  iconSrc={iconSrc}
90
106
  />
91
107
  </Link>
92
- <AppNotificationDismissButton
108
+ <AppNotificationActions
109
+ action={action}
93
110
  dismissLabel={dismissLabel}
94
111
  onDismiss={onDismiss}
95
112
  />
@@ -110,7 +127,8 @@ export function AppNotificationToast({
110
127
  iconSrc={iconSrc}
111
128
  />
112
129
  </div>
113
- <AppNotificationDismissButton
130
+ <AppNotificationActions
131
+ action={action}
114
132
  dismissLabel={dismissLabel}
115
133
  onDismiss={onDismiss}
116
134
  />
@@ -12,6 +12,7 @@ export type AppNotification = {
12
12
  ariaLabel?: string;
13
13
  dismissLabel?: string;
14
14
  durationMs?: number;
15
+ action?: { label: string; onClick: () => void };
15
16
  };
16
17
 
17
18
  const DEFAULT_NOTIFICATION_DURATION_MS = 8_000;
@@ -26,6 +27,7 @@ export class AppNotificationManager {
26
27
  href: notification.href,
27
28
  iconSrc: notification.iconSrc,
28
29
  ariaLabel: notification.ariaLabel,
30
+ action: notification.action,
29
31
  dismissLabel: notification.dismissLabel ?? t("notificationDismiss"),
30
32
  onDismiss: () => {
31
33
  toast.dismiss(toastId);