@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
@@ -5,27 +5,23 @@ import {
5
5
  type ChatInputSurfaceTrigger,
6
6
  } from '@nextclaw/agent-chat-ui';
7
7
  import { usePanelApps } from '@/features/panel-apps';
8
- import { t, type I18nLanguage } from '@/shared/lib/i18n';
8
+ import type { I18nLanguage } from '@/shared/lib/i18n';
9
9
  import {
10
10
  CONTEXT_REFERENCE_TRIGGER_SPEC,
11
- createContextReferenceInputSurfacePlugin,
12
11
  } from '@/features/chat/features/input/input-surface-plugins/context-reference-plugin.utils';
13
12
  import type { ContextReferenceLocation } from '@/features/chat/features/input/input-surface-plugins/chat-input-product-plugin-adapters.types';
14
13
  import {
15
- createSlashCommandInputSurfacePlugin,
16
- type ChatSlashCommandDescriptor,
17
- } from '@/features/chat/features/input/input-surface-plugins/slash-command-plugin.utils';
18
- import type { ChatInputBarAdapterTexts, ChatSkillRecord } from '@/features/chat/types/chat-input-bar.types';
14
+ buildChatInputProductPlugins,
15
+ type ChatInputSurfaceSlashTexts,
16
+ } from '@/features/chat/features/input/input-surface-plugins/chat-input-product-plugin-adapters.utils';
17
+ import type { ChatSlashCommandDescriptor } from '@/features/chat/features/input/input-surface-plugins/slash-command-plugin.utils';
18
+ import type { ChatSkillRecord } from '@/features/chat/types/chat-input-bar.types';
19
19
  import { useProjects } from '@/shared/hooks/use-projects';
20
20
  import { useServerPathBrowse } from '@/shared/hooks/use-server-path-browse';
21
21
  import { useServerPathSearch } from '@/shared/hooks/use-server-path-search';
22
+ import { useSystemObjectReferences } from '@/shared/hooks/use-system-object-references';
22
23
  import type { ServerPathEntryView, ServerPathSearchEntryView } from '@/shared/lib/api';
23
24
 
24
- type ChatInputSurfaceSlashTexts = Pick<
25
- ChatInputBarAdapterTexts,
26
- 'slashSkillSubtitle' | 'slashSkillSpecLabel' | 'slashSkillScopeLabel' | 'noSkillDescription'
27
- >;
28
-
29
25
  type UseChatInputSurfaceStateParams = {
30
26
  commands: readonly ChatSlashCommandDescriptor[];
31
27
  isSkillsLoading: boolean;
@@ -33,107 +29,12 @@ type UseChatInputSurfaceStateParams = {
33
29
  language: I18nLanguage;
34
30
  onSelectPanelApp: (appId: string) => void;
35
31
  onSelectSkill: (skillRef: string) => void;
32
+ onSelectSystemObject: (uri: string) => void;
36
33
  projectRoot: string;
37
34
  recentSkillValues: readonly string[];
38
35
  skillRecords: readonly ChatSkillRecord[];
39
36
  };
40
37
 
41
- function buildChatInputSurfacePlugins(params: {
42
- commands: readonly ChatSlashCommandDescriptor[];
43
- language: I18nLanguage;
44
- onNavigate: (location: ContextReferenceLocation) => void;
45
- onSelectPanelApp: (appId: string) => void;
46
- onSelectSkill: (skillRef: string) => void;
47
- slashTexts: ChatInputSurfaceSlashTexts;
48
- }) {
49
- const {
50
- commands,
51
- language,
52
- onNavigate,
53
- onSelectPanelApp,
54
- onSelectSkill,
55
- slashTexts,
56
- } = params;
57
- const panelAppTexts = {
58
- appIdLabel: t('chatPanelAppReferenceAppId', language),
59
- fileLabel: t('chatPanelAppReferenceFile', language),
60
- noDescriptionLabel: t('chatPanelAppReferenceNoDescription', language),
61
- subtitle: t('chatPanelAppReferenceType', language),
62
- };
63
- return [
64
- createSlashCommandInputSurfacePlugin({
65
- commands,
66
- itemTexts: {
67
- panelAppTexts,
68
- skillTexts: slashTexts,
69
- },
70
- menuTexts: {
71
- loadingLabel: t('chatSlashLoading', language),
72
- sectionLabel: t('chatSlashSection', language),
73
- emptyLabel: t('chatSlashNoResult', language),
74
- hintLabel: t('chatSlashHint', language),
75
- itemHintLabel: t('chatSlashSkillHint', language),
76
- },
77
- labels: {
78
- commandHintLabel: t('chatSlashCommandHint', language),
79
- commandSectionLabel: t('chatSlashSectionCommands', language),
80
- commandSubtitle: t('chatSlashTypeCommand', language),
81
- filterAllLabel: t('chatSlashFilterAll', language),
82
- filterCommandsLabel: t('chatSlashFilterCommands', language),
83
- filterPanelAppsLabel: t('chatSlashFilterPanelApps', language),
84
- filterSkillsLabel: t('chatSlashFilterSkills', language),
85
- panelAppHintLabel: t('chatSlashPanelAppHint', language),
86
- panelAppSectionLabel: t('chatPanelAppReferenceSection', language),
87
- skillHintLabel: t('chatSlashSkillHint', language),
88
- skillSectionLabel: t('chatSlashSectionSkills', language),
89
- },
90
- onSelectPanelApp,
91
- onSelectSkill,
92
- }),
93
- createContextReferenceInputSurfacePlugin({
94
- itemTexts: {
95
- context: {
96
- backLabel: t('chatContextReferenceBack', language),
97
- backDescription: t('chatContextReferenceBackDescription', language),
98
- backHintLabel: t('chatContextReferenceBackHint', language),
99
- currentDirectoryLabel: t('chatContextReferenceCurrentDirectory', language),
100
- directoryDescription: t('chatContextReferenceDirectoryDescription', language),
101
- fileDescription: t('chatContextReferenceFileDescription', language),
102
- filesDescription: t('chatContextReferenceFilesDescription', language),
103
- filesHintLabel: t('chatContextReferenceFilesHint', language),
104
- filesLabel: t('chatContextReferenceFilesLabel', language),
105
- filesSubtitle: t('chatContextReferenceFilesType', language),
106
- panelAppSectionLabel: t('chatPanelAppReferenceSection', language),
107
- parentLabel: t('chatContextReferenceParent', language),
108
- parentDescription: t('chatContextReferenceParentDescription', language),
109
- parentHintLabel: t('chatContextReferenceParentHint', language),
110
- projectDescription: t('chatContextReferenceProjectDescription', language),
111
- projectPathLabel: t('chatContextReferenceProjectPath', language),
112
- projectSectionLabel: t('chatContextReferenceProjectSection', language),
113
- projectSubtitle: t('chatContextReferenceProjectType', language),
114
- projectsDescription: t('chatContextReferenceProjectsDescription', language),
115
- projectsHintLabel: t('chatContextReferenceProjectsHint', language),
116
- projectsLabel: t('chatContextReferenceProjectsLabel', language),
117
- projectsLoadFailedLabel: t('chatContextReferenceProjectsLoadFailed', language),
118
- projectsSubtitle: t('chatContextReferenceProjectsType', language),
119
- projectRootLabel: t('chatContextReferenceProjectRoot', language),
120
- searchFailedLabel: t('chatContextReferenceSearchFailed', language),
121
- workspaceSectionLabel: t('chatContextReferenceWorkspaceSection', language),
122
- },
123
- panelApp: panelAppTexts,
124
- },
125
- menuTexts: {
126
- loadingLabel: t('chatContextReferenceLoading', language),
127
- sectionLabel: t('chatContextReferenceSection', language),
128
- emptyLabel: t('chatContextReferenceNoResult', language),
129
- hintLabel: t('chatContextReferenceHint', language),
130
- itemHintLabel: t('chatContextReferenceItemHint', language),
131
- },
132
- onNavigate,
133
- }),
134
- ];
135
- }
136
-
137
38
  function buildBrowsedReferenceEntries(params: {
138
39
  entries: readonly ServerPathEntryView[];
139
40
  parentRelativePath: string;
@@ -149,6 +50,43 @@ function buildBrowsedReferenceEntries(params: {
149
50
  }));
150
51
  }
151
52
 
53
+ function useContextReferenceCatalogQueries(params: {
54
+ inputSurfaceTrigger: ChatInputSurfaceTrigger | null;
55
+ isContextReferenceTrigger: boolean;
56
+ query: string;
57
+ referenceLocation: ContextReferenceLocation;
58
+ }) {
59
+ const {
60
+ inputSurfaceTrigger,
61
+ isContextReferenceTrigger,
62
+ query,
63
+ referenceLocation,
64
+ } = params;
65
+ const shouldLoadPanelApps =
66
+ (isContextReferenceTrigger && referenceLocation.view === 'root') ||
67
+ inputSurfaceTrigger?.key === CHAT_INPUT_SURFACE_SLASH_TRIGGER_SPEC.key;
68
+ const panelApps = usePanelApps({ enabled: shouldLoadPanelApps });
69
+ const projects = useProjects({
70
+ enabled: Boolean(
71
+ isContextReferenceTrigger &&
72
+ (referenceLocation.view === 'root' || referenceLocation.view === 'projects'),
73
+ ),
74
+ });
75
+ const objectType = referenceLocation.view === 'system-objects'
76
+ ? referenceLocation.objectType
77
+ : undefined;
78
+ const systemObjects = useSystemObjectReferences({
79
+ enabled: Boolean(
80
+ isContextReferenceTrigger &&
81
+ (referenceLocation.view === 'root' || referenceLocation.view === 'system-objects'),
82
+ ),
83
+ query,
84
+ limit: objectType ? 20 : 6,
85
+ objectType,
86
+ });
87
+ return { panelApps, projects, systemObjects };
88
+ }
89
+
152
90
  export function useChatInputSurfaceState(params: UseChatInputSurfaceStateParams) {
153
91
  const {
154
92
  isSkillsLoading,
@@ -156,6 +94,7 @@ export function useChatInputSurfaceState(params: UseChatInputSurfaceStateParams)
156
94
  language,
157
95
  onSelectPanelApp,
158
96
  onSelectSkill,
97
+ onSelectSystemObject,
159
98
  projectRoot,
160
99
  recentSkillValues,
161
100
  skillRecords,
@@ -176,26 +115,28 @@ export function useChatInputSurfaceState(params: UseChatInputSurfaceStateParams)
176
115
  setInputSurfaceTriggerState(nextTrigger);
177
116
  }, []);
178
117
  const isContextReferenceTrigger = inputSurfaceTrigger?.key === CONTEXT_REFERENCE_TRIGGER_SPEC.key;
179
- const referencePath = referenceLocation.view === 'files' ? referenceLocation.path : '';
118
+ const isWorkspaceReferenceView =
119
+ referenceLocation.view === 'files' || referenceLocation.view === 'folders';
120
+ const referencePath = isWorkspaceReferenceView ? referenceLocation.path : '';
180
121
  const deferredReferenceQuery = useDeferredValue(
181
122
  isContextReferenceTrigger ? inputSurfaceTrigger.query : '',
182
123
  );
183
124
  const isBrowsingServerPaths = Boolean(
184
125
  isContextReferenceTrigger &&
185
126
  projectRoot &&
186
- referenceLocation.view === 'files' &&
127
+ isWorkspaceReferenceView &&
187
128
  !deferredReferenceQuery.trim(),
188
129
  );
189
130
  const shouldSearchServerPaths = Boolean(
190
131
  isContextReferenceTrigger &&
191
132
  projectRoot &&
192
- referenceLocation.view !== 'projects' &&
133
+ (referenceLocation.view === 'root' || isWorkspaceReferenceView) &&
193
134
  deferredReferenceQuery.trim(),
194
135
  );
195
136
  const serverPathBrowse = useServerPathBrowse({
196
137
  path: referencePath || '.',
197
138
  basePath: projectRoot,
198
- includeFiles: true,
139
+ includeFiles: referenceLocation.view === 'files',
199
140
  enabled: isBrowsingServerPaths,
200
141
  });
201
142
  const serverPathSearch = useServerPathSearch({
@@ -218,19 +159,21 @@ export function useChatInputSurfaceState(params: UseChatInputSurfaceStateParams)
218
159
  serverPathSearch.data?.entries,
219
160
  ],
220
161
  );
221
- const shouldLoadPanelApps =
222
- isContextReferenceTrigger ||
223
- inputSurfaceTrigger?.key === CHAT_INPUT_SURFACE_SLASH_TRIGGER_SPEC.key;
224
- const panelApps = usePanelApps({ enabled: shouldLoadPanelApps });
225
- const projects = useProjects({ enabled: isContextReferenceTrigger });
162
+ const { panelApps, projects, systemObjects } = useContextReferenceCatalogQueries({
163
+ inputSurfaceTrigger,
164
+ isContextReferenceTrigger,
165
+ query: deferredReferenceQuery,
166
+ referenceLocation,
167
+ });
226
168
 
227
169
  const inputSurfacePlugins = useMemo(
228
- () => buildChatInputSurfacePlugins({
170
+ () => buildChatInputProductPlugins({
229
171
  commands,
230
172
  language,
231
173
  onNavigate: setReferenceLocation,
232
174
  onSelectPanelApp,
233
175
  onSelectSkill,
176
+ onSelectSystemObject,
234
177
  slashTexts: itemTexts.slashTexts,
235
178
  }),
236
179
  [
@@ -238,7 +181,8 @@ export function useChatInputSurfaceState(params: UseChatInputSurfaceStateParams)
238
181
  itemTexts.slashTexts,
239
182
  language,
240
183
  onSelectPanelApp,
241
- onSelectSkill
184
+ onSelectSkill,
185
+ onSelectSystemObject,
242
186
  ]
243
187
  );
244
188
  const inputSurfaceState = useMemo(
@@ -248,6 +192,7 @@ export function useChatInputSurfaceState(params: UseChatInputSurfaceStateParams)
248
192
  isProjectsLoading: projects.isLoading || projects.isFetching,
249
193
  isServerPathSearchLoading: activeServerPathQuery.isLoading || activeServerPathQuery.isFetching,
250
194
  isSkillsLoading,
195
+ isSystemObjectsLoading: systemObjects.isLoading || systemObjects.isFetching,
251
196
  panelApps: panelApps.data?.entries ?? [],
252
197
  projectRoot,
253
198
  projects: projects.data?.projects ?? [],
@@ -258,7 +203,9 @@ export function useChatInputSurfaceState(params: UseChatInputSurfaceStateParams)
258
203
  serverPathSearchError: activeServerPathQuery.error instanceof Error
259
204
  ? activeServerPathQuery.error.message
260
205
  : null,
261
- skillRecords
206
+ skillRecords,
207
+ systemObjectGroups: systemObjects.data?.groups ?? [],
208
+ systemObjectsError: systemObjects.error instanceof Error ? systemObjects.error.message : null,
262
209
  },
263
210
  plugins: inputSurfacePlugins,
264
211
  trigger: inputSurfaceTrigger
@@ -281,7 +228,11 @@ export function useChatInputSurfaceState(params: UseChatInputSurfaceStateParams)
281
228
  serverPathEntries,
282
229
  isSkillsLoading,
283
230
  recentSkillValues,
284
- skillRecords
231
+ skillRecords,
232
+ systemObjects.data?.groups,
233
+ systemObjects.error,
234
+ systemObjects.isFetching,
235
+ systemObjects.isLoading,
285
236
  ]
286
237
  );
287
238
 
@@ -4,8 +4,11 @@ import {
4
4
  CONTEXT_REFERENCE_TRIGGER_SPEC,
5
5
  createContextReferenceInputSurfacePlugin,
6
6
  } from '@/features/chat/features/input/input-surface-plugins/context-reference-plugin.utils';
7
- import type { ContextReferenceLocation } from '@/features/chat/features/input/input-surface-plugins/chat-input-product-plugin-adapters.types';
8
- import type { PanelAppEntryView, ProjectView } from '@/shared/lib/api';
7
+ import type {
8
+ ChatInputProductPluginData,
9
+ ContextReferenceLocation,
10
+ } from '@/features/chat/features/input/input-surface-plugins/chat-input-product-plugin-adapters.types';
11
+ import type { PanelAppEntryView, ProjectView, SystemObjectReferenceGroupView } from '@/shared/lib/api';
9
12
 
10
13
  function createPanelApp(): PanelAppEntryView {
11
14
  return {
@@ -35,7 +38,30 @@ function createProject(): ProjectView {
35
38
  };
36
39
  }
37
40
 
38
- function createPlugin(onNavigate = vi.fn()) {
41
+ function createSystemObjectGroup(
42
+ items: SystemObjectReferenceGroupView['items'] = [],
43
+ ): SystemObjectReferenceGroupView {
44
+ return {
45
+ objectType: 'cron-job',
46
+ label: {
47
+ default: 'Scheduled Tasks',
48
+ translations: { zh: '定时任务' },
49
+ },
50
+ description: {
51
+ default: 'Reference task schedules and instructions.',
52
+ translations: { zh: '引用任务计划和指令。' },
53
+ },
54
+ icon: 'calendar-clock',
55
+ order: 200,
56
+ items,
57
+ total: items.length,
58
+ };
59
+ }
60
+
61
+ function createPlugin(
62
+ onNavigate = vi.fn(),
63
+ onSelectSystemObject = vi.fn(),
64
+ ) {
39
65
  return createContextReferenceInputSurfacePlugin({
40
66
  itemTexts: {
41
67
  context: {
@@ -47,8 +73,12 @@ function createPlugin(onNavigate = vi.fn()) {
47
73
  fileDescription: 'File context',
48
74
  filesDescription: 'Browse project files',
49
75
  filesHintLabel: 'Enter to browse',
50
- filesLabel: 'Files & Folders',
76
+ filesLabel: 'Files',
51
77
  filesSubtitle: 'Project Context',
78
+ foldersDescription: 'Browse project folders',
79
+ foldersHintLabel: 'Enter to browse folders',
80
+ foldersLabel: 'Folders',
81
+ foldersSubtitle: 'Project Context',
52
82
  panelAppSectionLabel: 'Panel Apps',
53
83
  parentLabel: 'Up one folder',
54
84
  parentDescription: 'Browse parent',
@@ -64,7 +94,8 @@ function createPlugin(onNavigate = vi.fn()) {
64
94
  projectsSubtitle: 'Project Context',
65
95
  projectRootLabel: 'Project directory',
66
96
  searchFailedLabel: 'Search failed',
67
- workspaceSectionLabel: 'Files & Folders',
97
+ systemObjectGroupHintLabel: 'Browse category',
98
+ systemObjectSectionLabel: 'System Objects',
68
99
  },
69
100
  panelApp: {
70
101
  appIdLabel: 'App ID',
@@ -80,11 +111,15 @@ function createPlugin(onNavigate = vi.fn()) {
80
111
  hintLabel: 'Type @',
81
112
  itemHintLabel: 'Enter to reference',
82
113
  },
114
+ language: 'en',
83
115
  onNavigate,
116
+ onSelectSystemObject,
84
117
  });
85
118
  }
86
119
 
87
- function createData(referenceLocation: ContextReferenceLocation = { view: 'root' }) {
120
+ function createData(
121
+ referenceLocation: ContextReferenceLocation = { view: 'root' },
122
+ ): ChatInputProductPluginData {
88
123
  return {
89
124
  isPanelAppsLoading: false,
90
125
  isProjectsLoading: false,
@@ -116,11 +151,14 @@ function createData(referenceLocation: ContextReferenceLocation = { view: 'root'
116
151
  ],
117
152
  serverPathSearchError: null,
118
153
  skillRecords: [],
154
+ systemObjectGroups: [createSystemObjectGroup()],
155
+ systemObjectsError: null,
156
+ isSystemObjectsLoading: false,
119
157
  };
120
158
  }
121
159
 
122
160
  describe('context reference input surface plugin', () => {
123
- it('shows Files & Folders, Projects, and panel apps in the root @ menu', () => {
161
+ it('shows separate file, folder, project, and system-object entries in the root @ menu', () => {
124
162
  const state = resolveChatInputSurfaceState({
125
163
  plugins: [createPlugin()],
126
164
  trigger: {
@@ -134,15 +172,26 @@ describe('context reference input surface plugin', () => {
134
172
 
135
173
  expect(state.panel?.items).toEqual([
136
174
  expect.objectContaining({
137
- title: 'Files & Folders',
175
+ title: 'Files',
138
176
  icon: 'files',
139
177
  selectionBehavior: 'navigate',
140
178
  }),
179
+ expect.objectContaining({
180
+ title: 'Folders',
181
+ icon: 'folder',
182
+ selectionBehavior: 'navigate',
183
+ }),
141
184
  expect.objectContaining({
142
185
  title: 'Projects',
143
186
  icon: 'project',
144
187
  selectionBehavior: 'navigate',
145
188
  }),
189
+ expect.objectContaining({
190
+ title: 'Scheduled Tasks',
191
+ icon: 'calendar-clock',
192
+ selectionBehavior: 'navigate',
193
+ value: 'cron-job',
194
+ }),
146
195
  expect.objectContaining({
147
196
  key: 'panel-app:task-board',
148
197
  tokenKind: 'panel_app',
@@ -151,7 +200,55 @@ describe('context reference input surface plugin', () => {
151
200
  ]);
152
201
  });
153
202
 
154
- it('builds file and directory tokens with path previews in files mode', () => {
203
+ it('navigates into a provider group and browses only that group', () => {
204
+ const onNavigate = vi.fn();
205
+ const rootData = createData();
206
+ const rootState = resolveChatInputSurfaceState({
207
+ plugins: [createPlugin(onNavigate)],
208
+ trigger: {
209
+ ...CONTEXT_REFERENCE_TRIGGER_SPEC,
210
+ query: '',
211
+ start: 0,
212
+ end: 1,
213
+ },
214
+ data: rootData,
215
+ });
216
+ const groupItem = rootState.panel?.items.find(({ value }) => value === 'cron-job');
217
+
218
+ rootState.panel?.onSelectItem?.(groupItem!);
219
+ expect(onNavigate).toHaveBeenCalledWith({ view: 'system-objects', objectType: 'cron-job' });
220
+
221
+ const groupData = createData({ view: 'system-objects', objectType: 'cron-job' });
222
+ groupData.systemObjectGroups = [createSystemObjectGroup([{
223
+ uri: 'nextclaw://objects/cron-job/daily-review',
224
+ objectType: 'cron-job',
225
+ objectId: 'daily-review',
226
+ label: 'Daily review',
227
+ description: 'Review project risks',
228
+ updatedAt: '2026-08-11T00:00:00.000Z',
229
+ }])];
230
+ const groupState = resolveChatInputSurfaceState({
231
+ plugins: [createPlugin(onNavigate)],
232
+ trigger: {
233
+ ...CONTEXT_REFERENCE_TRIGGER_SPEC,
234
+ query: '',
235
+ start: 0,
236
+ end: 1,
237
+ },
238
+ data: groupData,
239
+ });
240
+
241
+ expect(groupState.panel?.items).toEqual([
242
+ expect.objectContaining({ title: 'Back', selectionBehavior: 'navigate' }),
243
+ expect.objectContaining({
244
+ title: 'Daily review',
245
+ sectionKey: 'system-objects:cron-job',
246
+ sectionLabel: 'Scheduled Tasks',
247
+ }),
248
+ ]);
249
+ });
250
+
251
+ it('returns only file tokens when searching in files mode', () => {
155
252
  const state = resolveChatInputSurfaceState({
156
253
  plugins: [createPlugin()],
157
254
  trigger: {
@@ -176,11 +273,6 @@ describe('context reference input surface plugin', () => {
176
273
  ],
177
274
  },
178
275
  }),
179
- expect.objectContaining({
180
- title: 'docs',
181
- tokenKind: 'workspace_directory',
182
- tokenKey: 'docs',
183
- }),
184
276
  ]);
185
277
  });
186
278
 
@@ -204,7 +296,154 @@ describe('context reference input surface plugin', () => {
204
296
  expect(item).not.toHaveProperty('tokenKind');
205
297
  });
206
298
 
207
- it('opens browsed directories and offers the current folder as a token', () => {
299
+ it('resolves system objects through an explicit selection action', () => {
300
+ const onSelectSystemObject = vi.fn();
301
+ const data = createData();
302
+ data.systemObjectGroups = [createSystemObjectGroup([{
303
+ uri: 'nextclaw://objects/cron-job/daily-review',
304
+ objectType: 'cron-job',
305
+ objectId: 'daily-review',
306
+ label: 'Daily review',
307
+ description: 'Summarize project risks every day',
308
+ updatedAt: '2026-08-11T00:00:00.000Z',
309
+ }])];
310
+ const state = resolveChatInputSurfaceState({
311
+ plugins: [createPlugin(vi.fn(), onSelectSystemObject)],
312
+ trigger: {
313
+ ...CONTEXT_REFERENCE_TRIGGER_SPEC,
314
+ query: 'daily',
315
+ start: 0,
316
+ end: 6,
317
+ },
318
+ data,
319
+ });
320
+ const item = state.panel?.items.find(({ title }) => title === 'Daily review');
321
+
322
+ expect(item).toMatchObject({
323
+ icon: 'calendar-clock',
324
+ selectionBehavior: 'action',
325
+ subtitle: 'Scheduled Tasks',
326
+ });
327
+ state.panel?.onSelectItem?.(item!);
328
+
329
+ expect(onSelectSystemObject).toHaveBeenCalledWith(
330
+ 'nextclaw://objects/cron-job/daily-review',
331
+ );
332
+ expect(item).not.toHaveProperty('tokenKind');
333
+ });
334
+ });
335
+
336
+ describe('context reference item behavior', () => {
337
+ it('separates file and folder search results at root and inside each entry', () => {
338
+ const plugin = createPlugin();
339
+ const rootState = resolveChatInputSurfaceState({
340
+ plugins: [plugin],
341
+ trigger: {
342
+ ...CONTEXT_REFERENCE_TRIGGER_SPEC,
343
+ query: 'project',
344
+ start: 0,
345
+ end: 8,
346
+ },
347
+ data: createData(),
348
+ });
349
+ const rootWorkspaceItems = rootState.panel?.items.filter(
350
+ ({ key }) => key.startsWith('workspace:'),
351
+ );
352
+ expect(rootWorkspaceItems).toEqual([
353
+ expect.objectContaining({
354
+ title: 'server-path.ts',
355
+ sectionKey: 'workspace-files',
356
+ sectionLabel: 'Files',
357
+ tokenKind: 'workspace_file',
358
+ }),
359
+ expect.objectContaining({
360
+ title: 'docs',
361
+ sectionKey: 'workspace-folders',
362
+ sectionLabel: 'Folders',
363
+ tokenKind: 'workspace_directory',
364
+ }),
365
+ ]);
366
+
367
+ const filesState = resolveChatInputSurfaceState({
368
+ plugins: [plugin],
369
+ trigger: {
370
+ ...CONTEXT_REFERENCE_TRIGGER_SPEC,
371
+ query: 'project',
372
+ start: 0,
373
+ end: 8,
374
+ },
375
+ data: createData({ view: 'files', path: '' }),
376
+ });
377
+ expect(filesState.panel?.items.slice(1)).toEqual([
378
+ expect.objectContaining({ title: 'server-path.ts', tokenKind: 'workspace_file' }),
379
+ ]);
380
+
381
+ const foldersState = resolveChatInputSurfaceState({
382
+ plugins: [plugin],
383
+ trigger: {
384
+ ...CONTEXT_REFERENCE_TRIGGER_SPEC,
385
+ query: 'project',
386
+ start: 0,
387
+ end: 8,
388
+ },
389
+ data: createData({ view: 'folders', path: '' }),
390
+ });
391
+ expect(foldersState.panel?.items.slice(1)).toEqual([
392
+ expect.objectContaining({ title: 'docs', tokenKind: 'workspace_directory' }),
393
+ ]);
394
+ });
395
+
396
+ it('keeps provider sections separate during global system object search', () => {
397
+ const data = createData();
398
+ const cronGroup = createSystemObjectGroup([{
399
+ uri: 'nextclaw://objects/cron-job/daily-review',
400
+ objectType: 'cron-job',
401
+ objectId: 'daily-review',
402
+ label: 'Daily review',
403
+ description: 'Daily task',
404
+ updatedAt: '2026-08-11T00:00:00.000Z',
405
+ }]);
406
+ data.systemObjectGroups = [{
407
+ ...createSystemObjectGroup([{
408
+ uri: 'nextclaw://objects/inbox-delivery/report-1',
409
+ objectType: 'inbox-delivery',
410
+ objectId: 'report-1',
411
+ label: 'Daily report',
412
+ description: 'Daily inbox report',
413
+ updatedAt: '2026-08-11T01:00:00.000Z',
414
+ }]),
415
+ objectType: 'inbox-delivery',
416
+ label: { default: 'Inbox Reports' },
417
+ icon: 'inbox',
418
+ order: 100,
419
+ }, cronGroup];
420
+ const state = resolveChatInputSurfaceState({
421
+ plugins: [createPlugin()],
422
+ trigger: {
423
+ ...CONTEXT_REFERENCE_TRIGGER_SPEC,
424
+ query: 'daily',
425
+ start: 0,
426
+ end: 6,
427
+ },
428
+ data,
429
+ });
430
+
431
+ expect(state.panel?.items.filter(({ key }) => key.startsWith('context-reference:system-object:')))
432
+ .toEqual([
433
+ expect.objectContaining({
434
+ title: 'Daily report',
435
+ sectionKey: 'system-objects:inbox-delivery',
436
+ sectionLabel: 'Inbox Reports',
437
+ }),
438
+ expect.objectContaining({
439
+ title: 'Daily review',
440
+ sectionKey: 'system-objects:cron-job',
441
+ sectionLabel: 'Scheduled Tasks',
442
+ }),
443
+ ]);
444
+ });
445
+
446
+ it('opens browsed folders and offers the current folder as a token', () => {
208
447
  const onNavigate = vi.fn();
209
448
  const rootState = resolveChatInputSurfaceState({
210
449
  plugins: [createPlugin(onNavigate)],
@@ -214,17 +453,25 @@ describe('context reference input surface plugin', () => {
214
453
  start: 0,
215
454
  end: 1,
216
455
  },
217
- data: createData({ view: 'files', path: '' }),
456
+ data: createData({ view: 'folders', path: '' }),
218
457
  });
219
458
  const directoryItem = rootState.panel?.items.find((item) => item.title === 'docs');
220
459
 
460
+ expect(rootState.panel?.items).toEqual(expect.arrayContaining([
461
+ expect.objectContaining({
462
+ title: 'Reference current folder',
463
+ subtitle: 'project',
464
+ tokenKind: 'workspace_directory',
465
+ tokenKey: '.',
466
+ }),
467
+ ]));
221
468
  expect(directoryItem).toMatchObject({
222
469
  selectionBehavior: 'navigate',
223
470
  value: 'docs',
224
471
  });
225
472
  expect(directoryItem?.tokenKind).toBeUndefined();
226
473
  rootState.panel?.onSelectItem?.(directoryItem!);
227
- expect(onNavigate).toHaveBeenCalledWith({ view: 'files', path: 'docs' });
474
+ expect(onNavigate).toHaveBeenCalledWith({ view: 'folders', path: 'docs' });
228
475
 
229
476
  const nestedState = resolveChatInputSurfaceState({
230
477
  plugins: [createPlugin(onNavigate)],
@@ -234,7 +481,7 @@ describe('context reference input surface plugin', () => {
234
481
  start: 0,
235
482
  end: 1,
236
483
  },
237
- data: createData({ view: 'files', path: 'docs' }),
484
+ data: createData({ view: 'folders', path: 'docs' }),
238
485
  });
239
486
  expect(nestedState.panel?.items).toEqual(expect.arrayContaining([
240
487
  expect.objectContaining({