@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,4 +1,5 @@
1
1
  import { useMemo, useState, type ReactNode } from "react";
2
+ import { SIDEBAR_ITEM_SURFACE_CLASS, SIDEBAR_ITEM_ACTIVE_SURFACE_CLASS } from "@/app/components/layout/sidebar-rail.styles";
2
3
  import { Link, useLocation, useNavigate } from "react-router-dom";
3
4
  import {
4
5
  AlarmClock,
@@ -12,7 +13,6 @@ import {
12
13
  Plus,
13
14
  } from "lucide-react";
14
15
  import { usePresenter } from "@/features/chat/components/providers/chat-presenter.provider";
15
- import { ChatSessionTypeMenu } from "@/features/chat/features/session-type/components/chat-session-type-menu";
16
16
  import { Popover, PopoverTrigger } from "@/shared/components/ui/popover";
17
17
  import { ChatPopoverContent } from "@/features/chat/components/chat-popover-content";
18
18
  import { IconActionButton } from "@/shared/components/ui/actions/icon-action-button";
@@ -68,7 +68,6 @@ export function ChatSidebarProjectGroups(props: ChatSidebarProjectGroupsProps) {
68
68
  const collapsedProjectRoots = useChatSessionListStore(
69
69
  (state) => state.snapshot.collapsedProjectRoots,
70
70
  );
71
- const [openProjectRoot, setOpenProjectRoot] = useState<string | null>(null);
72
71
  const [openProjectMenuRoot, setOpenProjectMenuRoot] = useState<string | null>(
73
72
  null,
74
73
  );
@@ -80,7 +79,6 @@ export function ChatSidebarProjectGroups(props: ChatSidebarProjectGroupsProps) {
80
79
  ),
81
80
  [defaultSessionType, sessionTypeOptions],
82
81
  );
83
- const supportsSessionTypeChoice = sessionTypeOptions.length > 1;
84
82
  const removeProject = async (group: ChatSidebarProjectGroup) => {
85
83
  if (!group.projectId) return;
86
84
  setOpenProjectMenuRoot(null);
@@ -119,8 +117,9 @@ export function ChatSidebarProjectGroups(props: ChatSidebarProjectGroupsProps) {
119
117
  <div key={group.projectRoot}>
120
118
  <div
121
119
  className={cn(
122
- "group/project relative h-8 rounded-lg px-1 text-muted-foreground transition-colors hover:bg-gray-200/60 hover:text-gray-900",
123
- isSelected && "bg-gray-200/60 text-gray-900",
120
+ "group/project relative h-8 px-1",
121
+ SIDEBAR_ITEM_SURFACE_CLASS,
122
+ isSelected && SIDEBAR_ITEM_ACTIVE_SURFACE_CLASS,
124
123
  )}
125
124
  >
126
125
  <ChatSidebarContextCard
@@ -213,37 +212,6 @@ export function ChatSidebarProjectGroups(props: ChatSidebarProjectGroupsProps) {
213
212
  data-project-actions
214
213
  className="pointer-events-none absolute right-2 top-1/2 flex -translate-y-1/2 items-center opacity-0 transition-opacity group-hover/project:pointer-events-auto group-hover/project:opacity-100 focus-within:pointer-events-auto focus-within:opacity-100"
215
214
  >
216
- {supportsSessionTypeChoice ? (
217
- <Popover
218
- open={openProjectRoot === group.projectRoot}
219
- onOpenChange={(nextOpen) => {
220
- setOpenProjectRoot(nextOpen ? group.projectRoot : null);
221
- }}
222
- >
223
- <PopoverTrigger asChild>
224
- <IconActionButton
225
- icon={<Plus className="h-3.5 w-3.5" />}
226
- label={actionLabel}
227
- />
228
- </PopoverTrigger>
229
- <ChatPopoverContent
230
- align="end"
231
- className="w-56 rounded-2xl border border-border bg-popover p-1.5 text-popover-foreground shadow-[0_24px_60px_-28px_rgba(15,23,42,0.38)]"
232
- >
233
- <ChatSessionTypeMenu
234
- options={sessionTypeOptions}
235
- selectedSessionType={preferredSessionType}
236
- onSelect={(sessionType) => {
237
- presenter.chatSessionListManager.createSession({
238
- projectRoot: group.projectRoot,
239
- sessionType,
240
- });
241
- setOpenProjectRoot(null);
242
- }}
243
- />
244
- </ChatPopoverContent>
245
- </Popover>
246
- ) : (
247
215
  <IconActionButton
248
216
  icon={<Plus className="h-3.5 w-3.5" />}
249
217
  label={actionLabel}
@@ -254,7 +222,6 @@ export function ChatSidebarProjectGroups(props: ChatSidebarProjectGroupsProps) {
254
222
  })
255
223
  }
256
224
  />
257
- )}
258
225
  <IconActionButton
259
226
  icon={
260
227
  <Pin
@@ -11,6 +11,7 @@ import type { ChatSessionTypeOption } from "@/features/chat/features/session-typ
11
11
  import { t } from "@/shared/lib/i18n";
12
12
 
13
13
  export function ChatSidebarSessionEntry(props: {
14
+ variant?: 'desktop' | 'mobile';
14
15
  item: NcpSessionListItemView;
15
16
  selectedSessionKey: string | null;
16
17
  optimisticReadAtBySessionKey: Record<string, string>;
@@ -74,6 +75,7 @@ export function ChatSidebarSessionEntry(props: {
74
75
 
75
76
  return (
76
77
  <ChatSidebarSessionItem
78
+ variant={props.variant}
77
79
  sessionKey={session.key}
78
80
  active={active}
79
81
  showUnreadDot={shouldShowUnreadSessionIndicator({
@@ -1,4 +1,6 @@
1
1
  import { AgentAvatar } from "@/shared/components/common/agent-avatar";
2
+ import { SIDEBAR_ITEM_SURFACE_CLASS, SIDEBAR_ITEM_ACTIVE_SURFACE_CLASS } from "@/app/components/layout/sidebar-rail.styles";
3
+ import { ChatMobileSessionRow } from './chat-mobile-session-row';
2
4
  import { SessionContextIconNode } from "@/features/chat/features/session/components/session-context-icon";
3
5
  import { SessionRunBadge } from "@/features/chat/features/session/components/session-run-badge";
4
6
  import { ChatSessionMoreActionsMenu } from "@/features/chat/features/session/components/session-header/chat-session-more-actions-menu";
@@ -21,7 +23,8 @@ import {
21
23
  import { ChatSidebarContextCard } from "@/features/chat/features/session/components/chat-sidebar-context-card";
22
24
  import { ChatSessionHeaderMenuItem } from "@/features/chat/features/session/components/session-header/chat-session-header-menu-item";
23
25
 
24
- type ChatSidebarSessionItemProps = {
26
+ export type ChatSidebarSessionItemProps = {
27
+ variant?: 'desktop' | 'mobile';
25
28
  sessionKey: string;
26
29
  active: boolean;
27
30
  showUnreadDot: boolean;
@@ -264,6 +267,7 @@ function ChatSidebarSessionDisplayView({
264
267
  />
265
268
  <ChatSessionMoreActionsMenu
266
269
  sessionKey={sessionKey}
270
+ sessionTitle={title}
267
271
  triggerSize="sm"
268
272
  triggerTone="strong"
269
273
  >
@@ -279,7 +283,8 @@ function ChatSidebarSessionDisplayView({
279
283
  );
280
284
  }
281
285
 
282
- export function ChatSidebarSessionItem({
286
+ export function ChatSidebarSessionItem(props: ChatSidebarSessionItemProps) {
287
+ const {
283
288
  sessionKey,
284
289
  active,
285
290
  showUnreadDot,
@@ -305,17 +310,22 @@ export function ChatSidebarSessionItem({
305
310
  onCancel,
306
311
  onTogglePinned,
307
312
  onDelete,
308
- }: ChatSidebarSessionItemProps) {
313
+ variant,
314
+ } = props;
309
315
  return (
310
316
  <div
311
317
  className={cn(
312
- "w-full rounded-lg px-2.5 py-2 text-left text-[13px] transition-colors",
313
- active
318
+ variant === 'mobile'
319
+ ? 'w-full border-b border-border/50 bg-background text-left'
320
+ : cn("w-full px-3 py-2 text-left text-[13px]", SIDEBAR_ITEM_SURFACE_CLASS, active && SIDEBAR_ITEM_ACTIVE_SURFACE_CLASS),
321
+ variant === 'mobile' && (active
314
322
  ? "bg-background/90 font-medium text-foreground"
315
- : "text-foreground/80 hover:bg-background/65 hover:text-foreground",
323
+ : "text-foreground/80 hover:bg-background/65 hover:text-foreground"),
324
+ active && "font-medium",
316
325
  )}
317
326
  >
318
327
  {isEditing ? (
328
+ <div className={variant === 'mobile' ? 'p-4' : undefined}>
319
329
  <ChatSidebarSessionEditingView
320
330
  sessionKey={sessionKey}
321
331
  draftLabel={draftLabel}
@@ -324,7 +334,8 @@ export function ChatSidebarSessionItem({
324
334
  onSave={onSave}
325
335
  onCancel={onCancel}
326
336
  />
327
- ) : (
337
+ </div>
338
+ ) : variant === 'mobile' ? <ChatMobileSessionRow {...props} /> : (
328
339
  <ChatSidebarSessionDisplayView
329
340
  sessionKey={sessionKey}
330
341
  active={active}
@@ -12,6 +12,7 @@ import { t } from "@/shared/lib/i18n";
12
12
  type SessionTypeOption = ChatSessionTypeOption;
13
13
 
14
14
  type ChatSidebarSessionListProps = {
15
+ variant?: 'desktop' | 'mobile';
15
16
  isLoading: boolean;
16
17
  isProjectFirstView: boolean;
17
18
  groups: ChatSidebarDateGroup[];
@@ -32,6 +33,7 @@ function ChatSidebarEmptyState({ label }: { label: string }) {
32
33
  }
33
34
 
34
35
  export function ChatSidebarSessionList({
36
+ variant = 'desktop',
35
37
  defaultSessionType,
36
38
  groups,
37
39
  isLoading,
@@ -68,13 +70,13 @@ export function ChatSidebarSessionList({
68
70
  }
69
71
 
70
72
  return (
71
- <div className="space-y-2">
73
+ <div className={variant === 'mobile' ? undefined : 'space-y-2'}>
72
74
  {groups.map((group) => (
73
75
  <div key={group.label}>
74
- <div className="px-2 pb-1 pt-0.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground/65">
76
+ <div className={variant === 'mobile' ? 'px-4 py-1 text-[11px] text-muted-foreground' : 'px-2 pb-1 pt-0.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground/65'}>
75
77
  {group.label}
76
78
  </div>
77
- <div className="space-y-0.5">
79
+ <div className={variant === 'mobile' ? undefined : 'space-y-0.5'}>
78
80
  {group.items.map(renderSessionItem)}
79
81
  </div>
80
82
  </div>
@@ -192,7 +192,7 @@ describe('ChatSessionHeaderActions', () => {
192
192
  expect(screen.getByRole('button', { name: 'Open session workspace' }).className).toContain('w-7');
193
193
  });
194
194
 
195
- it('places the workspace toggle at the far right of the visible header actions', () => {
195
+ it('places more actions at the far right of the visible header actions', () => {
196
196
  render(
197
197
  <ChatSessionHeaderActions
198
198
  sessionKey="session-actions"
@@ -208,7 +208,7 @@ describe('ChatSessionHeaderActions', () => {
208
208
  const menuButton = screen.getByRole('button', { name: 'More actions' });
209
209
  const workspaceButton = screen.getByRole('button', { name: 'Open session workspace' });
210
210
 
211
- expect(menuButton.compareDocumentPosition(workspaceButton)).toBe(
211
+ expect(workspaceButton.compareDocumentPosition(menuButton)).toBe(
212
212
  Node.DOCUMENT_POSITION_FOLLOWING,
213
213
  );
214
214
  });
@@ -237,3 +237,11 @@ describe('ChatSessionHeaderActions', () => {
237
237
  expect(mocks.onToggleWorkspace).toHaveBeenCalledTimes(1);
238
238
  });
239
239
  });
240
+
241
+ vi.mock("react-router-dom", async (importOriginal) => ({ ...(await importOriginal<object>()), useNavigate: () => vi.fn(), useLocation: () => ({ pathname: '/chat', search: '' }) }));
242
+ vi.mock("@/features/panel-apps/hooks/use-panel-apps", () => ({ usePanelApps: () => ({ data: { entries: [] } }), useUpdatePanelAppPreferences: () => ({ mutate: vi.fn() }) }));
243
+ vi.mock("@/app/components/app-presenter-provider", async () => {
244
+ const { PageResourceManager } = await import("@/features/right-panel-resources/managers/page-resource.manager");
245
+ const app = { docBrowserManager: { openTarget: vi.fn() }, chatComposerIntentManager: { requestUiResourceReference: vi.fn() } };
246
+ return { useAppPresenter: () => ({ ...app, pageResourceManager: new PageResourceManager(app as never) }) };
247
+ });
@@ -12,6 +12,7 @@ const SESSION_HEADER_ACTION_GROUP_CLASS = 'flex shrink-0 items-center gap-1.5';
12
12
 
13
13
  type ChatSessionHeaderActionsProps = {
14
14
  sessionKey: string | null;
15
+ sessionTitle?: string;
15
16
  canDeleteSession: boolean;
16
17
  isDeletePending: boolean;
17
18
  currentPath?: string | null;
@@ -24,6 +25,7 @@ type ChatSessionHeaderActionsProps = {
24
25
 
25
26
  export function ChatSessionHeaderActions({
26
27
  sessionKey,
28
+ sessionTitle,
27
29
  canDeleteSession,
28
30
  isDeletePending,
29
31
  currentPath,
@@ -59,9 +61,27 @@ export function ChatSessionHeaderActions({
59
61
 
60
62
  return (
61
63
  <div className={SESSION_HEADER_ACTION_GROUP_CLASS}>
64
+ <IconActionButton
65
+ icon={
66
+ isWorkspaceOpen ? (
67
+ <PanelRightClose className="h-4 w-4" />
68
+ ) : (
69
+ <PanelRightOpen className="h-4 w-4" />
70
+ )
71
+ }
72
+ label={t(
73
+ isWorkspaceOpen
74
+ ? 'chatSessionCloseWorkspace'
75
+ : 'chatSessionOpenWorkspace',
76
+ )}
77
+ aria-pressed={isWorkspaceOpen}
78
+ onClick={onToggleWorkspace}
79
+ disabled={isBusy}
80
+ />
62
81
  {sessionKey ? (
63
82
  <ChatSessionMoreActionsMenu
64
83
  sessionKey={sessionKey}
84
+ sessionTitle={sessionTitle}
65
85
  disabled={isBusy}
66
86
  >
67
87
  <ChatSessionHeaderMenuItem
@@ -85,23 +105,6 @@ export function ChatSessionHeaderActions({
85
105
  />
86
106
  </ChatSessionMoreActionsMenu>
87
107
  ) : null}
88
- <IconActionButton
89
- icon={
90
- isWorkspaceOpen ? (
91
- <PanelRightClose className="h-4 w-4" />
92
- ) : (
93
- <PanelRightOpen className="h-4 w-4" />
94
- )
95
- }
96
- label={t(
97
- isWorkspaceOpen
98
- ? 'chatSessionCloseWorkspace'
99
- : 'chatSessionOpenWorkspace',
100
- )}
101
- aria-pressed={isWorkspaceOpen}
102
- onClick={onToggleWorkspace}
103
- disabled={isBusy}
104
- />
105
108
 
106
109
  {sessionKey ? (
107
110
  <>
@@ -20,15 +20,15 @@ export function ChatSessionHeaderMenuItem({
20
20
  <button
21
21
  type="button"
22
22
  className={cn(
23
- 'flex w-full items-center gap-2 rounded-xl px-3 py-2 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50',
23
+ 'flex h-8 w-full items-center gap-2 rounded-lg px-2.5 text-left text-[13px] font-medium outline-none transition-colors disabled:cursor-not-allowed disabled:opacity-50',
24
24
  destructive
25
- ? 'text-destructive hover:bg-destructive/10'
26
- : 'text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-accent-foreground'
25
+ ? 'text-destructive hover:bg-destructive/10 focus-visible:bg-destructive/10'
26
+ : 'text-foreground hover:bg-muted focus-visible:bg-muted'
27
27
  )}
28
28
  onClick={onClick}
29
29
  disabled={disabled}
30
30
  >
31
- <Icon className="h-4 w-4 shrink-0" />
31
+ <Icon className={cn("h-4 w-4 shrink-0", !destructive && "text-muted-foreground")} />
32
32
  <span>{label}</span>
33
33
  </button>
34
34
  );
@@ -1,4 +1,7 @@
1
- import { useState, type ReactNode } from 'react';
1
+ import { PageResourceActionItems } from '@/features/right-panel-resources';
2
+ import { pageResourceFromTarget } from '@/features/right-panel-resources';
3
+ import { buildSessionPanelUrl } from '@/features/chat/features/session/utils/chat-session-route.utils';
4
+ import { Children, isValidElement, useState, type ReactNode } from 'react';
2
5
  import { copyText } from '@nextclaw/agent-chat-ui';
3
6
  import { Copy, MoreVertical } from 'lucide-react';
4
7
  import { toast } from 'sonner';
@@ -14,6 +17,7 @@ import { ChatSessionHeaderMenuItem } from './chat-session-header-menu-item';
14
17
 
15
18
  type ChatSessionMoreActionsMenuProps = {
16
19
  sessionKey: string;
20
+ sessionTitle?: string;
17
21
  children?: ReactNode;
18
22
  disabled?: boolean;
19
23
  triggerSize?: IconActionButtonSize;
@@ -30,6 +34,7 @@ export async function copySessionId(sessionKey: string) {
30
34
 
31
35
  export function ChatSessionMoreActionsMenu({
32
36
  sessionKey,
37
+ sessionTitle,
33
38
  children,
34
39
  disabled = false,
35
40
  triggerSize = 'md',
@@ -37,6 +42,9 @@ export function ChatSessionMoreActionsMenu({
37
42
  className,
38
43
  }: ChatSessionMoreActionsMenuProps) {
39
44
  const [isOpen, setIsOpen] = useState(false);
45
+ const menuItems = Children.toArray(children);
46
+ const isDestructive = (item: ReactNode) => isValidElement<{ destructive?: boolean }>(item) && item.props.destructive;
47
+ const destructiveItems = menuItems.filter(isDestructive);
40
48
 
41
49
  const handleCopySessionId = () => {
42
50
  setIsOpen(false);
@@ -49,7 +57,6 @@ export function ChatSessionMoreActionsMenu({
49
57
  <IconActionButton
50
58
  icon={<MoreVertical className="h-4 w-4" />}
51
59
  label={t('chatSessionMoreActions')}
52
- tooltip={false}
53
60
  size={triggerSize}
54
61
  tone={triggerTone}
55
62
  className={className}
@@ -57,16 +64,22 @@ export function ChatSessionMoreActionsMenu({
57
64
  onClick={(event) => event.stopPropagation()}
58
65
  />
59
66
  </PopoverTrigger>
60
- <ChatPopoverContent align="end" className="w-56 p-2">
61
- <div className="space-y-1" onClick={() => setIsOpen(false)}>
67
+ <ChatPopoverContent align="end" variant="menu">
68
+ <div onClick={() => setIsOpen(false)}>
69
+ {menuItems.filter((item) => !isDestructive(item))}
62
70
  <ChatSessionHeaderMenuItem
63
71
  icon={Copy}
64
72
  label={t('chatSessionCopyId')}
65
73
  onClick={handleCopySessionId}
66
74
  disabled={disabled}
67
75
  />
68
- {children}
69
76
  </div>
77
+ <div className="my-1 h-px bg-border" />
78
+ <PageResourceActionItems page={pageResourceFromTarget({ kind: 'chat-session', title: sessionTitle || t('chatFloatingConversation'), url: buildSessionPanelUrl(sessionKey), resourceUri: buildSessionPanelUrl(sessionKey), historyPolicy: 'none' })} onSelect={() => setIsOpen(false)} />
79
+ {destructiveItems.length > 0 ? <>
80
+ <div className="my-1 h-px bg-border" />
81
+ <div onClick={() => setIsOpen(false)}>{destructiveItems}</div>
82
+ </> : null}
70
83
  </ChatPopoverContent>
71
84
  </Popover>
72
85
  );
@@ -1,4 +1,16 @@
1
1
  const SESSION_ROUTE_PREFIX = 'sid_';
2
+ export const CHAT_SESSION_PANEL_KIND = 'chat-session';
3
+ const SESSION_PANEL_PREFIX = 'nextclaw://chat-session/';
4
+
5
+ export function buildSessionPanelUrl(sessionKey: string): string {
6
+ return SESSION_PANEL_PREFIX + encodeSessionRouteId(sessionKey);
7
+ }
8
+
9
+ export function parseSessionKeyFromPanelUrl(url: string): string | null {
10
+ return url.startsWith(SESSION_PANEL_PREFIX)
11
+ ? decodeSessionRouteId(url.slice(SESSION_PANEL_PREFIX.length))
12
+ : null;
13
+ }
2
14
  export const CHAT_DRAFT_SESSION_PATH = '/chat/draft';
3
15
  const DRAFT_SESSION_ROUTE_ID = CHAT_DRAFT_SESSION_PATH.slice('/chat/'.length);
4
16
 
@@ -65,6 +65,26 @@ it('keeps existing child sessions selectable beside the create action', async ()
65
65
  expect(mocks.selectChildSessionDetail).toHaveBeenCalledWith('child-1');
66
66
  });
67
67
 
68
+ it('shows a spinner only for child sessions that are running', () => {
69
+ render(
70
+ <ChatSessionChildSessions
71
+ childSessionTabs={[
72
+ createChildSession(),
73
+ {
74
+ ...createChildSession(),
75
+ sessionKey: 'child-2',
76
+ title: 'Running branch',
77
+ runStatus: 'running',
78
+ },
79
+ ]}
80
+ sessionKey="parent-1"
81
+ />,
82
+ );
83
+
84
+ expect(screen.getAllByLabelText('Running')).toHaveLength(1);
85
+ expect(screen.getByRole('button', { name: /Running branch.*Running/ })).toBeTruthy();
86
+ });
87
+
68
88
  it('copies a child session ID from its own more-actions menu', async () => {
69
89
  const user = userEvent.setup();
70
90
  render(<ChatSessionChildSessions childSessionTabs={[createChildSession()]} sessionKey="parent-1" />);
@@ -75,3 +95,11 @@ it('copies a child session ID from its own more-actions menu', async () => {
75
95
  expect(mocks.copyText).toHaveBeenCalledWith('child-1');
76
96
  expect(mocks.selectChildSessionDetail).not.toHaveBeenCalled();
77
97
  });
98
+
99
+ vi.mock("react-router-dom", async (importOriginal) => ({ ...(await importOriginal<object>()), useNavigate: () => vi.fn(), useLocation: () => ({ pathname: '/chat', search: '' }) }));
100
+ vi.mock("@/features/panel-apps/hooks/use-panel-apps", () => ({ usePanelApps: () => ({ data: { entries: [] } }), useUpdatePanelAppPreferences: () => ({ mutate: vi.fn() }) }));
101
+ vi.mock("@/app/components/app-presenter-provider", async () => {
102
+ const { PageResourceManager } = await import("@/features/right-panel-resources/managers/page-resource.manager");
103
+ const app = { docBrowserManager: { openTarget: vi.fn() }, chatComposerIntentManager: { requestUiResourceReference: vi.fn() } };
104
+ return { useAppPresenter: () => ({ ...app, pageResourceManager: new PageResourceManager(app as never) }) };
105
+ });
@@ -534,6 +534,15 @@ describe("ChatSessionWorkspaceFilePreview Office rendering", () => {
534
534
  });
535
535
 
536
536
  describe("ChatSessionWorkspaceFilePreview text rendering", () => {
537
+ it("renders an immutable object snapshot without reading a same-named local file", () => {
538
+ serverPathReadMock.mockReturnValue({ data: null, isLoading: false });
539
+ serverPathBrowseMock.mockReturnValue({ data: null, isLoading: false });
540
+ renderWorkspaceFilePreview({ file: { path: "snapshot.md", rawText: "# Resource snapshot", previewViewer: "rendered" } });
541
+ expect(screen.getByTestId("markdown-preview").textContent).toBe("# Resource snapshot");
542
+ expect(serverPathReadMock).toHaveBeenCalledWith(expect.objectContaining({ enabled: false }));
543
+ expect(serverPathBrowseMock).toHaveBeenCalledWith(expect.objectContaining({ enabled: false }));
544
+ });
545
+
537
546
  it("renders preview files inside a full-height workspace code surface", () => {
538
547
  mockTextRead();
539
548
  renderWorkspaceFilePreview();
@@ -205,7 +205,9 @@ beforeEach(() => {
205
205
  });
206
206
  });
207
207
 
208
- function createChildTab(): ResolvedChildSessionTab {
208
+ function createChildTab(
209
+ overrides: Partial<ResolvedChildSessionTab> = {},
210
+ ): ResolvedChildSessionTab {
209
211
  return {
210
212
  sessionKey: 'child-1',
211
213
  parentSessionKey: 'parent-1',
@@ -219,6 +221,7 @@ function createChildTab(): ResolvedChildSessionTab {
219
221
  preferredModel: 'minimax/MiniMax-M3',
220
222
  projectName: 'nextbot',
221
223
  projectRoot: '/Users/peiwang/Projects/nextbot',
224
+ ...overrides,
222
225
  };
223
226
  }
224
227
 
@@ -252,7 +255,7 @@ it('shows child session content without a redundant metadata header', () => {
252
255
 
253
256
  it('shows all session workspace entries in the overview', async () => {
254
257
  const user = userEvent.setup();
255
- const childTab = createChildTab();
258
+ const childTab = createChildTab({ runStatus: 'running' });
256
259
 
257
260
  render(
258
261
  <ChatSessionWorkspacePanelContent
@@ -277,6 +280,7 @@ it('shows all session workspace entries in the overview', async () => {
277
280
  const projectFilesButton = screen.getByRole('button', { name: /Project files/ });
278
281
 
279
282
  expect((childSessionsButton as HTMLButtonElement).disabled).toBe(false);
283
+ expect(within(childSessionsButton).getByLabelText('Running')).toBeTruthy();
280
284
  expect((cronJobsButton as HTMLButtonElement).disabled).toBe(false);
281
285
  expect(projectFilesButton.compareDocumentPosition(screen.getByText('Token usage')) & Node.DOCUMENT_POSITION_FOLLOWING)
282
286
  .toBeTruthy();
@@ -1,4 +1,18 @@
1
- import { render, screen } from "@testing-library/react";
1
+ import { getPresenter } from '@/app/presenters/app.presenter';
2
+ import { buildSessionPath } from '@/features/chat/features/session/utils/chat-session-route.utils';
3
+ import { AppPresenterProvider } from '@/app/components/app-presenter-provider';
4
+ import type { ReactElement } from 'react';
5
+ import { MemoryRouter } from 'react-router-dom';
6
+
7
+ vi.mock('@/features/panel-apps/hooks/use-panel-apps', () => ({
8
+ usePanelApps: () => ({ data: { entries: [] } }),
9
+ useUpdatePanelAppPreferences: () => ({ mutate: vi.fn(), isPending: false }),
10
+ }));
11
+ function render(ui: ReactElement) {
12
+ return renderUi(<AppPresenterProvider><MemoryRouter initialEntries={[buildSessionPath('session-1')]}>{ui}</MemoryRouter></AppPresenterProvider>);
13
+ }
14
+ import { useWorkbenchSurfaceStore } from '@/shared/components/workbench/stores/workbench-surface.store';
15
+ import { render as renderUi, screen } from "@testing-library/react";
2
16
  import userEvent from "@testing-library/user-event";
3
17
  import { beforeEach, describe, expect, it, vi } from "vitest";
4
18
  import { ChatSessionWorkspacePanel } from "@/features/chat/features/workspace/components/chat-session-workspace-panel";
@@ -91,7 +105,9 @@ function renderPanel(displayMode: "docked" | "overlay" = "docked") {
91
105
 
92
106
  describe("ChatSessionWorkspacePanel", () => {
93
107
  beforeEach(() => {
108
+ useWorkbenchSurfaceStore.setState({ surfaces: {} });
94
109
  vi.clearAllMocks();
110
+ vi.spyOn(getPresenter().chatComposerIntentManager, 'requestFileReference').mockImplementation(mocks.requestFileReference);
95
111
  });
96
112
 
97
113
  it("refreshes the active workspace file from the top action bar", async () => {
@@ -130,23 +146,46 @@ describe("ChatSessionWorkspacePanel", () => {
130
146
  onSelect: vi.fn(),
131
147
  },
132
148
  ]}
133
- onClose={vi.fn()}
134
149
  onGoBack={vi.fn()}
135
150
  onGoForward={vi.fn()}
136
151
  />,
137
152
  );
138
153
 
139
- await user.click(screen.getByRole("button", { name: "More actions" }));
154
+ await user.click(screen.getByRole("button", { name: "Page actions: Child session" }));
140
155
 
141
156
  expect(screen.getByRole("menuitem", { name: "Copy session ID" })).toBeTruthy();
142
157
  });
143
158
 
159
+ it("shows the running spinner on workspace tabs", () => {
160
+ render(
161
+ <WorkspaceTabsBar
162
+ canGoBack={false}
163
+ canGoForward={false}
164
+ tabs={[
165
+ {
166
+ key: "child-sessions",
167
+ kind: "child-sessions",
168
+ title: "Child sessions",
169
+ tooltip: "Child sessions",
170
+ active: true,
171
+ runStatus: "running",
172
+ onSelect: vi.fn(),
173
+ },
174
+ ]}
175
+ onGoBack={vi.fn()}
176
+ onGoForward={vi.fn()}
177
+ />,
178
+ );
179
+
180
+ expect(screen.getByLabelText("Running")).toBeTruthy();
181
+ });
182
+
144
183
  it("adds an opened project file to the active chat from its action menu", async () => {
145
184
  const user = userEvent.setup();
146
185
  renderPanel();
147
186
 
148
187
  await user.click(
149
- screen.getByRole("button", { name: "File actions" }),
188
+ screen.getByRole("button", { name: "Page actions: Preview: README.md" }),
150
189
  );
151
190
  await user.click(screen.getByRole("menuitem", { name: "Add to chat" }));
152
191
 
@@ -166,17 +205,17 @@ describe("ChatSessionWorkspacePanel", () => {
166
205
  expect(panel.getAttribute("data-theme-surface")).toBe("workspace-panel");
167
206
 
168
207
  await user.click(
169
- screen.getByRole("button", { name: "Maximize workspace panel" }),
208
+ screen.getByRole("button", { name: "Maximize" }),
170
209
  );
171
210
 
172
- expect(panel.className).toContain("absolute");
173
- expect(panel.className).not.toContain("fixed");
211
+ expect(panel.style.position).toBe("fixed");
212
+ expect(panel.style.position).toBe("fixed");
174
213
  expect(
175
214
  screen.queryByTestId("resizable-right-panel-handle"),
176
215
  ).toBeNull();
177
216
 
178
217
  await user.click(
179
- screen.getByRole("button", { name: "Restore workspace panel" }),
218
+ screen.getByRole("button", { name: "Restore size" }),
180
219
  );
181
220
 
182
221
  expect(panel.className).not.toContain("absolute");
@@ -187,10 +226,8 @@ describe("ChatSessionWorkspacePanel", () => {
187
226
  renderPanel("overlay");
188
227
 
189
228
  expect(
190
- screen.queryByRole("button", { name: "Maximize workspace panel" }),
229
+ screen.queryByRole("button", { name: "Maximize" }),
191
230
  ).toBeNull();
192
- expect(screen.getByTestId("chat-session-workspace-panel").className).toContain(
193
- "fixed",
194
- );
231
+ expect(screen.getByTestId("chat-session-workspace-panel").style.position).toBe("fixed");
195
232
  });
196
233
  });