@nextclaw/ui 0.15.24 → 0.15.26

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 (312) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/assets/{abnfDiagram-VRR7QNED-DvTjgVMf.js → abnfDiagram-VRR7QNED-BcFJp_1X.js} +1 -1
  3. package/dist/assets/{aiden0z-pptx-renderer.es-C1nfBAXR.js → aiden0z-pptx-renderer.es-Dp2ezlQn.js} +1 -1
  4. package/dist/assets/{api-BxPNDp30.js → api-CK3Fro7z.js} +6 -6
  5. package/dist/assets/appearance-settings-page-zqwWO8Dy.js +1 -0
  6. package/dist/assets/{arc-BvhODBXv.js → arc-CkgyPMyW.js} +1 -1
  7. package/dist/assets/architecture-TIHT7OUA-DO2x53FK.js +1 -0
  8. package/dist/assets/{architectureDiagram-ZJ3FMSHR-BKO9RgNS.js → architectureDiagram-ZJ3FMSHR-CMd4cIjI.js} +1 -1
  9. package/dist/assets/{blockDiagram-677ZJIJ3-DHpDXy7D.js → blockDiagram-677ZJIJ3-Bz3tbhet.js} +1 -1
  10. package/dist/assets/{c4Diagram-LMCZKHZV-BG_iQnDr.js → c4Diagram-LMCZKHZV-D9hFNAGv.js} +1 -1
  11. package/dist/assets/channel-nBvMaVyP.js +1 -0
  12. package/dist/assets/{channels-list-page-DRaNWAxC.js → channels-list-page-CVCZBlCL.js} +2 -2
  13. package/dist/assets/chat-page-D4wehRTz.js +1 -0
  14. package/dist/assets/chunk-2Q5K7J3B-CJgqFDS4.js +1 -0
  15. package/dist/assets/{chunk-32BRIVSS-DR9M0LLx.js → chunk-32BRIVSS-7NrjEITq.js} +1 -1
  16. package/dist/assets/{chunk-52WLFC77-698iC3BB.js → chunk-52WLFC77-viIcqj9q.js} +1 -1
  17. package/dist/assets/{chunk-5FCAYU7R-DikTj9Ey.js → chunk-5FCAYU7R-Vsu4J-VM.js} +1 -1
  18. package/dist/assets/{chunk-5HE753X5-ko0o7_q0.js → chunk-5HE753X5-C-w6CQZK.js} +1 -1
  19. package/dist/assets/{chunk-5JV3BV7I-CEHufhgo.js → chunk-5JV3BV7I-CuKgJQ4W.js} +1 -1
  20. package/dist/assets/{chunk-5TONJI2A-CGgno1cu.js → chunk-5TONJI2A-CYeiWZKb.js} +1 -1
  21. package/dist/assets/{chunk-5VM5RSS4-DkiB4cUQ.js → chunk-5VM5RSS4-DRCbfwIn.js} +1 -1
  22. package/dist/assets/{chunk-7BUUIJ7U-DzptcytQ.js → chunk-7BUUIJ7U-BvydOcm3.js} +1 -1
  23. package/dist/assets/{chunk-BIQX33UG-DMRSQJvT.js → chunk-BIQX33UG-RlppOXKo.js} +1 -1
  24. package/dist/assets/{chunk-C7G6YPKG-Bw1BwwuY.js → chunk-C7G6YPKG-DAizzYwr.js} +1 -1
  25. package/dist/assets/{chunk-CQNSW5MT-C0z6eHBk.js → chunk-CQNSW5MT-5eChJHca.js} +1 -1
  26. package/dist/assets/{chunk-CYSBUYHQ-ByPyAouO.js → chunk-CYSBUYHQ-YHPr53fv.js} +1 -1
  27. package/dist/assets/{chunk-EMLP6XTP-CJlAXWZg.js → chunk-EMLP6XTP-CK4D7Hz5.js} +1 -1
  28. package/dist/assets/{chunk-EX3LRPZG-Dqq4zKJu.js → chunk-EX3LRPZG-BmlDFIRW.js} +1 -1
  29. package/dist/assets/{chunk-FWX5IMBZ-B0SNoCmi.js → chunk-FWX5IMBZ-D0ksHZZ9.js} +2 -2
  30. package/dist/assets/{chunk-HOUHSVGY-DG_GJih_.js → chunk-HOUHSVGY-DPkq8FCm.js} +1 -1
  31. package/dist/assets/{chunk-ICXQ74PX-Drxk_6bE.js → chunk-ICXQ74PX-FAatv5fC.js} +1 -1
  32. package/dist/assets/{chunk-JG7HCLWE-DdLFPpnd.js → chunk-JG7HCLWE-DLkIi4F7.js} +1 -1
  33. package/dist/assets/{chunk-JWPE2WC7-B8M4G76F.js → chunk-JWPE2WC7-DawOjNE3.js} +1 -1
  34. package/dist/assets/{chunk-MOJQB5TN-XP6FJHY_.js → chunk-MOJQB5TN-Di52TorW.js} +1 -1
  35. package/dist/assets/{chunk-MOZMSUNE-C_6x18Qw.js → chunk-MOZMSUNE-PfyK9w1-.js} +1 -1
  36. package/dist/assets/{chunk-OGEWGWER-N25BzCmG.js → chunk-OGEWGWER-C3jdH3Ty.js} +1 -1
  37. package/dist/assets/{chunk-OSBZ3O6U-ASDEm7y0.js → chunk-OSBZ3O6U-CecHo-f0.js} +1 -1
  38. package/dist/assets/{chunk-PUDLZKDR-CTlvAcn7.js → chunk-PUDLZKDR-f3IJh3sN.js} +1 -1
  39. package/dist/assets/{chunk-Q4XR5HBZ-Da9BWfB6.js → chunk-Q4XR5HBZ-DQFeUPxZ.js} +1 -1
  40. package/dist/assets/{chunk-QBLGF6JB-Bi6RpTJO.js → chunk-QBLGF6JB-BhUeG0y2.js} +1 -1
  41. package/dist/assets/{chunk-R7FJI6CG-DkMsSPvK.js → chunk-R7FJI6CG-C3XpZ-2u.js} +1 -1
  42. package/dist/assets/{chunk-RYQCIY6F-DZp0eU-j.js → chunk-RYQCIY6F-CAqa5klQ.js} +1 -1
  43. package/dist/assets/{chunk-U6XO7XAA-vfinDSrj.js → chunk-U6XO7XAA-D_WXezeD.js} +1 -1
  44. package/dist/assets/{chunk-V7JOEXUC-C9Nksccs.js → chunk-V7JOEXUC-CZ70oOtp.js} +1 -1
  45. package/dist/assets/chunk-VAUOI2AC-BGvh3yIx.js +1 -0
  46. package/dist/assets/{chunk-VR4S4FIN-Xv6zfwXs.js → chunk-VR4S4FIN-B7AHEYYk.js} +1 -1
  47. package/dist/assets/{chunk-WYO6CB5R-mOJNzbWl.js → chunk-WYO6CB5R-Dn9To_OI.js} +2 -2
  48. package/dist/assets/chunk-XXDRQBXY-DaBxG5gs.js +1 -0
  49. package/dist/assets/{chunk-YOTPTUD7-1-aKSu4o.js → chunk-YOTPTUD7-BYEgRBk3.js} +1 -1
  50. package/dist/assets/{chunk-ZGVPDNZ5-OJ8veMpK.js → chunk-ZGVPDNZ5-C6YtZDU0.js} +1 -1
  51. package/dist/assets/{chunk-ZIRB5QZD-SR_Nq_PP.js → chunk-ZIRB5QZD-DMuYtnHF.js} +1 -1
  52. package/dist/assets/classDiagram-OUVF2IWQ-P6N03G2R.js +1 -0
  53. package/dist/assets/classDiagram-v2-EOCWNBFH-B1_uLvMv.js +1 -0
  54. package/dist/assets/config-split-page-CceNFvlY.js +1 -0
  55. package/dist/assets/confirm-dialog-CWeNYWZY.js +5 -0
  56. package/dist/assets/{cose-bilkent-JH36ORCC-NjVgz2Bw.js → cose-bilkent-JH36ORCC-Bc2Ex5Y3.js} +1 -1
  57. package/dist/assets/cynefin-VYW2F7L2-B-H8Qp-n.js +1 -0
  58. package/dist/assets/{cynefinDiagram-TSTJHNR4-B_17LDqD.js → cynefinDiagram-TSTJHNR4-DVysQoGz.js} +1 -1
  59. package/dist/assets/{dagre-CMe101gk.js → dagre-CMhQ1cAG.js} +1 -1
  60. package/dist/assets/{dagre-VKFMJZFB-qo8nLb3B.js → dagre-VKFMJZFB-RYyWpPJZ.js} +1 -1
  61. package/dist/assets/desktop-update-config-Dirc3bpt.js +1 -0
  62. package/dist/assets/{diagram-FQU43EPY-Ba3XIklC.js → diagram-FQU43EPY-BD6KONdF.js} +1 -1
  63. package/dist/assets/{diagram-G47NLZAW-CG45TcUx.js → diagram-G47NLZAW-CGB2ptRR.js} +1 -1
  64. package/dist/assets/{diagram-NH7WQ7WH-2F2HrwV-.js → diagram-NH7WQ7WH-DnkOI6cU.js} +1 -1
  65. package/dist/assets/{diagram-OA4YK3LP-CXfWH9NZ.js → diagram-OA4YK3LP-DF82RZ7P.js} +1 -1
  66. package/dist/assets/{diagram-WEI45ONY-CH_4yepc.js → diagram-WEI45ONY-Be2v7Ck9.js} +1 -1
  67. package/dist/assets/{dist-B4Pf5X3Q.js → dist-AYxkFx2B.js} +1 -1
  68. package/dist/assets/{dist-DHEWkGWX.js → dist-D9xtGgdL.js} +1 -1
  69. package/dist/assets/doc-browser-4Sud6dWw.js +1 -0
  70. package/dist/assets/doc-browser-D4x_yH5F.js +1 -0
  71. package/dist/assets/doc-browser-context-Cb7Z0j90.js +1 -0
  72. package/dist/assets/{docx-preview-CoM4JK7_.js → docx-preview-BqwAjrj3.js} +1 -1
  73. package/dist/assets/{ebnfDiagram-CCIWWBDH-BwiG4Ea1.js → ebnfDiagram-CCIWWBDH-CP98OYk8.js} +1 -1
  74. package/dist/assets/{erDiagram-Q63AITRT-BML3hpnQ.js → erDiagram-Q63AITRT-ZLlx8xfs.js} +1 -1
  75. package/dist/assets/eventmodeling-45OFAUF4-YVtShyFA.js +1 -0
  76. package/dist/assets/flowDiagram-23GEKE2U-BeKXabVO.js +1 -0
  77. package/dist/assets/form-actions-B2q4jgjE.js +1 -0
  78. package/dist/assets/{ganttDiagram-NO4QXBWP-80enfWbD.js → ganttDiagram-NO4QXBWP-DXCDjHR2.js} +1 -1
  79. package/dist/assets/gitGraph-TEB2WS4Q-jTSiBj-p.js +1 -0
  80. package/dist/assets/{gitGraphDiagram-IHSO6WYX-CVLqXr-b.js → gitGraphDiagram-IHSO6WYX-l2HWrTJp.js} +1 -1
  81. package/dist/assets/index-CdyTsSBu.css +1 -0
  82. package/dist/assets/index-Das_bw2h.js +107 -0
  83. package/dist/assets/info-DKCQHKI2-BIporNWb.js +1 -0
  84. package/dist/assets/{infoDiagram-FWYZ7A6U-Dyvs2t0i.js → infoDiagram-FWYZ7A6U-D-DjX-bn.js} +1 -1
  85. package/dist/assets/{ishikawaDiagram-FXEZZL3T-sSnxDKfh.js → ishikawaDiagram-FXEZZL3T-y_Xy128F.js} +1 -1
  86. package/dist/assets/{journeyDiagram-5HDEW3XC-D22V71Mf.js → journeyDiagram-5HDEW3XC-DJn5xYcQ.js} +1 -1
  87. package/dist/assets/{kanban-definition-HUTT4EX6-D3ds0p-g.js → kanban-definition-HUTT4EX6-DJVIOR21.js} +1 -1
  88. package/dist/assets/{line-CbyFs065.js → line-Cos7PIOj.js} +1 -1
  89. package/dist/assets/{linear-4DKtnZBS.js → linear-BtDLqtzF.js} +1 -1
  90. package/dist/assets/loader-circle-CpmBdaon.js +1 -0
  91. package/dist/assets/{map-CcZzEoz6.js → map-BKnQyvd0.js} +1 -1
  92. package/dist/assets/mcp-marketplace-page-CdOY3Sop.js +1 -0
  93. package/dist/assets/mcp-marketplace-page-DvjrfqEt.js +9 -0
  94. package/dist/assets/{mermaid-parser.core-DPmMOjXD.js → mermaid-parser.core-XUNZhr2W.js} +2 -2
  95. package/dist/assets/{mermaid.core-BSf-ddRa.js → mermaid.core-ySrvolIe.js} +3 -3
  96. package/dist/assets/{mindmap-definition-LN4V7U3C-BUTwWPyx.js → mindmap-definition-LN4V7U3C-BypL9tei.js} +1 -1
  97. package/dist/assets/model-config-page-DfOLyQqR.js +1 -0
  98. package/dist/assets/{navigation-link-CAFOcXNg.js → navigation-link-MiiyoIjH.js} +2 -2
  99. package/dist/assets/{ordinal-BgLYtOZE.js → ordinal-CxxVWxYU.js} +1 -1
  100. package/dist/assets/packet-7NZHBO7P-CuFMADV0.js +1 -0
  101. package/dist/assets/{pegDiagram-2B236MQR-BEu_ZBjc.js → pegDiagram-2B236MQR-D-U2KBGv.js} +1 -1
  102. package/dist/assets/pie-RZYD4A2V-XUeIXhM9.js +1 -0
  103. package/dist/assets/{pieDiagram-ENE6RG2P-CAwAwuBd.js → pieDiagram-ENE6RG2P-CBi3GusJ.js} +1 -1
  104. package/dist/assets/plus-C8FkjpSZ.js +1 -0
  105. package/dist/assets/provider-scoped-model-input-DXzjr5l0.js +1 -0
  106. package/dist/assets/providers-config-page-CaO8WfZH.js +1 -0
  107. package/dist/assets/{quadrantDiagram-ABIIQ3AL-CwE6F-_2.js → quadrantDiagram-ABIIQ3AL-H0ZuvnZL.js} +1 -1
  108. package/dist/assets/radar-I7S5WNFK-D-NNGh1k.js +1 -0
  109. package/dist/assets/railroad-3IZDKUUU-C67_uDaM.js +1 -0
  110. package/dist/assets/railroad-abnf-AHOZXSZD-BZ8Yflnd.js +1 -0
  111. package/dist/assets/railroad-ebnf-EBAXGLYW-B7zO7RoK.js +1 -0
  112. package/dist/assets/railroad-peg-LSFZ7HO6-R63PTgLz.js +1 -0
  113. package/dist/assets/{railroadDiagram-RFXS5EU6-xgLekU3B.js → railroadDiagram-RFXS5EU6-D7Y2EqSd.js} +1 -1
  114. package/dist/assets/react-C8XFFvuz.js +8 -0
  115. package/dist/assets/{refresh-cw-CWDp_JnN.js → refresh-cw-a2VVeeAF.js} +1 -1
  116. package/dist/assets/remote-BJHXa4mB.js +1 -0
  117. package/dist/assets/{requirementDiagram-TGXJPOKE-CyVUzEX5.js → requirementDiagram-TGXJPOKE-BiXNX1NN.js} +1 -1
  118. package/dist/assets/rotate-cw-DJ7UF3F2.js +1 -0
  119. package/dist/assets/runtime-config-page-BuA4A02z.js +1 -0
  120. package/dist/assets/{sankeyDiagram-HTMAVEWB-JK6bFmYB.js → sankeyDiagram-HTMAVEWB-qzDeLztW.js} +1 -1
  121. package/dist/assets/{save-Cnr71JON.js → save-CGm23Yww.js} +1 -1
  122. package/dist/assets/{search-CCX11X2m.js → search-CH2t--sH.js} +1 -1
  123. package/dist/assets/search-config-page-BAmYqoAz.js +1 -0
  124. package/dist/assets/secrets-config-page-BlPOuql_.js +3 -0
  125. package/dist/assets/security-config-CbDiY2xr.js +1 -0
  126. package/dist/assets/{select-DvwBu99K.js → select-DnxxDpcV.js} +2 -2
  127. package/dist/assets/{sequenceDiagram-DBY2YBRQ-BR5IokXV.js → sequenceDiagram-DBY2YBRQ-BtRbPQtL.js} +1 -1
  128. package/dist/assets/{settings-2-Dmv6zMne.js → settings-2-agnMYc8a.js} +1 -1
  129. package/dist/assets/{sizeCapture-X5ZJPWSS-SxG_YnMA.js → sizeCapture-X5ZJPWSS-CMYvM3SL.js} +1 -1
  130. package/dist/assets/skeleton-XpqeWL62.js +1 -0
  131. package/dist/assets/{src-vgz8E_-O.js → src-Bw-mzbQb.js} +1 -1
  132. package/dist/assets/{stateDiagram-2N3HPSRC-DD4OoYhn.js → stateDiagram-2N3HPSRC-BJ-mFeOz.js} +1 -1
  133. package/dist/assets/stateDiagram-v2-6OUMAXLB-BE-HqxOK.js +1 -0
  134. package/dist/assets/{swimlanes-5IMT3BWC-BWkFeyCT.js → swimlanes-5IMT3BWC-BsucVOO2.js} +2 -2
  135. package/dist/assets/swimlanesDiagram-G3AALYLV-Dr1H9LJH.js +8 -0
  136. package/dist/assets/{tag-chip-gMPvx7n_.js → tag-chip-CPOc8b2N.js} +1 -1
  137. package/dist/assets/{timeline-definition-FHXFAJF6-VTRPy6KA.js → timeline-definition-FHXFAJF6-Bicewlzo.js} +1 -1
  138. package/dist/assets/treeView-QDETBFTQ-npJ5dbqS.js +1 -0
  139. package/dist/assets/treemap-6X3UGDF4-pYrBx6oa.js +1 -0
  140. package/dist/assets/{vennDiagram-L72KCM5P-Bvk42Pek.js → vennDiagram-L72KCM5P-BxOOnO9x.js} +1 -1
  141. package/dist/assets/wardley-OPB4EBWU-CmSRKLR8.js +1 -0
  142. package/dist/assets/{wardleyDiagram-EHGQE667-DOFjx2s3.js → wardleyDiagram-EHGQE667-Cl7NltMv.js} +1 -1
  143. package/dist/assets/x-odTHAtLZ.js +1 -0
  144. package/dist/assets/{xychartDiagram-FW5EYKEG-DY5yRTUc.js → xychartDiagram-FW5EYKEG-DiMIxQ7N.js} +1 -1
  145. package/dist/index.html +21 -22
  146. package/package.json +8 -8
  147. package/src/features/apps/components/__tests__/app-packages-panel.test.tsx +234 -0
  148. package/src/features/apps/components/app-marketplace-dialog.tsx +262 -0
  149. package/src/features/apps/components/app-package-card.tsx +268 -0
  150. package/src/features/apps/components/app-packages-panel.tsx +301 -0
  151. package/src/features/apps/components/apps-panel.tsx +11 -4
  152. package/src/features/apps/hooks/use-app-marketplace.ts +95 -0
  153. package/src/features/apps/hooks/use-app-packages.ts +59 -0
  154. package/src/features/chat/components/chat-sidebar-list-mode-switch.tsx +27 -4
  155. package/src/features/chat/components/layout/__tests__/chat-sidebar-session-area.test.tsx +36 -5
  156. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +12 -13
  157. package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +79 -2
  158. package/src/features/chat/features/conversation/components/__tests__/session-conversation-input.streaming.test.tsx +4 -4
  159. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +26 -5
  160. package/src/features/chat/features/conversation/components/session-conversation-input.tsx +3 -0
  161. package/src/features/chat/features/conversation/hooks/use-system-object-reference-select.ts +27 -0
  162. package/src/features/chat/features/conversation/utils/session-message-composer.utils.ts +5 -0
  163. package/src/features/chat/features/input/hooks/__tests__/use-chat-input-surface-state.test.tsx +102 -0
  164. package/src/features/chat/features/input/hooks/use-chat-input-surface-state.ts +71 -120
  165. package/src/features/chat/features/input/input-surface-plugins/__tests__/context-reference-plugin.test.ts +265 -18
  166. package/src/features/chat/features/input/input-surface-plugins/chat-input-product-plugin-adapters.types.ts +7 -2
  167. package/src/features/chat/features/input/input-surface-plugins/chat-input-product-plugin-adapters.utils.ts +124 -0
  168. package/src/features/chat/features/input/input-surface-plugins/context-reference-items.utils.ts +99 -15
  169. package/src/features/chat/features/input/input-surface-plugins/context-reference-plugin.utils.ts +143 -139
  170. package/src/features/chat/features/input/input-surface-plugins/panel-app-input-surface-items.utils.ts +116 -0
  171. package/src/features/chat/features/input/input-surface-plugins/slash-command-plugin.utils.ts +1 -1
  172. package/src/features/chat/features/input/utils/__tests__/chat-inline-token.utils.test.ts +53 -1
  173. package/src/features/chat/features/input/utils/chat-composer-token-protocol.utils.ts +5 -0
  174. package/src/features/chat/features/input/utils/chat-inline-token-composer.utils.ts +134 -0
  175. package/src/features/chat/features/input/utils/chat-inline-token.utils.ts +30 -101
  176. package/src/features/chat/features/input/utils/chat-system-object-reference.utils.test.ts +44 -0
  177. package/src/features/chat/features/input/utils/chat-system-object-reference.utils.ts +46 -0
  178. package/src/features/chat/features/ncp/hooks/__tests__/use-hydrated-ncp-agent.test.tsx +40 -3
  179. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.selection.test.tsx +66 -0
  180. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.test.tsx +13 -1
  181. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +653 -90
  182. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-text-selection.test.tsx +12 -8
  183. package/src/features/chat/features/workspace/components/chat-session-workspace-directory-browser.tsx +401 -288
  184. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +54 -35
  185. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +79 -148
  186. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +156 -94
  187. package/src/features/chat/features/workspace/components/project-files/__tests__/workspace-directory-entry-menu.test.tsx +50 -0
  188. package/src/features/chat/features/workspace/components/project-files/workspace-directory-entry-menu.tsx +209 -0
  189. package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +459 -0
  190. package/src/features/chat/features/workspace/components/project-files/workspace-new-folder-tree-item.tsx +112 -0
  191. package/src/features/chat/features/workspace/components/project-files/workspace-project-files-toolbar.tsx +64 -0
  192. package/src/features/chat/features/workspace/hooks/use-workspace-explorer-layout.ts +85 -0
  193. package/src/features/chat/features/workspace/hooks/use-workspace-file-actions.ts +357 -0
  194. package/src/features/chat/features/workspace/utils/chat-workspace-file-path-mutation.utils.ts +58 -0
  195. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab.utils.ts +23 -22
  196. package/src/features/chat/features/workspace/utils/chat-workspace-panel-layout.utils.ts +13 -4
  197. package/src/features/chat/index.ts +1 -1
  198. package/src/features/chat/managers/__tests__/chat-composer-intent.manager.test.ts +86 -60
  199. package/src/features/chat/managers/__tests__/chat-thread.manager.test.ts +103 -99
  200. package/src/features/chat/managers/chat-composer-intent.manager.ts +37 -33
  201. package/src/features/chat/managers/chat-draft-intent.manager.ts +18 -2
  202. package/src/features/chat/managers/chat-thread.manager.ts +132 -128
  203. package/src/features/chat/stores/__tests__/chat-thread.store.test.ts +26 -40
  204. package/src/features/chat/stores/chat-thread.store.ts +53 -74
  205. package/src/features/inbox/components/inbox-reader-dialog.test.tsx +38 -5
  206. package/src/features/inbox/components/inbox-reader-dialog.tsx +5 -3
  207. package/src/features/inbox/managers/inbox.manager.test.ts +28 -3
  208. package/src/features/inbox/managers/inbox.manager.ts +14 -4
  209. package/src/features/inbox/pages/inbox-page.test.ts +121 -2
  210. package/src/features/inbox/pages/inbox-page.tsx +5 -3
  211. package/src/features/marketplace/components/__tests__/marketplace-page.test.tsx +85 -1
  212. package/src/features/marketplace/hooks/__tests__/use-marketplace.test.tsx +44 -1
  213. package/src/features/marketplace/hooks/use-marketplace-item-actions.ts +23 -2
  214. package/src/features/marketplace/hooks/use-marketplace.ts +10 -0
  215. package/src/features/marketplace/index.ts +4 -0
  216. package/src/features/panel-apps/index.ts +5 -1
  217. package/src/features/panel-apps/utils/__tests__/panel-app-doc-browser.utils.test.ts +13 -6
  218. package/src/features/panel-apps/utils/panel-app-doc-browser.utils.tsx +6 -3
  219. package/src/features/right-panel-resources/index.ts +1 -0
  220. package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +7 -4
  221. package/src/features/system-status/components/__tests__/desktop-update-config.test.tsx +20 -1
  222. package/src/features/system-status/components/desktop-update-config.tsx +14 -13
  223. package/src/features/system-status/managers/__tests__/runtime-update.manager.test.ts +99 -0
  224. package/src/features/system-status/managers/runtime-update.manager.ts +22 -0
  225. package/src/features/system-status/stores/runtime-update.store.ts +1 -0
  226. package/src/shared/components/resizable-right-panel/__tests__/resizable-right-panel.test.tsx +35 -38
  227. package/src/shared/components/resizable-right-panel/resizable-right-panel.tsx +25 -19
  228. package/src/shared/components/ui/actions/__tests__/icon-action-button.test.tsx +15 -0
  229. package/src/shared/components/ui/actions/icon-action-button.tsx +4 -2
  230. package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +60 -34
  231. package/src/shared/components/ui/context-menu/context-menu.tsx +95 -68
  232. package/src/shared/hooks/use-system-object-references.ts +22 -0
  233. package/src/shared/lib/api/managers/client.manager.ts +31 -17
  234. package/src/shared/lib/api/server-path/server-path.types.ts +66 -0
  235. package/src/shared/lib/api/types.ts +155 -116
  236. package/src/shared/lib/api/utils/server-path.utils.ts +35 -11
  237. package/src/shared/lib/i18n/locales/en-US/chat.json +58 -9
  238. package/src/shared/lib/i18n/locales/en-US/desktop-update.json +7 -4
  239. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +40 -0
  240. package/src/shared/lib/i18n/locales/en-US/marketplace.json +3 -0
  241. package/src/shared/lib/i18n/locales/zh-CN/chat.json +60 -11
  242. package/src/shared/lib/i18n/locales/zh-CN/desktop-update.json +7 -4
  243. package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +40 -0
  244. package/src/shared/lib/i18n/locales/zh-CN/marketplace.json +3 -0
  245. package/dist/assets/appearance-settings-page-DpVJjvkB.js +0 -1
  246. package/dist/assets/architecture-TIHT7OUA-Bjp9jf0h.js +0 -1
  247. package/dist/assets/channel-5T3pdR-s.js +0 -1
  248. package/dist/assets/chat-page-BuFDmG5_.js +0 -1
  249. package/dist/assets/chunk-2Q5K7J3B-DTZ3tGfE.js +0 -1
  250. package/dist/assets/chunk-VAUOI2AC-HLGIHQ6k.js +0 -1
  251. package/dist/assets/chunk-XXDRQBXY-Dl0m6Ni-.js +0 -1
  252. package/dist/assets/classDiagram-OUVF2IWQ-DcDnzGNX.js +0 -1
  253. package/dist/assets/classDiagram-v2-EOCWNBFH-BKXKMzKM.js +0 -1
  254. package/dist/assets/config-split-page-BVWVDbvG.js +0 -1
  255. package/dist/assets/confirm-dialog-mA2iVzxh.js +0 -5
  256. package/dist/assets/cynefin-VYW2F7L2-BWg7U2UD.js +0 -1
  257. package/dist/assets/desktop-update-config-DyQb1LXr.js +0 -1
  258. package/dist/assets/doc-browser-CtO_HtRy.js +0 -1
  259. package/dist/assets/doc-browser-context-CuGI6PQc.js +0 -1
  260. package/dist/assets/doc-browser-eMUagyBV.js +0 -1
  261. package/dist/assets/eventmodeling-45OFAUF4-SB-J4tpq.js +0 -1
  262. package/dist/assets/flowDiagram-23GEKE2U-BQ_u-eLM.js +0 -1
  263. package/dist/assets/form-actions-BOfIyG3O.js +0 -1
  264. package/dist/assets/gitGraph-TEB2WS4Q-DPxNwsFd.js +0 -1
  265. package/dist/assets/index-BjBdWHV1.js +0 -107
  266. package/dist/assets/index-DmpmjAGQ.css +0 -1
  267. package/dist/assets/info-DKCQHKI2-DNlNGH90.js +0 -1
  268. package/dist/assets/loader-circle-Df8wF2Pr.js +0 -1
  269. package/dist/assets/mcp-marketplace-page-DI49IKxp.js +0 -1
  270. package/dist/assets/mcp-marketplace-page-ofDqbOIF.js +0 -9
  271. package/dist/assets/model-config-page-D73Tu3jW.js +0 -1
  272. package/dist/assets/packet-7NZHBO7P-BpeiqkBZ.js +0 -1
  273. package/dist/assets/pie-RZYD4A2V-Cy1yxsPd.js +0 -1
  274. package/dist/assets/plus-DVU5RLCS.js +0 -1
  275. package/dist/assets/provider-scoped-model-input-BaJJJYMX.js +0 -1
  276. package/dist/assets/providers-config-page-BL6IRVBm.js +0 -1
  277. package/dist/assets/radar-I7S5WNFK-CEcPKCj8.js +0 -1
  278. package/dist/assets/railroad-3IZDKUUU-CW38eNDs.js +0 -1
  279. package/dist/assets/railroad-abnf-AHOZXSZD-ByrylcXf.js +0 -1
  280. package/dist/assets/railroad-ebnf-EBAXGLYW-CNB6GwP-.js +0 -1
  281. package/dist/assets/railroad-peg-LSFZ7HO6-x6hnqlBG.js +0 -1
  282. package/dist/assets/react-BC_orpAj.js +0 -8
  283. package/dist/assets/remote-T24O58lH.js +0 -1
  284. package/dist/assets/rotate-cw-BqhwSV5p.js +0 -1
  285. package/dist/assets/runtime-config-page-CXUx017t.js +0 -1
  286. package/dist/assets/search-config-page-BB6d5gT7.js +0 -1
  287. package/dist/assets/secrets-config-page-DYsDeT9K.js +0 -3
  288. package/dist/assets/security-config-CVPgqL7G.js +0 -1
  289. package/dist/assets/skeleton-C5tWata3.js +0 -1
  290. package/dist/assets/stateDiagram-v2-6OUMAXLB-ZC6dFORv.js +0 -1
  291. package/dist/assets/swimlanesDiagram-G3AALYLV-CRkh51Im.js +0 -8
  292. package/dist/assets/treeView-QDETBFTQ-Bw0DSCH7.js +0 -1
  293. package/dist/assets/treemap-6X3UGDF4-DFWBFcfh.js +0 -1
  294. package/dist/assets/use-confirm-dialog-D_3-QpZU.js +0 -1
  295. package/dist/assets/wardley-OPB4EBWU-CoWturk0.js +0 -1
  296. package/dist/assets/x-BEWSqeux.js +0 -1
  297. /package/dist/assets/{array-NADKd9aU.js → array-BQVzeGRt.js} +0 -0
  298. /package/dist/assets/{chunk-KEIR6QF5-BuyuzJJL.js → chunk-KEIR6QF5-f9psyCXK.js} +0 -0
  299. /package/dist/assets/{chunk-Y2CYZVJY-D_B2ZRNt.js → chunk-Y2CYZVJY-D1mAU_Po.js} +0 -0
  300. /package/dist/assets/{config-hints-BcfVUMij.js → config-hints-nV5HPOvq.js} +0 -0
  301. /package/dist/assets/{cytoscape.esm-BANTlgza.js → cytoscape.esm-0uDtdD0l.js} +0 -0
  302. /package/dist/assets/{defaultLocale-C4_L0aEs.js → defaultLocale-DSWXGgt0.js} +0 -0
  303. /package/dist/assets/{dist-DAPEIJbz.js → dist--ta5rX12.js} +0 -0
  304. /package/dist/assets/{graphlib-ChqXg0dI.js → graphlib-CQ6QV4yP.js} +0 -0
  305. /package/dist/assets/{host-capabilities-D9C4CBK5.js → host-capabilities-Tk038i04.js} +0 -0
  306. /package/dist/assets/{init-D8wZg9xq.js → init-Y6h9jGtZ.js} +0 -0
  307. /package/dist/assets/{jszip.min-CkbBfwAQ.js → jszip.min-8hyJpgpx.js} +0 -0
  308. /package/dist/assets/{katex-TZJFa0J_.js → katex-ARhY9PS1.js} +0 -0
  309. /package/dist/assets/{middleware-B3k-TSmZ.js → middleware-DXsbf9xI.js} +0 -0
  310. /package/dist/assets/{path-DodfxcX7.js → path-10BjdyLh.js} +0 -0
  311. /package/dist/assets/{rough.esm-CUaa1Rbe.js → rough.esm-DxgC_14r.js} +0 -0
  312. /package/dist/assets/{xlsx-CxByi7bR.js → xlsx-DrDuDNAa.js} +0 -0
@@ -1,8 +1,5 @@
1
1
  import { appQueryClient } from '@/app-query-client';
2
- import {
3
- deleteNcpSession as deleteNcpSessionApi,
4
- deleteNcpSessionSummaryInQueryClient,
5
- } from '@/shared/lib/api';
2
+ import { deleteNcpSession as deleteNcpSessionApi, deleteNcpSessionSummaryInQueryClient } from '@/shared/lib/api';
6
3
  import type {
7
4
  ChatFileOpenActionViewModel,
8
5
  ChatUiShowContentRequest,
@@ -20,7 +17,10 @@ import type {
20
17
  ChatWorkspaceFileTab,
21
18
  } from '@/features/chat/stores/chat-thread.store';
22
19
  import { useChatThreadStore } from '@/features/chat/stores/chat-thread.store';
23
- import { normalizeChatWorkspacePanelWidth } from '@/features/chat/features/workspace/utils/chat-workspace-panel-layout.utils';
20
+ import {
21
+ normalizeChatWorkspaceExplorerWidth,
22
+ normalizeChatWorkspacePanelWidth,
23
+ } from '@/features/chat/features/workspace/utils/chat-workspace-panel-layout.utils';
24
24
  import { t } from '@/shared/lib/i18n';
25
25
  import {
26
26
  areWorkspaceNavigationEntriesEqual,
@@ -31,10 +31,7 @@ import {
31
31
  materializeSideChatDraftSnapshot,
32
32
  upsertChildSessionTab,
33
33
  } from '@/features/chat/features/workspace/utils/chat-thread-workspace-session.utils';
34
- import {
35
- pushNavigationHistoryEntry,
36
- stepNavigationHistory,
37
- } from '@/shared/lib/navigation-history';
34
+ import { pushNavigationHistoryEntry, stepNavigationHistory } from '@/shared/lib/navigation-history';
38
35
  import {
39
36
  resolveAlternateWorkspaceFileViewer,
40
37
  type ChatWorkspaceFileViewer,
@@ -43,6 +40,10 @@ import {
43
40
  createWorkspaceFileTab,
44
41
  upsertWorkspaceFileTab,
45
42
  } from '@/features/chat/features/workspace/utils/chat-workspace-file-tab.utils';
43
+ import {
44
+ createRemovedWorkspacePathSnapshot,
45
+ createRenamedWorkspacePathPatch,
46
+ } from '@/features/chat/features/workspace/utils/chat-workspace-file-path-mutation.utils';
46
47
 
47
48
  type WorkspaceChildReadState = Parameters<ChatSessionListManager['markVisibleWorkspaceChildRead']>[0];
48
49
  export type ChatVisibleWorkspaceSelection =
@@ -61,7 +62,9 @@ export class ChatThreadManager {
61
62
 
62
63
  private hasSnapshotChanges = (patch: Partial<ChatThreadSnapshot>): boolean => {
63
64
  const current = useChatThreadStore.getState().snapshot;
64
- for (const [key, value] of Object.entries(patch) as Array<[keyof ChatThreadSnapshot, ChatThreadSnapshot[keyof ChatThreadSnapshot]]>) {
65
+ for (const [key, value] of Object.entries(patch) as Array<
66
+ [keyof ChatThreadSnapshot, ChatThreadSnapshot[keyof ChatThreadSnapshot]]
67
+ >) {
65
68
  if (!Object.is(current[key], value)) {
66
69
  return true;
67
70
  }
@@ -112,27 +115,23 @@ export class ChatThreadManager {
112
115
  return useChatSessionListStore.getState().snapshot.selectedSessionKey ?? null;
113
116
  };
114
117
 
115
- private activateWorkspaceFileTab = (
116
- nextTab: ChatWorkspaceFileTab,
117
- adjacentToKey?: string,
118
- ) => {
118
+ private activateWorkspaceFileTab = (nextTab: ChatWorkspaceFileTab, adjacentToKey?: string) => {
119
119
  const { parentSessionKey } = nextTab;
120
120
  const { workspaceFileTabs } = useChatThreadStore.getState().snapshot;
121
- this.setWorkspaceSelection({
122
- workspacePanelParentKey: parentSessionKey,
123
- activeWorkspacePanelKind: 'file',
124
- workspaceFileTabs: upsertWorkspaceFileTab(
125
- workspaceFileTabs,
126
- nextTab,
127
- adjacentToKey,
128
- ),
129
- activeWorkspaceFileKey: nextTab.key,
130
- activeChildSessionKey: null,
131
- activeSideChatDraft: null,
132
- }, {
133
- kind: 'file',
134
- key: nextTab.key,
135
- });
121
+ this.setWorkspaceSelection(
122
+ {
123
+ workspacePanelParentKey: parentSessionKey,
124
+ activeWorkspacePanelKind: 'file',
125
+ workspaceFileTabs: upsertWorkspaceFileTab(workspaceFileTabs, nextTab, adjacentToKey),
126
+ activeWorkspaceFileKey: nextTab.key,
127
+ activeChildSessionKey: null,
128
+ activeSideChatDraft: null,
129
+ },
130
+ {
131
+ kind: 'file',
132
+ key: nextTab.key,
133
+ },
134
+ );
136
135
  this.ensureWorkspaceParentRoute(parentSessionKey);
137
136
  this.onWorkspacePanelOpened?.();
138
137
  };
@@ -149,10 +148,7 @@ export class ChatThreadManager {
149
148
  }
150
149
  };
151
150
 
152
- private setWorkspaceSelection = (
153
- patch: Partial<ChatThreadSnapshot>,
154
- entry: ChatWorkspaceNavigationEntry,
155
- ) => {
151
+ private setWorkspaceSelection = (patch: Partial<ChatThreadSnapshot>, entry: ChatWorkspaceNavigationEntry) => {
156
152
  const { snapshot } = useChatThreadStore.getState();
157
153
  const history = pushNavigationHistoryEntry(
158
154
  {
@@ -163,8 +159,7 @@ export class ChatThreadManager {
163
159
  areWorkspaceNavigationEntriesEqual,
164
160
  );
165
161
  const closedWorkspaceTabEntries =
166
- patch.workspacePanelParentKey &&
167
- patch.workspacePanelParentKey !== snapshot.workspacePanelParentKey
162
+ patch.workspacePanelParentKey && patch.workspacePanelParentKey !== snapshot.workspacePanelParentKey
168
163
  ? []
169
164
  : snapshot.closedWorkspaceTabEntries.filter(
170
165
  (candidate) => !areWorkspaceNavigationEntriesEqual(candidate, entry),
@@ -185,13 +180,16 @@ export class ChatThreadManager {
185
180
  if (!parentSessionKey && kind !== 'project-files') {
186
181
  return;
187
182
  }
188
- this.setWorkspaceSelection({
189
- workspacePanelParentKey: parentSessionKey,
190
- activeWorkspacePanelKind: kind,
191
- activeChildSessionKey: null,
192
- activeSideChatDraft: null,
193
- activeWorkspaceFileKey: null,
194
- }, { kind });
183
+ this.setWorkspaceSelection(
184
+ {
185
+ workspacePanelParentKey: parentSessionKey,
186
+ activeWorkspacePanelKind: kind,
187
+ activeChildSessionKey: null,
188
+ activeSideChatDraft: null,
189
+ activeWorkspaceFileKey: null,
190
+ },
191
+ { kind },
192
+ );
195
193
  this.ensureWorkspaceParentRoute(parentSessionKey);
196
194
  this.onWorkspacePanelOpened?.();
197
195
  };
@@ -203,10 +201,7 @@ export class ChatThreadManager {
203
201
  toggleWorkspacePanel = (sessionKey: string | null) => {
204
202
  const normalizedSessionKey = sessionKey?.trim() || null;
205
203
  const { snapshot } = useChatThreadStore.getState();
206
- if (
207
- snapshot.workspacePanelParentKey === normalizedSessionKey &&
208
- snapshot.activeWorkspacePanelKind
209
- ) {
204
+ if (snapshot.workspacePanelParentKey === normalizedSessionKey && snapshot.activeWorkspacePanelKind) {
210
205
  this.closeWorkspacePanel();
211
206
  return;
212
207
  }
@@ -223,6 +218,22 @@ export class ChatThreadManager {
223
218
  });
224
219
  };
225
220
 
221
+ setWorkspaceExplorerWidth = (width: number) => {
222
+ this.syncSnapshot({
223
+ workspaceExplorerWidth: normalizeChatWorkspaceExplorerWidth(width),
224
+ });
225
+ };
226
+
227
+ renameWorkspacePath = (params: { previousPath: string; path: string; label: string }) => {
228
+ const patch = createRenamedWorkspacePathPatch(useChatThreadStore.getState().snapshot, params);
229
+ if (patch) this.syncSnapshot(patch);
230
+ };
231
+
232
+ removeWorkspacePath = (path: string) => {
233
+ const snapshot = createRemovedWorkspacePathSnapshot(useChatThreadStore.getState().snapshot, path);
234
+ if (snapshot) useChatThreadStore.getState().setSnapshot(snapshot);
235
+ };
236
+
226
237
  openChildSessions = (sessionKey: string) => {
227
238
  this.openWorkspacePage(sessionKey, 'child-sessions');
228
239
  };
@@ -236,10 +247,7 @@ export class ChatThreadManager {
236
247
  if (!sessionKey || !this.uiManager.isAtChatRoot()) {
237
248
  return;
238
249
  }
239
- const patch = materializeDraftWorkspaceSnapshot(
240
- useChatThreadStore.getState().snapshot,
241
- sessionKey,
242
- );
250
+ const patch = materializeDraftWorkspaceSnapshot(useChatThreadStore.getState().snapshot, sessionKey);
243
251
  if (!patch) {
244
252
  return;
245
253
  }
@@ -271,15 +279,12 @@ export class ChatThreadManager {
271
279
  activeWorkspaceFileKey: null,
272
280
  };
273
281
  if (activeChildSessionKey && childSessionTab) {
274
- patch.childSessionTabs = upsertChildSessionTab(
275
- useChatThreadStore.getState().snapshot.childSessionTabs,
276
- {
277
- sessionKey: activeChildSessionKey,
278
- parentSessionKey,
279
- label: childSessionTab.label?.trim() || null,
280
- agentId: childSessionTab.agentId?.trim() || null,
281
- },
282
- );
282
+ patch.childSessionTabs = upsertChildSessionTab(useChatThreadStore.getState().snapshot.childSessionTabs, {
283
+ sessionKey: activeChildSessionKey,
284
+ parentSessionKey,
285
+ label: childSessionTab.label?.trim() || null,
286
+ agentId: childSessionTab.agentId?.trim() || null,
287
+ });
283
288
  }
284
289
  if (activeChildSessionKey) {
285
290
  this.setWorkspaceSelection(patch, {
@@ -294,22 +299,24 @@ export class ChatThreadManager {
294
299
  };
295
300
 
296
301
  openSideChatDraft = (parentSessionKey?: string | null) => {
297
- const resolvedParentSessionKey =
298
- parentSessionKey?.trim() || this.resolveWorkspaceParentSessionKey()?.trim();
302
+ const resolvedParentSessionKey = parentSessionKey?.trim() || this.resolveWorkspaceParentSessionKey()?.trim();
299
303
  if (!resolvedParentSessionKey) {
300
304
  return;
301
305
  }
302
306
  const activeSideChatDraft = createSideChatDraft(resolvedParentSessionKey);
303
- this.setWorkspaceSelection({
304
- workspacePanelParentKey: resolvedParentSessionKey,
305
- activeWorkspacePanelKind: 'side-chat-draft',
306
- activeChildSessionKey: null,
307
- activeSideChatDraft,
308
- activeWorkspaceFileKey: null,
309
- }, {
310
- kind: 'side-chat-draft',
311
- key: activeSideChatDraft.draftKey,
312
- });
307
+ this.setWorkspaceSelection(
308
+ {
309
+ workspacePanelParentKey: resolvedParentSessionKey,
310
+ activeWorkspacePanelKind: 'side-chat-draft',
311
+ activeChildSessionKey: null,
312
+ activeSideChatDraft,
313
+ activeWorkspaceFileKey: null,
314
+ },
315
+ {
316
+ kind: 'side-chat-draft',
317
+ key: activeSideChatDraft.draftKey,
318
+ },
319
+ );
313
320
  this.ensureWorkspaceParentRoute(resolvedParentSessionKey);
314
321
  this.onWorkspacePanelOpened?.();
315
322
  };
@@ -340,34 +347,32 @@ export class ChatThreadManager {
340
347
  this.activateWorkspaceFileTab(nextTab);
341
348
  };
342
349
 
343
- openWorkspaceFileViewer = (
344
- fileKey: string,
345
- viewer?: ChatWorkspaceFileViewer,
346
- ) => {
347
- const sourceTab = useChatThreadStore.getState().snapshot.workspaceFileTabs
348
- .find((tab) => tab.key === fileKey.trim());
350
+ openWorkspaceFileViewer = (fileKey: string, viewer?: ChatWorkspaceFileViewer) => {
351
+ const sourceTab = useChatThreadStore
352
+ .getState()
353
+ .snapshot.workspaceFileTabs.find((tab) => tab.key === fileKey.trim());
349
354
  if (!sourceTab || sourceTab.viewMode !== 'preview') {
350
355
  return;
351
356
  }
352
- const nextViewer = viewer ?? resolveAlternateWorkspaceFileViewer(
353
- sourceTab.path,
354
- sourceTab.previewViewer,
355
- );
357
+ const nextViewer = viewer ?? resolveAlternateWorkspaceFileViewer(sourceTab.path, sourceTab.previewViewer);
356
358
  if (!nextViewer) {
357
359
  return;
358
360
  }
359
- const nextTab = createWorkspaceFileTab({
360
- path: sourceTab.path,
361
- label: sourceTab.label ?? undefined,
362
- viewMode: 'preview',
363
- previewViewer: nextViewer,
364
- line: sourceTab.line ?? undefined,
365
- column: sourceTab.column ?? undefined,
366
- params: sourceTab.params ?? undefined,
367
- rawText: sourceTab.rawText ?? undefined,
368
- contentUrl: sourceTab.contentUrl ?? undefined,
369
- mimeType: sourceTab.mimeType ?? undefined,
370
- }, sourceTab.parentSessionKey);
361
+ const nextTab = createWorkspaceFileTab(
362
+ {
363
+ path: sourceTab.path,
364
+ label: sourceTab.label ?? undefined,
365
+ viewMode: 'preview',
366
+ previewViewer: nextViewer,
367
+ line: sourceTab.line ?? undefined,
368
+ column: sourceTab.column ?? undefined,
369
+ params: sourceTab.params ?? undefined,
370
+ rawText: sourceTab.rawText ?? undefined,
371
+ contentUrl: sourceTab.contentUrl ?? undefined,
372
+ mimeType: sourceTab.mimeType ?? undefined,
373
+ },
374
+ sourceTab.parentSessionKey,
375
+ );
371
376
  if (nextTab) {
372
377
  this.activateWorkspaceFileTab(nextTab, sourceTab.key);
373
378
  }
@@ -383,9 +388,7 @@ export class ChatThreadManager {
383
388
  }
384
389
  if (action.sessionKind === 'child' && !this.uiManager.isCompactViewport()) {
385
390
  const parentSessionKey =
386
- action.parentSessionId?.trim() ||
387
- useChatSessionListStore.getState().snapshot.selectedSessionKey ||
388
- null;
391
+ action.parentSessionId?.trim() || useChatSessionListStore.getState().snapshot.selectedSessionKey || null;
389
392
  if (parentSessionKey) {
390
393
  this.openChildSessionPanel({
391
394
  parentSessionKey,
@@ -457,15 +460,18 @@ export class ChatThreadManager {
457
460
  if (!normalizedSessionKey) {
458
461
  return;
459
462
  }
460
- this.setWorkspaceSelection({
461
- activeChildSessionKey: normalizedSessionKey,
462
- activeWorkspaceFileKey: null,
463
- activeWorkspacePanelKind: 'child-session',
464
- activeSideChatDraft: null,
465
- }, {
466
- kind: 'child-session',
467
- key: normalizedSessionKey,
468
- });
463
+ this.setWorkspaceSelection(
464
+ {
465
+ activeChildSessionKey: normalizedSessionKey,
466
+ activeWorkspaceFileKey: null,
467
+ activeWorkspacePanelKind: 'child-session',
468
+ activeSideChatDraft: null,
469
+ },
470
+ {
471
+ kind: 'child-session',
472
+ key: normalizedSessionKey,
473
+ },
474
+ );
469
475
  };
470
476
 
471
477
  selectWorkspaceFile = (fileKey: string) => {
@@ -477,15 +483,18 @@ export class ChatThreadManager {
477
483
  if (!workspaceFileTabs.some((tab) => tab.key === normalizedFileKey)) {
478
484
  return;
479
485
  }
480
- this.setWorkspaceSelection({
481
- activeWorkspaceFileKey: normalizedFileKey,
482
- activeChildSessionKey: null,
483
- activeWorkspacePanelKind: 'file',
484
- activeSideChatDraft: null,
485
- }, {
486
- kind: 'file',
487
- key: normalizedFileKey,
488
- });
486
+ this.setWorkspaceSelection(
487
+ {
488
+ activeWorkspaceFileKey: normalizedFileKey,
489
+ activeChildSessionKey: null,
490
+ activeWorkspacePanelKind: 'file',
491
+ activeSideChatDraft: null,
492
+ },
493
+ {
494
+ kind: 'file',
495
+ key: normalizedFileKey,
496
+ },
497
+ );
489
498
  };
490
499
 
491
500
  closeWorkspaceTab = (entry: ChatWorkspaceNavigationEntry) => {
@@ -545,19 +554,12 @@ export class ChatThreadManager {
545
554
  };
546
555
 
547
556
  goToParentSession = () => {
548
- const {
549
- parentSessionKey,
550
- activeSideChatDraft,
551
- childSessionTabs,
552
- activeChildSessionKey,
553
- } = useChatThreadStore.getState().snapshot;
557
+ const { parentSessionKey, activeSideChatDraft, childSessionTabs, activeChildSessionKey } =
558
+ useChatThreadStore.getState().snapshot;
554
559
  const activeChildParentSessionKey =
555
- childSessionTabs.find((tab) => tab.sessionKey === activeChildSessionKey)
556
- ?.parentSessionKey ?? null;
560
+ childSessionTabs.find((tab) => tab.sessionKey === activeChildSessionKey)?.parentSessionKey ?? null;
557
561
  const resolvedParentSessionKey =
558
- parentSessionKey ??
559
- activeSideChatDraft?.parentSessionKey ??
560
- activeChildParentSessionKey;
562
+ parentSessionKey ?? activeSideChatDraft?.parentSessionKey ?? activeChildParentSessionKey;
561
563
  if (!resolvedParentSessionKey) {
562
564
  return;
563
565
  }
@@ -567,7 +569,7 @@ export class ChatThreadManager {
567
569
 
568
570
  deleteSession = async () => {
569
571
  const {
570
- snapshot: { selectedSessionKey }
572
+ snapshot: { selectedSessionKey },
571
573
  } = useChatSessionListStore.getState();
572
574
  if (!selectedSessionKey) {
573
575
  return;
@@ -575,7 +577,7 @@ export class ChatThreadManager {
575
577
  const confirmed = await this.uiManager.confirm({
576
578
  title: t('chatDeleteSessionConfirm'),
577
579
  variant: 'destructive',
578
- confirmLabel: t('delete')
580
+ confirmLabel: t('delete'),
579
581
  });
580
582
  if (!confirmed) {
581
583
  return;
@@ -584,7 +586,9 @@ export class ChatThreadManager {
584
586
  try {
585
587
  await deleteNcpSessionApi(selectedSessionKey);
586
588
  deleteNcpSessionSummaryInQueryClient(appQueryClient, selectedSessionKey);
587
- appQueryClient.removeQueries({ queryKey: ['ncp-session-messages', selectedSessionKey] });
589
+ appQueryClient.removeQueries({
590
+ queryKey: ['ncp-session-messages', selectedSessionKey],
591
+ });
588
592
  this.clearDeletedSessionState();
589
593
  this.uiManager.goToChatRoot({ replace: true });
590
594
  } finally {
@@ -1,8 +1,9 @@
1
1
  import { beforeEach, describe, expect, it } from 'vitest';
2
+ import { useChatThreadStore } from '@/features/chat/stores/chat-thread.store';
2
3
  import {
3
- useChatThreadStore,
4
- } from '@/features/chat/stores/chat-thread.store';
5
- import { CHAT_WORKSPACE_PANEL_DEFAULT_WIDTH } from '@/features/chat/features/workspace/utils/chat-workspace-panel-layout.utils';
4
+ CHAT_WORKSPACE_EXPLORER_DEFAULT_WIDTH,
5
+ CHAT_WORKSPACE_PANEL_DEFAULT_WIDTH,
6
+ } from '@/features/chat/features/workspace/utils/chat-workspace-panel-layout.utils';
6
7
 
7
8
  const chatThreadWorkspaceStorageKey = 'nextclaw.chat.workspace-panel.state';
8
9
 
@@ -10,7 +11,7 @@ function createLocalStoragePersistStorage() {
10
11
  return {
11
12
  getItem: (name: string) => JSON.parse(window.localStorage.getItem(name) ?? 'null'),
12
13
  setItem: (name: string, value: unknown) => window.localStorage.setItem(name, JSON.stringify(value)),
13
- removeItem: (name: string) => window.localStorage.removeItem(name)
14
+ removeItem: (name: string) => window.localStorage.removeItem(name),
14
15
  };
15
16
  }
16
17
 
@@ -31,6 +32,8 @@ function resetChatThreadStore() {
31
32
  closedWorkspaceTabEntries: [],
32
33
  workspaceNavigationHistory: [],
33
34
  workspaceNavigationHistoryIndex: 0,
35
+ workspaceExplorerOpen: false,
36
+ workspaceExplorerWidth: CHAT_WORKSPACE_EXPLORER_DEFAULT_WIDTH,
34
37
  workspacePanelWidth: CHAT_WORKSPACE_PANEL_DEFAULT_WIDTH,
35
38
  },
36
39
  });
@@ -66,34 +69,28 @@ describe('chat thread workspace panel persistence', () => {
66
69
  },
67
70
  ],
68
71
  activeWorkspaceFileKey: 'session-1::preview::README.md',
69
- closedWorkspaceTabEntries: [
70
- { kind: 'project-files' },
71
- { kind: 'child-session', key: 'child-session-2' },
72
- ],
72
+ closedWorkspaceTabEntries: [{ kind: 'project-files' }, { kind: 'child-session', key: 'child-session-2' }],
73
73
  workspaceNavigationHistory: [
74
74
  { kind: 'child-session', key: 'child-session-1' },
75
75
  { kind: 'file', key: 'session-1::preview::README.md' },
76
76
  ],
77
77
  workspaceNavigationHistoryIndex: 1,
78
+ workspaceExplorerOpen: true,
78
79
  });
79
80
 
80
- const persisted = JSON.parse(
81
- window.localStorage.getItem(chatThreadWorkspaceStorageKey) ?? '{}',
82
- );
81
+ const persisted = JSON.parse(window.localStorage.getItem(chatThreadWorkspaceStorageKey) ?? '{}');
83
82
 
84
83
  expect(persisted.state.snapshot).toMatchObject({
85
84
  workspacePanelParentKey: 'session-1',
86
85
  activeWorkspacePanelKind: 'file',
87
86
  activeWorkspaceFileKey: 'session-1::preview::README.md',
88
- closedWorkspaceTabEntries: [
89
- { kind: 'project-files' },
90
- { kind: 'child-session', key: 'child-session-2' },
91
- ],
87
+ closedWorkspaceTabEntries: [{ kind: 'project-files' }, { kind: 'child-session', key: 'child-session-2' }],
92
88
  workspaceNavigationHistory: [
93
89
  { kind: 'child-session', key: 'child-session-1' },
94
90
  { kind: 'file', key: 'session-1::preview::README.md' },
95
91
  ],
96
92
  workspaceNavigationHistoryIndex: 1,
93
+ workspaceExplorerOpen: true,
97
94
  });
98
95
  expect(persisted.state.snapshot.sessionKey).toBeUndefined();
99
96
  expect(persisted.state.snapshot.isSending).toBeUndefined();
@@ -120,16 +117,12 @@ describe('chat thread workspace panel persistence', () => {
120
117
  workspaceNavigationHistoryIndex: 1,
121
118
  });
122
119
 
123
- const persisted = JSON.parse(
124
- window.localStorage.getItem(chatThreadWorkspaceStorageKey) ?? '{}',
125
- );
120
+ const persisted = JSON.parse(window.localStorage.getItem(chatThreadWorkspaceStorageKey) ?? '{}');
126
121
 
127
122
  expect(persisted.state.snapshot).toMatchObject({
128
123
  workspacePanelParentKey: 'session-1',
129
124
  activeWorkspacePanelKind: null,
130
- workspaceNavigationHistory: [
131
- { kind: 'child-session', key: 'child-session-1' },
132
- ],
125
+ workspaceNavigationHistory: [{ kind: 'child-session', key: 'child-session-1' }],
133
126
  workspaceNavigationHistoryIndex: 0,
134
127
  });
135
128
  expect(persisted.state.snapshot.activeSideChatDraft).toBeUndefined();
@@ -139,12 +132,10 @@ describe('chat thread workspace panel persistence', () => {
139
132
  useChatThreadStore.getState().setSnapshot({
140
133
  workspacePanelParentKey: 'session-1',
141
134
  activeWorkspacePanelKind: 'project-files',
142
- workspaceNavigationHistory: [
143
- { kind: 'overview' },
144
- { kind: 'child-sessions' },
145
- { kind: 'project-files' },
146
- ],
135
+ workspaceNavigationHistory: [{ kind: 'overview' }, { kind: 'child-sessions' }, { kind: 'project-files' }],
147
136
  workspaceNavigationHistoryIndex: 2,
137
+ workspaceExplorerOpen: true,
138
+ workspaceExplorerWidth: 318,
148
139
  workspacePanelWidth: 620,
149
140
  });
150
141
 
@@ -158,12 +149,10 @@ describe('chat thread workspace panel persistence', () => {
158
149
  expect(useChatThreadStore.getState().snapshot).toMatchObject({
159
150
  workspacePanelParentKey: 'session-1',
160
151
  activeWorkspacePanelKind: 'project-files',
161
- workspaceNavigationHistory: [
162
- { kind: 'overview' },
163
- { kind: 'child-sessions' },
164
- { kind: 'project-files' },
165
- ],
152
+ workspaceNavigationHistory: [{ kind: 'overview' }, { kind: 'child-sessions' }, { kind: 'project-files' }],
166
153
  workspaceNavigationHistoryIndex: 2,
154
+ workspaceExplorerOpen: true,
155
+ workspaceExplorerWidth: 318,
167
156
  workspacePanelWidth: 620,
168
157
  });
169
158
  });
@@ -182,9 +171,7 @@ describe('chat thread workspace panel persistence', () => {
182
171
  activeWorkspacePanelKind: 'file',
183
172
  workspaceFileTabs,
184
173
  activeWorkspaceFileKey,
185
- workspaceNavigationHistory: [
186
- { kind: 'file', key: activeWorkspaceFileKey },
187
- ],
174
+ workspaceNavigationHistory: [{ kind: 'file', key: activeWorkspaceFileKey }],
188
175
  workspaceNavigationHistoryIndex: 0,
189
176
  });
190
177
 
@@ -202,9 +189,7 @@ describe('chat thread workspace panel persistence', () => {
202
189
  });
203
190
  expect(useChatThreadStore.getState().snapshot.workspaceFileTabs).toHaveLength(8);
204
191
  expect(
205
- useChatThreadStore.getState().snapshot.workspaceFileTabs.some(
206
- (tab) => tab.key === activeWorkspaceFileKey,
207
- ),
192
+ useChatThreadStore.getState().snapshot.workspaceFileTabs.some((tab) => tab.key === activeWorkspaceFileKey),
208
193
  ).toBe(true);
209
194
  });
210
195
 
@@ -223,6 +208,7 @@ describe('chat thread workspace panel persistence', () => {
223
208
  { kind: 'file', key: 'session-1::preview::README.md' },
224
209
  ],
225
210
  workspaceNavigationHistoryIndex: 1,
211
+ workspaceExplorerWidth: 999,
226
212
  workspaceFileTabs: [
227
213
  {
228
214
  key: 'session-1::preview::README.md',
@@ -252,10 +238,10 @@ describe('chat thread workspace panel persistence', () => {
252
238
  workspacePanelParentKey: 'session-1',
253
239
  activeWorkspacePanelKind: 'file',
254
240
  activeWorkspaceFileKey: 'session-1::preview::README.md',
241
+ workspaceExplorerWidth: 400,
242
+ workspaceExplorerOpen: false,
255
243
  activeChildSessionKey: 'child-session-1',
256
- workspaceNavigationHistory: [
257
- { kind: 'file', key: 'session-1::preview::README.md' },
258
- ],
244
+ workspaceNavigationHistory: [{ kind: 'file', key: 'session-1::preview::README.md' }],
259
245
  workspaceNavigationHistoryIndex: 0,
260
246
  workspaceFileTabs: [
261
247
  {