@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
@@ -152,30 +152,34 @@ export function resolveWorkspacePreviewErrorText(error: unknown): string {
152
152
  : t('chatWorkspacePreviewFailed');
153
153
  }
154
154
 
155
- function WorkspaceDiffBody({ diffBlock }: { diffBlock: ChatFileOperationBlockViewModel | null }) {
155
+ function WorkspaceDiffBody({ diffBlock, fileKey }: { diffBlock: ChatFileOperationBlockViewModel | null; fileKey: string }) {
156
156
  if (!diffBlock) {
157
157
  return <WorkspaceFilePreviewStatus text={t('chatWorkspaceDiffEmpty')} />;
158
158
  }
159
- return <WorkspaceCodeSurface block={diffBlock} />;
159
+ return <WorkspaceCodeSurface block={diffBlock} restorationKey={`workspace-preview:diff:${fileKey}`} />;
160
160
  }
161
161
 
162
162
  function WorkspaceCodeSurface({
163
163
  block,
164
+ restorationKey,
164
165
  targetColumn,
165
166
  targetLine,
166
167
  }: {
167
168
  block: ChatFileOperationBlockViewModel;
169
+ restorationKey: string;
168
170
  targetColumn?: number | null;
169
171
  targetLine?: number | null;
170
172
  }) {
173
+ const { scrollRef, onScroll } = useScrollRestoration<HTMLDivElement>({ restorationKey, isEnabled: !targetLine });
171
174
  return (
172
- <div className="h-full overflow-auto custom-scrollbar bg-white">
175
+ <div ref={scrollRef} onScroll={onScroll} className="h-full overflow-auto custom-scrollbar bg-card">
173
176
  <FileOperationCodeSurface block={block} layout="workspace" targetColumn={targetColumn} targetLine={targetLine} />
174
177
  </div>
175
178
  );
176
179
  }
177
180
 
178
181
  function WorkspacePreviewBody({
182
+ fileKey,
179
183
  contentUrl,
180
184
  contentUrlKind,
181
185
  contentLabel,
@@ -194,6 +198,7 @@ function WorkspacePreviewBody({
194
198
  targetColumn,
195
199
  targetLine,
196
200
  }: {
201
+ fileKey: string;
197
202
  contentUrl: string | null;
198
203
  contentUrlKind: WorkspaceFileContentKind | null;
199
204
  contentLabel: string;
@@ -272,7 +277,7 @@ function WorkspacePreviewBody({
272
277
  }
273
278
 
274
279
  if (previewBlock) {
275
- return <WorkspaceCodeSurface block={previewBlock} targetColumn={targetColumn} targetLine={targetLine} />;
280
+ return <WorkspaceCodeSurface block={previewBlock} restorationKey={`workspace-preview:source:${fileKey}`} targetColumn={targetColumn} targetLine={targetLine} />;
276
281
  }
277
282
 
278
283
  return <WorkspaceFilePreviewStatus text={t('chatWorkspacePreviewEmpty')} />;
@@ -304,7 +309,7 @@ export function ChatSessionWorkspaceFilePreview({
304
309
  const markdownScrollRef = useRef<HTMLDivElement>(null);
305
310
  const isPreviewMode = file.viewMode === 'preview';
306
311
  const suppliedContentUrl = file.contentUrl?.trim() || null;
307
- const usesServerPath = isPreviewMode && !suppliedContentUrl;
312
+ const usesServerPath = isPreviewMode && !suppliedContentUrl && file.rawText == null;
308
313
  const previewQuery = useServerPathRead({
309
314
  path: file.path,
310
315
  basePath: sessionWorkingDir,
@@ -338,6 +343,7 @@ export function ChatSessionWorkspaceFilePreview({
338
343
  const localContentUrlCandidate = buildServerPathContentUrl(file.path, sessionWorkingDir);
339
344
  const shouldRenderLocalContent = Boolean(
340
345
  !suppliedContentUrl &&
346
+ file.rawText == null &&
341
347
  isPreviewMode &&
342
348
  localContentUrlCandidate &&
343
349
  file.previewViewer !== 'source' &&
@@ -400,6 +406,7 @@ export function ChatSessionWorkspaceFilePreview({
400
406
  );
401
407
  const previewBody = (
402
408
  <WorkspacePreviewBody
409
+ fileKey={file.key}
403
410
  contentUrl={contentUrl}
404
411
  contentUrlKind={contentUrlKind}
405
412
  contentLabel={file.label?.trim() || resolvedPath}
@@ -445,7 +452,7 @@ export function ChatSessionWorkspaceFilePreview({
445
452
 
446
453
  <div className="flex-1 min-h-0 overflow-hidden">
447
454
  {file.viewMode === 'diff' ? (
448
- <WorkspaceDiffBody diffBlock={diffBlock} />
455
+ <WorkspaceDiffBody diffBlock={diffBlock} fileKey={file.key} />
449
456
  ) : excerptPath && previewText ? (
450
457
  <WorkspaceTextSelectionMenu
451
458
  fileLabel={file.label?.trim() || excerptPath.split('/').at(-1) || excerptPath}
@@ -17,6 +17,7 @@ import { ChatSessionWorkspaceFilePreview } from '@/features/chat/features/worksp
17
17
  import { ChatSessionWorkspaceDirectoryBrowser } from '@/features/chat/features/workspace/components/chat-session-workspace-directory-browser';
18
18
  import { SessionCronJobContent } from '@/features/chat/features/workspace/components/session-cron-job-content';
19
19
  import { ChatSessionChildSessions } from '@/features/chat/features/workspace/components/child-sessions/chat-session-child-sessions';
20
+ import { SessionRunBadge } from '@/features/chat/features/session/components/session-run-badge';
20
21
  import { ChatSessionTokenUsage } from '@/features/chat/features/workspace/components/overview/chat-session-token-usage';
21
22
  import { ChatSessionContinuousAttention } from '@/features/chat/features/workspace/components/overview/chat-session-continuous-attention';
22
23
  import { useNcpSessionObservations } from '@/features/chat/features/ncp/hooks/use-ncp-session-queries';
@@ -32,6 +33,7 @@ import { t } from '@/shared/lib/i18n';
32
33
  import { resolveWorkspaceRelativePath } from '@/shared/lib/session-project';
33
34
  import { cn } from '@/shared/lib/utils';
34
35
  import { IconActionButton } from '@/shared/components/ui/actions/icon-action-button';
36
+ import type { SessionRunStatus } from '@/features/chat/types/session-run-status.types';
35
37
 
36
38
  type ChatSessionWorkspacePanelContentProps = {
37
39
  activeSelection: WorkspaceSelection;
@@ -51,12 +53,14 @@ function WorkspaceOverviewEntry({
51
53
  description,
52
54
  icon,
53
55
  onClick,
56
+ runStatus,
54
57
  title,
55
58
  }: {
56
59
  count?: number;
57
60
  description: string;
58
61
  icon: ReactNode;
59
62
  onClick: () => void;
63
+ runStatus?: SessionRunStatus;
60
64
  title: string;
61
65
  }) {
62
66
  return (
@@ -76,6 +80,7 @@ function WorkspaceOverviewEntry({
76
80
  {count}
77
81
  </span>
78
82
  ) : null}
83
+ {runStatus ? <SessionRunBadge status={runStatus} /> : null}
79
84
  </span>
80
85
  <span className="mt-0.5 block text-xs leading-5 text-gray-500">{description}</span>
81
86
  </span>
@@ -117,6 +122,7 @@ function WorkspaceOverview({
117
122
  count={childSessionTabs.length}
118
123
  description={t('chatWorkspaceChildSessionsDescription')}
119
124
  icon={<GitBranch className="h-4 w-4" />}
125
+ runStatus={childSessionTabs.some((tab) => tab.runStatus === 'running') ? 'running' : undefined}
120
126
  title={t('chatWorkspaceChildSessions')}
121
127
  onClick={() => {
122
128
  if (sessionKey) {
@@ -8,15 +8,16 @@ import {
8
8
  FolderTree,
9
9
  GitBranch,
10
10
  LayoutDashboard,
11
- Maximize2,
12
11
  MessageSquarePlus,
13
12
  MessageSquareText,
14
- Minimize2,
15
13
  RefreshCw,
14
+ PanelRight,
15
+ PictureInPicture2,
16
16
  X,
17
17
  } from "lucide-react";
18
18
  import type { WorkspaceTabViewModel } from "@/features/chat/features/workspace/utils/chat-workspace-panel-view-model.utils";
19
19
  import { copySessionId } from "@/features/chat/features/session/components/session-header/chat-session-more-actions-menu";
20
+ import { SessionRunBadge } from "@/features/chat/features/session/components/session-run-badge";
20
21
  import { AgentIdentityAvatar } from "@/shared/components/common/agent-identity";
21
22
  import { FileTypeIcon } from "@/shared/components/file-type-icon";
22
23
  import {
@@ -104,7 +105,7 @@ function buildWorkspaceFileMenuGroups(
104
105
  ? [{
105
106
  key: "close",
106
107
  icon: <X className="h-4 w-4" />,
107
- label: t("chatWorkspaceCloseFile"),
108
+ label: t("workbenchCloseTab"),
108
109
  onSelect: tab.onClose,
109
110
  }]
110
111
  : [];
@@ -153,7 +154,9 @@ function buildCompactWorkspaceTabs(
153
154
  fileName={tab.fileName}
154
155
  />
155
156
  ),
156
- badge: tab.kind === "file" && tab.viewMode === "diff" ? (
157
+ badge: tab.runStatus ? (
158
+ <SessionRunBadge status={tab.runStatus} />
159
+ ) : tab.kind === "file" && tab.viewMode === "diff" ? (
157
160
  <span className="shrink-0 rounded border border-amber-200 bg-amber-50 px-1 py-0 text-[9px] font-medium uppercase tracking-[0.08em] text-amber-700">
158
161
  {t("chatWorkspaceDiff")}
159
162
  </span>
@@ -162,41 +165,39 @@ function buildCompactWorkspaceTabs(
162
165
  closeLabel: `${
163
166
  tab.kind === "file"
164
167
  ? t("chatWorkspaceCloseFile")
165
- : t("chatWorkspaceCloseTab")
168
+ : t("workbenchCloseTab")
166
169
  }: ${tab.title}`,
167
170
  closePlacement: "leading-hover",
168
171
  onSelect: tab.onSelect,
169
172
  onClose: tab.onClose,
170
- menuLabel:
171
- tab.kind === "child-session"
172
- ? t("chatSessionMoreActions")
173
- : t("chatWorkspaceFileMoreActions"),
174
- menuGroups:
175
- tab.menuGroups ??
176
- buildWorkspaceSessionMenuGroups(tab) ??
177
- buildWorkspaceFileMenuGroups(tab),
173
+ menuLabel: `${t('pageActions')}: ${tab.title}`,
174
+ menuGroups: [
175
+ ...(tab.menuGroups ?? []),
176
+ ...(buildWorkspaceSessionMenuGroups(tab) ?? buildWorkspaceFileMenuGroups(tab) ?? []).map((group) => ({
177
+ ...group,
178
+ items: group.items.filter((item) => !tab.menuGroups?.some((shared) => shared.items.some((action) => action.key === item.key))),
179
+ })).filter((group) => group.items.length > 0),
180
+ { key: 'placement', items: [
181
+ ...(tab.onMoveGlobal ? [{ key: 'move-global', label: t('workbenchMoveGlobal'), icon: <PanelRight className="h-4 w-4" />, onSelect: tab.onMoveGlobal }] : []),
182
+ ...(tab.onFloat ? [{ key: 'float', label: t('workbenchFloatView'), icon: <PictureInPicture2 className="h-4 w-4" />, onSelect: tab.onFloat }] : []),
183
+ ] },
184
+ ],
178
185
  }));
179
186
  }
180
187
 
181
188
  export function WorkspaceTabsBar({
182
189
  canGoBack,
183
190
  canGoForward,
184
- isMaximized = false,
185
- onClose,
186
191
  onGoBack,
187
192
  onGoForward,
188
193
  onRefreshFile,
189
- onToggleMaximize,
190
194
  tabs,
191
195
  }: {
192
196
  canGoBack: boolean;
193
197
  canGoForward: boolean;
194
- isMaximized?: boolean;
195
- onClose: () => void;
196
198
  onGoBack: () => void;
197
199
  onGoForward: () => void;
198
200
  onRefreshFile?: () => void;
199
- onToggleMaximize?: () => void;
200
201
  tabs: readonly WorkspaceTabViewModel[];
201
202
  }) {
202
203
  const compactTabs = buildCompactWorkspaceTabs(tabs);
@@ -213,27 +214,11 @@ export function WorkspaceTabsBar({
213
214
  },
214
215
  ]
215
216
  : []),
216
- ...(onToggleMaximize
217
- ? [
218
- {
219
- key: "maximize",
220
- icon: isMaximized ? (
221
- <Minimize2 className="h-4 w-4" />
222
- ) : (
223
- <Maximize2 className="h-4 w-4" />
224
- ),
225
- label: isMaximized
226
- ? t("chatWorkspaceRestorePanel")
227
- : t("chatWorkspaceMaximizePanel"),
228
- onClick: onToggleMaximize,
229
- },
230
- ]
231
- : []),
232
- { key: "close", icon: <X className="h-4 w-4" />, label: t("chatWorkspaceClosePanel"), onClick: onClose },
233
217
  ];
234
218
 
235
219
  return (
236
220
  <CompactTabStrip
221
+ className="h-10 min-w-0 flex-1 border-0 bg-transparent px-0"
237
222
  testId="workspace-tabs-bar"
238
223
  scrollTestId="workspace-tabs-scroll"
239
224
  tabs={compactTabs}
@@ -1,3 +1,8 @@
1
+ import { usePageResourceActions } from '@/features/right-panel-resources';
2
+ import { pageResourceFromTarget } from '@/features/right-panel-resources';
3
+ import { createWorkspaceFilePanelTarget } from '@/features/chat/features/workspace/utils/workspace-file-panel-route.utils';
4
+ import { buildSessionPanelUrl } from '@/features/chat/features/session/utils/chat-session-route.utils';
5
+ import { sessionSurfaceManager } from '@/features/chat/managers/session-surface.manager';
1
6
  import { useEffect, useMemo, useState } from "react";
2
7
  import { useQueryClient } from "@tanstack/react-query";
3
8
  import type { CronJobView } from "@/shared/lib/api";
@@ -23,8 +28,9 @@ import {
23
28
  import { WorkspaceTabsBar } from "./chat-session-workspace-panel-nav";
24
29
  import { usePresenter } from "@/features/chat/components/providers/chat-presenter.provider";
25
30
  import { ChatSessionWorkspacePanelContent } from "@/features/chat/features/workspace/components/chat-session-workspace-panel-content";
26
- import { ResizableRightPanel } from "@/shared/components/resizable-right-panel/resizable-right-panel";
27
- import { cn } from "@/shared/lib/utils";
31
+ import { WorkbenchSurface } from "@/shared/components/workbench/workbench-surface";
32
+ import { getAppPresenter } from "@/app/presenters/app.presenter";
33
+ import { t } from "@/shared/lib/i18n";
28
34
  import {
29
35
  canGoBackInNavigationHistory,
30
36
  canGoForwardInNavigationHistory,
@@ -34,6 +40,7 @@ import { buildServerPathReadQueryKey } from "@/shared/hooks/use-server-path-read
34
40
 
35
41
  type ChatSessionWorkspacePanelProps = {
36
42
  sessionKey: string | null;
43
+ hidden?: boolean;
37
44
  childSessionTabs: readonly ChatChildSessionTab[];
38
45
  activeChildSessionKey: string | null;
39
46
  activeSideChatDraft: ChatWorkspaceSideChatDraft | null;
@@ -55,6 +62,7 @@ type ChatSessionWorkspacePanelProps = {
55
62
 
56
63
  export function ChatSessionWorkspacePanel({
57
64
  sessionKey,
65
+ hidden = false,
58
66
  childSessionTabs,
59
67
  activeChildSessionKey,
60
68
  activeSideChatDraft,
@@ -74,8 +82,8 @@ export function ChatSessionWorkspacePanel({
74
82
  displayMode = "docked",
75
83
  }: ChatSessionWorkspacePanelProps) {
76
84
  const presenter = usePresenter();
85
+ const pageActions = usePageResourceActions();
77
86
  const queryClient = useQueryClient();
78
- const [isMaximized, setIsMaximized] = useState(false);
79
87
  const [filePreviewRefreshVersion, setFilePreviewRefreshVersion] = useState(0);
80
88
  const resolvedChildTabs = useNcpChildSessionTabsView(childSessionTabs);
81
89
  const optimisticReadAtBySessionKey = useChatSessionListStore(
@@ -159,8 +167,6 @@ export function ChatSessionWorkspacePanel({
159
167
  return null;
160
168
  }
161
169
 
162
- const isContainerMaximized = displayMode === "docked" && isMaximized;
163
- const isOverlayPanel = displayMode === "overlay" || isContainerMaximized;
164
170
  const activeFile =
165
171
  activeSelection.kind === "file" && activeSelection.file.viewMode === "preview"
166
172
  ? activeSelection.file
@@ -185,40 +191,43 @@ export function ChatSessionWorkspacePanel({
185
191
  : undefined;
186
192
 
187
193
  return (
188
- <ResizableRightPanel
189
- data-testid="chat-session-workspace-panel"
190
- data-theme-surface="workspace-panel"
191
- className={cn(
192
- isOverlayPanel
193
- ? "bg-white"
194
- : "hidden border-gray-200/70 bg-white/95 backdrop-blur-sm md:flex",
195
- isContainerMaximized ? "shadow-xl" : null,
196
- )}
197
- defaultWidth={workspacePanelWidth}
198
- width={workspacePanelWidth}
199
- minWidth={CHAT_WORKSPACE_PANEL_MIN_WIDTH}
200
- maxWidth={CHAT_WORKSPACE_PANEL_MAX_WIDTH}
194
+ <WorkbenchSurface
195
+ id={`session-workspace:${sessionKey ?? 'draft'}`} manager={getAppPresenter().workbenchSurfaceManager}
196
+ title={t('workbenchSessionGroup')} testId="chat-session-workspace-panel" hidden={hidden}
197
+ width={workspacePanelWidth} minWidth={CHAT_WORKSPACE_PANEL_MIN_WIDTH} maxWidth={CHAT_WORKSPACE_PANEL_MAX_WIDTH}
201
198
  onWidthCommit={presenter.chatThreadManager.setWorkspacePanelWidth}
202
- overlay={isOverlayPanel}
203
- overlayScope={isContainerMaximized ? "container" : "viewport"}
204
- >
199
+ fullscreen={displayMode === "overlay"} onClose={presenter.chatThreadManager.closeWorkspacePanel} closeLabel={t('workbenchHideGroup')}
200
+ navigation={
205
201
  <WorkspaceTabsBar
206
- tabs={workspaceTabs}
202
+ tabs={workspaceTabs.map((tab) => ({
203
+ ...tab,
204
+ menuGroups: (() => {
205
+ const file = workspaceFileTabs.find((item) => `file:${item.key}` === tab.key);
206
+ const target = file ? createWorkspaceFilePanelTarget(file, { workingDir: sessionWorkingDir, projectRoot: sessionProjectRoot })
207
+ : tab.sessionKey ? { kind: 'chat-session', title: tab.title, url: buildSessionPanelUrl(tab.sessionKey), resourceUri: buildSessionPanelUrl(tab.sessionKey), historyPolicy: 'none' as const } : tab.kind !== 'side-chat-draft' ? { kind: 'workspace', title: tab.title, url: `nextclaw://workspace?${new URLSearchParams({ session: sessionKey ?? '', page: tab.kind })}`, historyPolicy: 'none' as const } : null;
208
+ return target ? [...(tab.menuGroups ?? []), ...pageActions(pageResourceFromTarget(target), 'workspace')] : tab.menuGroups;
209
+ })(),
210
+ onMoveGlobal: tab.kind === 'file' ? () => presenter.chatThreadManager.moveFileToGlobal(tab.key.slice('file:'.length), { workingDir: sessionWorkingDir, projectRoot: sessionProjectRoot }, getAppPresenter().docBrowserManager)
211
+ : tab.kind === 'child-session' && tab.sessionKey ? () => {
212
+ sessionSurfaceManager.dock({ sessionKey: tab.sessionKey!, title: tab.title }, getAppPresenter().docBrowserManager);
213
+ tab.onClose?.();
214
+ } : undefined,
215
+ onFloat: tab.kind === 'child-session' && tab.sessionKey ? () => {
216
+ sessionSurfaceManager.open({ sessionKey: tab.sessionKey!, title: tab.title });
217
+ tab.onClose?.();
218
+ } : undefined,
219
+ }))}
207
220
  canGoBack={canGoBackInNavigationHistory(workspaceHistory)}
208
221
  canGoForward={canGoForwardInNavigationHistory(workspaceHistory)}
209
- isMaximized={isContainerMaximized}
210
222
  onGoBack={presenter.chatThreadManager.goBackWorkspacePanel}
211
223
  onGoForward={presenter.chatThreadManager.goForwardWorkspacePanel}
212
224
  onRefreshFile={refreshActiveFile}
213
- onToggleMaximize={
214
- displayMode === "docked"
215
- ? () => setIsMaximized((value) => !value)
216
- : undefined
217
- }
218
- onClose={presenter.chatThreadManager.closeWorkspacePanel}
225
+
219
226
  />
227
+ }
228
+ >
220
229
 
221
- <div className="flex min-h-0 flex-1 flex-col bg-white">
230
+ <div className="flex min-h-0 flex-1 flex-col bg-card">
222
231
  <ChatSessionWorkspacePanelContent
223
232
  activeSelection={activeSelection}
224
233
  childSessionTabs={resolvedChildTabs}
@@ -232,6 +241,6 @@ export function ChatSessionWorkspacePanel({
232
241
  sessionWorkingDir={sessionWorkingDir}
233
242
  />
234
243
  </div>
235
- </ResizableRightPanel>
244
+ </WorkbenchSurface>
236
245
  );
237
246
  }
@@ -2,6 +2,7 @@ import { ChevronRight, GitBranch, MessageSquarePlus } from 'lucide-react';
2
2
 
3
3
  import { usePresenter } from '@/features/chat/components/providers/chat-presenter.provider';
4
4
  import type { ResolvedChildSessionTab } from '@/features/chat/features/ncp/hooks/use-ncp-child-session-tabs-view';
5
+ import { SessionRunBadge } from '@/features/chat/features/session/components/session-run-badge';
5
6
  import { ChatSessionMoreActionsMenu } from '@/features/chat/features/session/components/session-header/chat-session-more-actions-menu';
6
7
  import { t } from '@/shared/lib/i18n';
7
8
 
@@ -52,7 +53,10 @@ export function ChatSessionChildSessions({
52
53
  <GitBranch className="h-4 w-4" />
53
54
  </span>
54
55
  <span className="min-w-0 flex-1">
55
- <span className="block truncate text-sm font-medium text-gray-900">{tab.title}</span>
56
+ <span className="flex min-w-0 items-center gap-1.5 text-sm font-medium text-gray-900">
57
+ <span className="truncate">{tab.title}</span>
58
+ {tab.runStatus ? <SessionRunBadge status={tab.runStatus} /> : null}
59
+ </span>
56
60
  {tab.projectName || tab.sessionTypeLabel ? (
57
61
  <span className="mt-0.5 block truncate text-xs text-gray-500">
58
62
  {[tab.sessionTypeLabel, tab.projectName].filter(Boolean).join(' · ')}
@@ -63,6 +67,7 @@ export function ChatSessionChildSessions({
63
67
  </button>
64
68
  <ChatSessionMoreActionsMenu
65
69
  sessionKey={tab.sessionKey}
70
+ sessionTitle={tab.title}
66
71
  triggerSize="sm"
67
72
  triggerTone="strong"
68
73
  className="absolute right-2 top-1/2 -translate-y-1/2 bg-white opacity-100 md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100"
@@ -6,7 +6,7 @@ import {
6
6
  Check,
7
7
  Folder,
8
8
  FolderOpen,
9
- MoreHorizontal,
9
+ MoreVertical,
10
10
  X,
11
11
  } from 'lucide-react';
12
12
  import type {
@@ -429,7 +429,7 @@ export function WorkspaceDirectoryTreeEntry({
429
429
  <ContextMenuTrigger>
430
430
  <IconActionButton
431
431
  className="mr-1 opacity-0 pointer-events-none group-hover:pointer-events-auto group-hover:opacity-100 group-focus-within:pointer-events-auto group-focus-within:opacity-100 data-[context-menu-open]:pointer-events-auto data-[context-menu-open]:opacity-100"
432
- icon={<MoreHorizontal className="h-3.5 w-3.5" />}
432
+ icon={<MoreVertical className="h-3.5 w-3.5" />}
433
433
  label={t('chatWorkspaceMoreActionsFor').replace('{name}', entry.name)}
434
434
  size="sm"
435
435
  tooltipSide="left"
@@ -1,4 +1,4 @@
1
- import { ChevronsUp, FilePlus2, FolderPlus, MoreHorizontal, RefreshCw } from 'lucide-react';
1
+ import { ChevronsUp, FilePlus2, FolderPlus, MoreVertical, RefreshCw } from 'lucide-react';
2
2
  import { IconActionButton } from '@/shared/components/ui/actions/icon-action-button';
3
3
  import { ContextMenuTrigger } from '@/shared/components/ui/context-menu/context-menu';
4
4
  import { t } from '@/shared/lib/i18n';
@@ -54,7 +54,7 @@ export function WorkspaceProjectFilesToolbar({
54
54
  />
55
55
  <ContextMenuTrigger>
56
56
  <IconActionButton
57
- icon={<MoreHorizontal className="h-4 w-4" />}
57
+ icon={<MoreVertical className="h-4 w-4" />}
58
58
  label={t('chatWorkspaceRootMoreActions')}
59
59
  size="sm"
60
60
  />
@@ -257,6 +257,33 @@ describe("fixed workspace tabs", () => {
257
257
  });
258
258
  });
259
259
 
260
+ it("projects child running state onto both the collection and child tabs", () => {
261
+ const tabs = buildWorkspaceTabsViewModel({
262
+ hasSession: true,
263
+ resolvedChildTabs: [
264
+ createChildTab({ runStatus: "running" }),
265
+ createChildTab({ sessionKey: "child-2" }),
266
+ ],
267
+ activeSideChatDraft: null,
268
+ closedWorkspaceTabEntries: [],
269
+ workspaceFileTabs: [],
270
+ activeSelection: { kind: "overview" },
271
+ optimisticReadAtBySessionKey: {},
272
+ onSelectSession: vi.fn(),
273
+ onSelectFile: vi.fn(),
274
+ onOpenFileViewer: vi.fn(),
275
+ onCloseTab: vi.fn(),
276
+ onSelectOverview: vi.fn(),
277
+ onSelectChildSessions: vi.fn(),
278
+ onSelectProjectFiles: vi.fn(),
279
+ onSelectCronJobs: vi.fn(),
280
+ });
281
+
282
+ expect(tabs.find((tab) => tab.kind === "child-sessions")?.runStatus).toBe("running");
283
+ expect(tabs.find((tab) => tab.key === "child:child-1")?.runStatus).toBe("running");
284
+ expect(tabs.find((tab) => tab.key === "child:child-2")?.runStatus).toBeUndefined();
285
+ });
286
+
260
287
  describe("buildWorkspaceTabsViewModel", () => {
261
288
  beforeEach(() => setLanguage("en"));
262
289
 
@@ -0,0 +1,94 @@
1
+ import { expect, it } from "vitest";
2
+ import {
3
+ createWorkspaceFilePanelTarget,
4
+ readWorkspaceFilePanelView,
5
+ resolveFileResourceTarget,
6
+ } from "@/features/chat/features/workspace/utils/workspace-file-panel-route.utils";
7
+ import { DocBrowserManager } from "@/shared/components/doc-browser/managers/doc-browser.manager";
8
+ import { WorkbenchSurfaceManager } from "@/shared/components/workbench/managers/workbench-surface.manager";
9
+ import { useDocBrowserStore } from "@/shared/components/doc-browser/stores/doc-browser.store";
10
+ import { RightPanelResourceRouteResolver } from "@/features/right-panel-resources";
11
+
12
+ it("carries source context and diff data through global open, dedupe and reload", async () => {
13
+ const file = {
14
+ key: "source::diff::src/a.ts",
15
+ parentSessionKey: "source",
16
+ path: "src/a.ts",
17
+ viewMode: "diff" as const,
18
+ fullLines: [
19
+ { kind: "add" as const, text: "const result = 1;", newLineNumber: 1 },
20
+ ],
21
+ };
22
+ const target = createWorkspaceFilePanelTarget(file, {
23
+ workingDir: "/project/a",
24
+ projectRoot: "/project",
25
+ });
26
+ const manager = new DocBrowserManager(
27
+ new WorkbenchSurfaceManager(),
28
+ new RightPanelResourceRouteResolver(),
29
+ );
30
+ manager.openTarget(target, { newTab: true, placement: "docked" });
31
+ const before = useDocBrowserStore.getState().snapshot;
32
+ manager.openTarget(target, { newTab: true });
33
+ expect(useDocBrowserStore.getState().snapshot.tabs.length).toBe(
34
+ before.tabs.length,
35
+ );
36
+ await useDocBrowserStore.persist.rehydrate();
37
+ const state = useDocBrowserStore.getState().snapshot;
38
+ const restored = readWorkspaceFilePanelView(
39
+ state.tabs.find((tab) => tab.id === state.activeTabId)!,
40
+ );
41
+ expect(restored).toMatchObject({
42
+ workingDir: "/project/a",
43
+ projectRoot: "/project",
44
+ file,
45
+ });
46
+ expect(target.url).not.toContain("const result");
47
+ });
48
+
49
+ it("resolves native file URIs using the source context and preserves precise location", () => {
50
+ const target = resolveFileResourceTarget(
51
+ "nextclaw://file/workspace/docs/readme.md?view=source&line=12&column=3",
52
+ { workingDir: "/source-project", sessionKey: "source" },
53
+ )!;
54
+ expect(target.viewState).toMatchObject({
55
+ workingDir: "/source-project",
56
+ file: {
57
+ path: "docs/readme.md",
58
+ line: 12,
59
+ column: 3,
60
+ previewViewer: "source",
61
+ parentSessionKey: "source",
62
+ },
63
+ });
64
+ const restored = readWorkspaceFilePanelView({
65
+ ...target,
66
+ currentUrl: target.url,
67
+ } as never);
68
+ expect(restored?.file.line).toBe(12);
69
+ expect(
70
+ resolveFileResourceTarget("nextclaw://file/workspace/docs/a.md"),
71
+ ).toBeNull();
72
+ expect(
73
+ resolveFileResourceTarget(
74
+ "nextclaw://file/workspace/docs/a.md?base=%2Fexplicit",
75
+ { workingDir: "/other" },
76
+ )?.viewState,
77
+ ).toMatchObject({ workingDir: "/explicit" });
78
+ expect(
79
+ resolveFileResourceTarget("nextclaw://file/absolute/tmp/a.md")?.viewState,
80
+ ).toMatchObject({ workingDir: null, file: { path: "/tmp/a.md" } });
81
+ });
82
+
83
+ it("rejects traversal and malformed file scopes without changing resource identity", () => {
84
+ for (const uri of [
85
+ "nextclaw://file/unknown/a.md",
86
+ "nextclaw://file/workspace/%2e%2e%2fprivate",
87
+ "nextclaw://file/workspace/a%5Cb",
88
+ "nextclaw://file/workspace/",
89
+ ]) {
90
+ expect(
91
+ resolveFileResourceTarget(uri, { workingDir: "/source" }),
92
+ ).toBeNull();
93
+ }
94
+ });
@@ -70,6 +70,7 @@ export function normalizePersistedWorkspaceFileTab(
70
70
  patchText: normalizeOptionalText(value.patchText),
71
71
  oldStartLine: normalizeOptionalNumber(value.oldStartLine),
72
72
  newStartLine: normalizeOptionalNumber(value.newStartLine),
73
+ fullLines: Array.isArray(value.fullLines) ? value.fullLines.filter((line) => line && ['context', 'add', 'remove'].includes(line.kind) && typeof line.text === 'string' && (line.oldLineNumber === undefined || Number.isFinite(line.oldLineNumber)) && (line.newLineNumber === undefined || Number.isFinite(line.newLineNumber))) : undefined,
73
74
  };
74
75
  }
75
76
 
@@ -94,6 +95,7 @@ export function toPersistedWorkspaceFileTab(
94
95
  patchText: tab.patchText,
95
96
  oldStartLine: tab.oldStartLine,
96
97
  newStartLine: tab.newStartLine,
98
+ fullLines: tab.fullLines,
97
99
  };
98
100
  }
99
101
 
@@ -82,3 +82,18 @@ export function reparentWorkspaceFileTab(tab: ChatWorkspaceFileTab, parentSessio
82
82
  parentSessionKey: normalizedParentSessionKey,
83
83
  };
84
84
  }
85
+
86
+ export function createWorkspaceFileViewerTab(sourceTab: ChatWorkspaceFileTab, viewer: 'source' | 'rendered'): ChatWorkspaceFileTab | null {
87
+ return createWorkspaceFileTab({
88
+ path: sourceTab.path,
89
+ label: sourceTab.label ?? undefined,
90
+ viewMode: 'preview',
91
+ previewViewer: viewer,
92
+ line: sourceTab.line ?? undefined,
93
+ column: sourceTab.column ?? undefined,
94
+ params: sourceTab.params ?? undefined,
95
+ rawText: sourceTab.rawText ?? undefined,
96
+ contentUrl: sourceTab.contentUrl ?? undefined,
97
+ mimeType: sourceTab.mimeType ?? undefined,
98
+ }, sourceTab.parentSessionKey);
99
+ }