@nextclaw/ui 0.15.25 → 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 (288) hide show
  1. package/CHANGELOG.md +18 -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-FK7tikI1.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-CocdcIko.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-BH7W5yCi.js → dist-AYxkFx2B.js} +1 -1
  68. package/dist/assets/{dist-CaYdVVeO.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-CVy0_kVl.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-j2bl79Ea.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-BKNrtK81.js → save-CGm23Yww.js} +1 -1
  122. package/dist/assets/{search-CkOm65W_.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-CJjtdFAl.js → secrets-config-page-BlPOuql_.js} +2 -2
  125. package/dist/assets/security-config-CbDiY2xr.js +1 -0
  126. package/dist/assets/{select-Ea7ffKCE.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-CtyN3m_V.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-C9l4xsKp.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 +6 -6
  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 +49 -1
  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 +25 -4
  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/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +82 -2
  179. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-text-selection.test.tsx +12 -8
  180. package/src/features/chat/features/workspace/components/chat-session-workspace-directory-browser.tsx +24 -12
  181. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +9 -2
  182. package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +52 -4
  183. package/src/features/chat/features/workspace/hooks/use-workspace-explorer-layout.ts +8 -11
  184. package/src/features/chat/features/workspace/hooks/use-workspace-file-actions.ts +68 -46
  185. package/src/features/chat/index.ts +1 -1
  186. package/src/features/chat/managers/chat-draft-intent.manager.ts +18 -2
  187. package/src/features/chat/stores/__tests__/chat-thread.store.test.ts +6 -0
  188. package/src/features/chat/stores/chat-thread.store.ts +6 -0
  189. package/src/features/inbox/components/inbox-reader-dialog.test.tsx +38 -5
  190. package/src/features/inbox/components/inbox-reader-dialog.tsx +5 -3
  191. package/src/features/inbox/managers/inbox.manager.test.ts +28 -3
  192. package/src/features/inbox/managers/inbox.manager.ts +14 -4
  193. package/src/features/inbox/pages/inbox-page.test.ts +121 -2
  194. package/src/features/inbox/pages/inbox-page.tsx +5 -3
  195. package/src/features/marketplace/components/__tests__/marketplace-page.test.tsx +85 -1
  196. package/src/features/marketplace/hooks/__tests__/use-marketplace.test.tsx +44 -1
  197. package/src/features/marketplace/hooks/use-marketplace-item-actions.ts +23 -2
  198. package/src/features/marketplace/hooks/use-marketplace.ts +10 -0
  199. package/src/features/marketplace/index.ts +4 -0
  200. package/src/features/panel-apps/index.ts +5 -1
  201. package/src/features/panel-apps/utils/__tests__/panel-app-doc-browser.utils.test.ts +13 -6
  202. package/src/features/panel-apps/utils/panel-app-doc-browser.utils.tsx +6 -3
  203. package/src/features/right-panel-resources/index.ts +1 -0
  204. package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +7 -4
  205. package/src/features/system-status/components/__tests__/desktop-update-config.test.tsx +20 -1
  206. package/src/features/system-status/components/desktop-update-config.tsx +14 -13
  207. package/src/features/system-status/managers/__tests__/runtime-update.manager.test.ts +99 -0
  208. package/src/features/system-status/managers/runtime-update.manager.ts +22 -0
  209. package/src/features/system-status/stores/runtime-update.store.ts +1 -0
  210. package/src/shared/components/ui/actions/__tests__/icon-action-button.test.tsx +15 -0
  211. package/src/shared/components/ui/actions/icon-action-button.tsx +4 -2
  212. package/src/shared/hooks/use-system-object-references.ts +22 -0
  213. package/src/shared/lib/api/types.ts +10 -0
  214. package/src/shared/lib/i18n/locales/en-US/chat.json +16 -9
  215. package/src/shared/lib/i18n/locales/en-US/desktop-update.json +7 -4
  216. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +40 -0
  217. package/src/shared/lib/i18n/locales/en-US/marketplace.json +3 -0
  218. package/src/shared/lib/i18n/locales/zh-CN/chat.json +18 -11
  219. package/src/shared/lib/i18n/locales/zh-CN/desktop-update.json +7 -4
  220. package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +40 -0
  221. package/src/shared/lib/i18n/locales/zh-CN/marketplace.json +3 -0
  222. package/dist/assets/appearance-settings-page-BYbvl2wj.js +0 -1
  223. package/dist/assets/architecture-TIHT7OUA-Bjp9jf0h.js +0 -1
  224. package/dist/assets/channel-5T3pdR-s.js +0 -1
  225. package/dist/assets/chat-page-C5E-LLVd.js +0 -1
  226. package/dist/assets/chunk-2Q5K7J3B-DTZ3tGfE.js +0 -1
  227. package/dist/assets/chunk-VAUOI2AC-HLGIHQ6k.js +0 -1
  228. package/dist/assets/chunk-XXDRQBXY-Dl0m6Ni-.js +0 -1
  229. package/dist/assets/classDiagram-OUVF2IWQ-DcDnzGNX.js +0 -1
  230. package/dist/assets/classDiagram-v2-EOCWNBFH-BKXKMzKM.js +0 -1
  231. package/dist/assets/config-split-page-CA_a0AJ5.js +0 -1
  232. package/dist/assets/confirm-dialog-CxZfenjK.js +0 -5
  233. package/dist/assets/cynefin-VYW2F7L2-BWg7U2UD.js +0 -1
  234. package/dist/assets/desktop-update-config-BEKC8Ly9.js +0 -1
  235. package/dist/assets/doc-browser-Cl2ldE3f.js +0 -1
  236. package/dist/assets/doc-browser-DXCSd63E.js +0 -1
  237. package/dist/assets/doc-browser-context-FDPs3gJf.js +0 -1
  238. package/dist/assets/eventmodeling-45OFAUF4-SB-J4tpq.js +0 -1
  239. package/dist/assets/flowDiagram-23GEKE2U-BQ_u-eLM.js +0 -1
  240. package/dist/assets/form-actions-0c0aw_bl.js +0 -1
  241. package/dist/assets/gitGraph-TEB2WS4Q-DPxNwsFd.js +0 -1
  242. package/dist/assets/i18n-provider-DkITJNz8.js +0 -1
  243. package/dist/assets/index-CQ2LcI2p.css +0 -1
  244. package/dist/assets/index-CrdfvBVg.js +0 -107
  245. package/dist/assets/info-DKCQHKI2-DNlNGH90.js +0 -1
  246. package/dist/assets/loader-circle-DHtUxCIA.js +0 -1
  247. package/dist/assets/mcp-marketplace-page-Bc_jI5iH.js +0 -9
  248. package/dist/assets/mcp-marketplace-page-CzCieD9r.js +0 -1
  249. package/dist/assets/model-config-page-C4jw-pcj.js +0 -1
  250. package/dist/assets/packet-7NZHBO7P-BpeiqkBZ.js +0 -1
  251. package/dist/assets/pie-RZYD4A2V-Cy1yxsPd.js +0 -1
  252. package/dist/assets/plus-CG1RwZQq.js +0 -1
  253. package/dist/assets/provider-scoped-model-input-CmH4BFvc.js +0 -1
  254. package/dist/assets/providers-config-page-CJQjwzaw.js +0 -1
  255. package/dist/assets/radar-I7S5WNFK-CEcPKCj8.js +0 -1
  256. package/dist/assets/railroad-3IZDKUUU-CW38eNDs.js +0 -1
  257. package/dist/assets/railroad-abnf-AHOZXSZD-ByrylcXf.js +0 -1
  258. package/dist/assets/railroad-ebnf-EBAXGLYW-CNB6GwP-.js +0 -1
  259. package/dist/assets/railroad-peg-LSFZ7HO6-x6hnqlBG.js +0 -1
  260. package/dist/assets/react-DjFBVA0n.js +0 -8
  261. package/dist/assets/remote-BIlpD3yL.js +0 -1
  262. package/dist/assets/rotate-cw-bKG8zH8M.js +0 -1
  263. package/dist/assets/runtime-config-page-B_x2Glz5.js +0 -1
  264. package/dist/assets/search-config-page-BaIijtmO.js +0 -1
  265. package/dist/assets/security-config-DB8apj09.js +0 -1
  266. package/dist/assets/skeleton-Bt6zxcAB.js +0 -1
  267. package/dist/assets/stateDiagram-v2-6OUMAXLB-ZC6dFORv.js +0 -1
  268. package/dist/assets/swimlanesDiagram-G3AALYLV-CRkh51Im.js +0 -8
  269. package/dist/assets/treeView-QDETBFTQ-Bw0DSCH7.js +0 -1
  270. package/dist/assets/treemap-6X3UGDF4-DFWBFcfh.js +0 -1
  271. package/dist/assets/wardley-OPB4EBWU-CoWturk0.js +0 -1
  272. package/dist/assets/x-CowtCu9Z.js +0 -1
  273. /package/dist/assets/{array-NADKd9aU.js → array-BQVzeGRt.js} +0 -0
  274. /package/dist/assets/{chunk-KEIR6QF5-BuyuzJJL.js → chunk-KEIR6QF5-f9psyCXK.js} +0 -0
  275. /package/dist/assets/{chunk-Y2CYZVJY-D_B2ZRNt.js → chunk-Y2CYZVJY-D1mAU_Po.js} +0 -0
  276. /package/dist/assets/{config-hints-BcfVUMij.js → config-hints-nV5HPOvq.js} +0 -0
  277. /package/dist/assets/{cytoscape.esm-BANTlgza.js → cytoscape.esm-0uDtdD0l.js} +0 -0
  278. /package/dist/assets/{defaultLocale-C4_L0aEs.js → defaultLocale-DSWXGgt0.js} +0 -0
  279. /package/dist/assets/{dist-DAPEIJbz.js → dist--ta5rX12.js} +0 -0
  280. /package/dist/assets/{graphlib-ChqXg0dI.js → graphlib-CQ6QV4yP.js} +0 -0
  281. /package/dist/assets/{host-capabilities-D9C4CBK5.js → host-capabilities-Tk038i04.js} +0 -0
  282. /package/dist/assets/{init-D8wZg9xq.js → init-Y6h9jGtZ.js} +0 -0
  283. /package/dist/assets/{jszip.min-CkbBfwAQ.js → jszip.min-8hyJpgpx.js} +0 -0
  284. /package/dist/assets/{katex-TZJFa0J_.js → katex-ARhY9PS1.js} +0 -0
  285. /package/dist/assets/{middleware-B3k-TSmZ.js → middleware-DXsbf9xI.js} +0 -0
  286. /package/dist/assets/{path-DodfxcX7.js → path-10BjdyLh.js} +0 -0
  287. /package/dist/assets/{rough.esm-CUaa1Rbe.js → rough.esm-DxgC_14r.js} +0 -0
  288. /package/dist/assets/{xlsx-CxByi7bR.js → xlsx-DrDuDNAa.js} +0 -0
@@ -5,7 +5,8 @@ import {
5
5
  type ChatInputSurfacePlugin,
6
6
  type ChatInputSurfaceTriggerSpec,
7
7
  } from '@nextclaw/agent-chat-ui';
8
- import type { PanelAppEntryView } from '@/shared/lib/api';
8
+ import type { ServerPathSearchEntryView } from '@/shared/lib/api';
9
+ import type { I18nLanguage } from '@/shared/lib/i18n';
9
10
  import type {
10
11
  ChatInputProductPluginData,
11
12
  ContextReferenceLocation,
@@ -14,129 +15,94 @@ import {
14
15
  buildBackNavigationItem,
15
16
  buildCurrentDirectoryReferenceItem,
16
17
  buildFilesNavigationItem,
18
+ buildFoldersNavigationItem,
17
19
  buildProjectReferenceItems,
18
20
  buildProjectsNavigationItem,
21
+ buildSystemObjectGroupNavigationItems,
19
22
  buildWorkspaceReferenceItems,
23
+ buildSystemObjectReferenceItems,
24
+ FILES_SECTION_KEY,
20
25
  FILES_NAVIGATION_ITEM_KEY,
26
+ FOLDERS_NAVIGATION_ITEM_KEY,
27
+ FOLDERS_SECTION_KEY,
21
28
  PROJECTS_NAVIGATION_ITEM_KEY,
22
29
  ROOT_NAVIGATION_ITEM_KEY,
30
+ SYSTEM_OBJECT_GROUP_ITEM_KEY_PREFIX,
31
+ SYSTEM_OBJECT_ITEM_KEY_PREFIX,
23
32
  type ContextReferenceInputSurfaceTexts,
24
33
  } from './context-reference-items.utils';
25
34
  import {
26
- scoreInputSurfaceSearchCandidate,
27
- resolveInputSurfaceMatchTier,
28
- } from './input-surface-search.utils';
29
-
30
- const PANEL_APP_SECTION_KEY = 'panel-apps';
35
+ buildPanelAppReferenceItems,
36
+ type PanelAppInputSurfaceItemTexts,
37
+ } from './panel-app-input-surface-items.utils';
31
38
 
32
39
  export const CONTEXT_REFERENCE_TRIGGER_SPEC: ChatInputSurfaceTriggerSpec = {
33
40
  key: 'context-reference',
34
41
  marker: '@',
35
42
  };
36
43
 
37
- export type PanelAppInputSurfaceItemTexts = {
38
- appIdLabel: string;
39
- fileLabel: string;
40
- noDescriptionLabel: string;
41
- subtitle: string;
42
- };
43
-
44
- function getPanelAppActivityTime(entry: PanelAppEntryView): number {
45
- return Date.parse(entry.lastOpenedAt ?? entry.updatedAt) || 0;
46
- }
47
-
48
- function resolvePanelAppInputSurfaceEntries(params: {
49
- entries: readonly PanelAppEntryView[];
50
- query: string;
51
- }): PanelAppEntryView[] {
52
- const collator = new Intl.Collator(undefined, { sensitivity: 'base', numeric: true });
53
- return params.entries
54
- .map((entry, order) => ({
55
- entry,
56
- order,
57
- score: scoreInputSurfaceSearchCandidate(
58
- {
59
- id: entry.appId,
60
- label: entry.title || entry.appId,
61
- description: entry.description,
62
- aliases: [entry.id, entry.fileName],
63
- },
64
- params.query,
65
- ),
66
- }))
67
- .filter((entry) => entry.score > 0)
68
- .sort((left, right) => {
69
- const leftTier = resolveInputSurfaceMatchTier(left.score);
70
- const rightTier = resolveInputSurfaceMatchTier(right.score);
71
- if (rightTier !== leftTier) {
72
- return rightTier - leftTier;
73
- }
74
- if (left.entry.favorite !== right.entry.favorite) {
75
- return left.entry.favorite ? -1 : 1;
76
- }
77
- const rightActivity = getPanelAppActivityTime(right.entry);
78
- const leftActivity = getPanelAppActivityTime(left.entry);
79
- if (rightActivity !== leftActivity) {
80
- return rightActivity - leftActivity;
81
- }
82
- if (right.score !== left.score) {
83
- return right.score - left.score;
84
- }
85
- const labelCompare = collator.compare(left.entry.title || left.entry.appId, right.entry.title || right.entry.appId);
86
- return labelCompare || left.order - right.order;
87
- })
88
- .map(({ entry }) => entry);
89
- }
90
-
91
- function buildPanelAppInputSurfaceItemEntries(params: {
92
- entries: readonly PanelAppEntryView[];
93
- keyPrefix?: string;
94
- query: string;
95
- texts: PanelAppInputSurfaceItemTexts;
96
- }): Array<{ entry: PanelAppEntryView; item: ChatInputSurfaceItem }> {
97
- const keyPrefix = params.keyPrefix ?? 'panel-app';
98
- return resolvePanelAppInputSurfaceEntries({
99
- entries: params.entries,
100
- query: params.query,
101
- }).map((entry) => ({
102
- entry,
103
- item: {
104
- key: `${keyPrefix}:${entry.appId}`,
105
- icon: 'panel-app',
106
- title: entry.title || entry.appId,
107
- subtitle: params.texts.subtitle,
108
- description: (entry.description ?? '').trim() || params.texts.noDescriptionLabel,
109
- detailLines: [
110
- `${params.texts.appIdLabel}: ${entry.appId}`,
111
- `${params.texts.fileLabel}: ${entry.fileName}`,
112
- ],
113
- },
114
- }));
115
- }
116
-
117
- export function buildPanelAppInputSurfaceItems(params: {
118
- entries: readonly PanelAppEntryView[];
119
- keyPrefix?: string;
120
- query: string;
121
- texts: PanelAppInputSurfaceItemTexts;
122
- }): ChatInputSurfaceItem[] {
123
- return buildPanelAppInputSurfaceItemEntries(params).map(({ item }) => item);
44
+ function buildWorkspaceItemSets(params: {
45
+ entries: readonly ServerPathSearchEntryView[];
46
+ isBrowsing: boolean;
47
+ isFoldersMode: boolean;
48
+ projectRoot: string;
49
+ texts: ContextReferenceInputSurfaceTexts;
50
+ }) {
51
+ const { entries, isBrowsing, isFoldersMode, projectRoot, texts } = params;
52
+ const buildItems = (
53
+ itemEntries: readonly ServerPathSearchEntryView[],
54
+ kind: 'files' | 'folders',
55
+ navigateDirectories: boolean,
56
+ ) => buildWorkspaceReferenceItems({
57
+ entries: itemEntries,
58
+ navigateDirectories,
59
+ projectRoot,
60
+ sectionKey: kind === 'folders' ? FOLDERS_SECTION_KEY : FILES_SECTION_KEY,
61
+ sectionLabel: kind === 'folders' ? texts.foldersLabel : texts.filesLabel,
62
+ texts,
63
+ });
64
+ return {
65
+ browsedItems: buildItems(entries, isFoldersMode ? 'folders' : 'files', isBrowsing),
66
+ fileItems: buildItems(entries.filter(({ kind }) => kind === 'file'), 'files', false),
67
+ folderItems: buildItems(entries.filter(({ kind }) => kind === 'directory'), 'folders', false),
68
+ };
124
69
  }
125
70
 
126
- function buildPanelAppReferenceItems(params: {
127
- entries: readonly PanelAppEntryView[];
128
- query: string;
129
- sectionLabel: string;
130
- texts: PanelAppInputSurfaceItemTexts;
131
- }): ChatInputSurfaceItem[] {
132
- return buildPanelAppInputSurfaceItemEntries(params).map(({ entry, item }) => ({
133
- ...item,
134
- sectionKey: PANEL_APP_SECTION_KEY,
135
- sectionLabel: params.sectionLabel,
136
- tokenKind: 'panel_app',
137
- tokenKey: entry.appId,
138
- value: entry.appId,
139
- }));
71
+ function handleContextReferenceItemSelect(params: {
72
+ isFoldersMode: boolean;
73
+ isWorkspaceMode: boolean;
74
+ item: ChatInputSurfaceItem;
75
+ onNavigate: (location: ContextReferenceLocation) => void;
76
+ onSelectSystemObject: (uri: string) => void;
77
+ referencePath: string;
78
+ }): void {
79
+ const {
80
+ isFoldersMode,
81
+ isWorkspaceMode,
82
+ item,
83
+ onNavigate,
84
+ onSelectSystemObject,
85
+ referencePath,
86
+ } = params;
87
+ if (item.key === FILES_NAVIGATION_ITEM_KEY) {
88
+ onNavigate({ view: 'files', path: '' });
89
+ } else if (item.key === FOLDERS_NAVIGATION_ITEM_KEY) {
90
+ onNavigate({ view: 'folders', path: '' });
91
+ } else if (item.key === PROJECTS_NAVIGATION_ITEM_KEY) {
92
+ onNavigate({ view: 'projects' });
93
+ } else if (item.key === ROOT_NAVIGATION_ITEM_KEY) {
94
+ onNavigate(
95
+ isWorkspaceMode && referencePath
96
+ ? { view: isFoldersMode ? 'folders' : 'files', path: item.value ?? '' }
97
+ : { view: 'root' },
98
+ );
99
+ } else if (item.key.startsWith(SYSTEM_OBJECT_GROUP_ITEM_KEY_PREFIX) && item.value) {
100
+ onNavigate({ view: 'system-objects', objectType: item.value });
101
+ } else if (item.selectionBehavior === 'navigate' && item.value) {
102
+ onNavigate({ view: isFoldersMode ? 'folders' : 'files', path: item.value });
103
+ } else if (item.key.startsWith(SYSTEM_OBJECT_ITEM_KEY_PREFIX) && item.value) {
104
+ onSelectSystemObject(item.value);
105
+ }
140
106
  }
141
107
 
142
108
  export function createContextReferenceInputSurfacePlugin(params: {
@@ -145,21 +111,29 @@ export function createContextReferenceInputSurfacePlugin(params: {
145
111
  panelApp: PanelAppInputSurfaceItemTexts;
146
112
  };
147
113
  menuTexts: ChatInputSurfaceMenuTexts;
114
+ language: I18nLanguage;
148
115
  onNavigate: (location: ContextReferenceLocation) => void;
116
+ onSelectSystemObject: (uri: string) => void;
149
117
  }): ChatInputSurfacePlugin<ChatInputProductPluginData> {
150
118
  return createInputSurfaceTriggeredPanelPlugin({
151
119
  key: 'context-reference',
152
120
  trigger: CONTEXT_REFERENCE_TRIGGER_SPEC,
153
121
  resolvePanel: ({ data, trigger }) => {
154
122
  const isFilesMode = data.referenceLocation.view === 'files';
123
+ const isFoldersMode = data.referenceLocation.view === 'folders';
155
124
  const isProjectsMode = data.referenceLocation.view === 'projects';
156
- const isBrowsing = isFilesMode && !trigger.query.trim();
157
- const referencePath = data.referenceLocation.view === 'files'
125
+ const isSystemObjectsMode = data.referenceLocation.view === 'system-objects';
126
+ const isWorkspaceMode = isFilesMode || isFoldersMode;
127
+ const hasQuery = Boolean(trigger.query.trim());
128
+ const isBrowsing = isWorkspaceMode && !hasQuery;
129
+ const referencePath = data.referenceLocation.view === 'files' ||
130
+ data.referenceLocation.view === 'folders'
158
131
  ? data.referenceLocation.path
159
132
  : '';
160
- const workspaceItems = buildWorkspaceReferenceItems({
133
+ const { browsedItems, fileItems, folderItems } = buildWorkspaceItemSets({
161
134
  entries: data.serverPathEntries,
162
- navigateDirectories: isBrowsing,
135
+ isBrowsing,
136
+ isFoldersMode,
163
137
  projectRoot: data.projectRoot,
164
138
  texts: params.itemTexts.context,
165
139
  });
@@ -168,22 +142,36 @@ export function createContextReferenceInputSurfacePlugin(params: {
168
142
  query: trigger.query,
169
143
  texts: params.itemTexts.context,
170
144
  });
171
- const currentDirectoryItem = isBrowsing && referencePath
145
+ const currentDirectoryItem = isFoldersMode && isBrowsing
172
146
  ? buildCurrentDirectoryReferenceItem({
173
147
  projectRoot: data.projectRoot,
174
148
  referencePath,
175
149
  texts: params.itemTexts.context,
176
150
  })
177
151
  : null;
152
+ const systemObjectGroups = data.systemObjectGroups ?? [];
153
+ const systemObjectItems = buildSystemObjectReferenceItems({
154
+ groups: systemObjectGroups,
155
+ language: params.language,
156
+ texts: params.itemTexts.context,
157
+ });
178
158
  const items = isFilesMode
179
159
  ? [
180
160
  buildBackNavigationItem({
181
161
  location: data.referenceLocation,
182
162
  texts: params.itemTexts.context,
183
163
  }),
184
- ...(currentDirectoryItem ? [currentDirectoryItem] : []),
185
- ...workspaceItems,
164
+ ...(isBrowsing ? browsedItems : fileItems),
186
165
  ]
166
+ : isFoldersMode
167
+ ? [
168
+ buildBackNavigationItem({
169
+ location: data.referenceLocation,
170
+ texts: params.itemTexts.context,
171
+ }),
172
+ ...(currentDirectoryItem ? [currentDirectoryItem] : []),
173
+ ...(isBrowsing ? browsedItems : folderItems),
174
+ ]
187
175
  : isProjectsMode
188
176
  ? [
189
177
  buildBackNavigationItem({
@@ -192,11 +180,28 @@ export function createContextReferenceInputSurfacePlugin(params: {
192
180
  }),
193
181
  ...projectItems,
194
182
  ]
183
+ : isSystemObjectsMode
184
+ ? [
185
+ buildBackNavigationItem({
186
+ location: data.referenceLocation,
187
+ texts: params.itemTexts.context,
188
+ }),
189
+ ...systemObjectItems,
190
+ ]
195
191
  : [
196
192
  buildFilesNavigationItem(params.itemTexts.context),
193
+ buildFoldersNavigationItem(params.itemTexts.context),
197
194
  buildProjectsNavigationItem(params.itemTexts.context),
198
- ...(trigger.query ? workspaceItems : []),
199
- ...(trigger.query ? projectItems : []),
195
+ ...(hasQuery ? fileItems : []),
196
+ ...(hasQuery ? folderItems : []),
197
+ ...(hasQuery ? projectItems : []),
198
+ ...(hasQuery
199
+ ? systemObjectItems
200
+ : buildSystemObjectGroupNavigationItems({
201
+ groups: systemObjectGroups,
202
+ language: params.language,
203
+ texts: params.itemTexts.context,
204
+ })),
200
205
  ...buildPanelAppReferenceItems({
201
206
  entries: data.panelApps,
202
207
  query: trigger.query,
@@ -204,17 +209,23 @@ export function createContextReferenceInputSurfacePlugin(params: {
204
209
  texts: params.itemTexts.panelApp,
205
210
  }),
206
211
  ];
207
- const relevantLoading = isFilesMode
212
+ const relevantLoading = isWorkspaceMode
208
213
  ? data.isServerPathSearchLoading
209
214
  : isProjectsMode
210
215
  ? data.isProjectsLoading
211
- : data.isPanelAppsLoading ||
212
- (Boolean(trigger.query) && (data.isProjectsLoading || data.isServerPathSearchLoading));
213
- const errorMessage = isProjectsMode && data.projectsError
214
- ? `${params.itemTexts.context.projectsLoadFailedLabel}: ${data.projectsError}`
215
- : data.serverPathSearchError
216
- ? `${params.itemTexts.context.searchFailedLabel}: ${data.serverPathSearchError}`
217
- : null;
216
+ : isSystemObjectsMode
217
+ ? Boolean(data.isSystemObjectsLoading)
218
+ : data.isPanelAppsLoading || Boolean(data.isSystemObjectsLoading) ||
219
+ (hasQuery && (data.isProjectsLoading || data.isServerPathSearchLoading));
220
+ const isRootMode = !isWorkspaceMode && !isProjectsMode && !isSystemObjectsMode;
221
+ let errorMessage: string | null = null;
222
+ if (isProjectsMode && data.projectsError) {
223
+ errorMessage = `${params.itemTexts.context.projectsLoadFailedLabel}: ${data.projectsError}`;
224
+ } else if ((isSystemObjectsMode || isRootMode) && data.systemObjectsError) {
225
+ errorMessage = `${params.itemTexts.context.searchFailedLabel}: ${data.systemObjectsError}`;
226
+ } else if ((isWorkspaceMode || isRootMode) && data.serverPathSearchError) {
227
+ errorMessage = `${params.itemTexts.context.searchFailedLabel}: ${data.serverPathSearchError}`;
228
+ }
218
229
  return {
219
230
  isLoading: isProjectsMode ? relevantLoading : relevantLoading && items.length === 0,
220
231
  items,
@@ -224,21 +235,14 @@ export function createContextReferenceInputSurfacePlugin(params: {
224
235
  tone: 'error',
225
236
  }
226
237
  : undefined,
227
- onSelectItem: (item) => {
228
- if (item.key === FILES_NAVIGATION_ITEM_KEY) {
229
- params.onNavigate({ view: 'files', path: '' });
230
- } else if (item.key === PROJECTS_NAVIGATION_ITEM_KEY) {
231
- params.onNavigate({ view: 'projects' });
232
- } else if (item.key === ROOT_NAVIGATION_ITEM_KEY) {
233
- params.onNavigate(
234
- isFilesMode && referencePath
235
- ? { view: 'files', path: item.value ?? '' }
236
- : { view: 'root' },
237
- );
238
- } else if (item.selectionBehavior === 'navigate' && item.value) {
239
- params.onNavigate({ view: 'files', path: item.value });
240
- }
241
- },
238
+ onSelectItem: (item) => handleContextReferenceItemSelect({
239
+ isFoldersMode,
240
+ isWorkspaceMode,
241
+ item,
242
+ onNavigate: params.onNavigate,
243
+ onSelectSystemObject: params.onSelectSystemObject,
244
+ referencePath,
245
+ }),
242
246
  texts: params.menuTexts,
243
247
  };
244
248
  },
@@ -0,0 +1,116 @@
1
+ import type { ChatInputSurfaceItem } from '@nextclaw/agent-chat-ui';
2
+ import type { PanelAppEntryView } from '@/shared/lib/api';
3
+ import {
4
+ resolveInputSurfaceMatchTier,
5
+ scoreInputSurfaceSearchCandidate,
6
+ } from './input-surface-search.utils';
7
+
8
+ const PANEL_APP_SECTION_KEY = 'panel-apps';
9
+
10
+ export type PanelAppInputSurfaceItemTexts = {
11
+ appIdLabel: string;
12
+ fileLabel: string;
13
+ noDescriptionLabel: string;
14
+ subtitle: string;
15
+ };
16
+
17
+ function getPanelAppActivityTime(entry: PanelAppEntryView): number {
18
+ return Date.parse(entry.lastOpenedAt ?? entry.updatedAt) || 0;
19
+ }
20
+
21
+ function resolvePanelAppInputSurfaceEntries(params: {
22
+ entries: readonly PanelAppEntryView[];
23
+ query: string;
24
+ }): PanelAppEntryView[] {
25
+ const collator = new Intl.Collator(undefined, { sensitivity: 'base', numeric: true });
26
+ return params.entries
27
+ .map((entry, order) => ({
28
+ entry,
29
+ order,
30
+ score: scoreInputSurfaceSearchCandidate(
31
+ {
32
+ id: entry.appId,
33
+ label: entry.title || entry.appId,
34
+ description: entry.description,
35
+ aliases: [entry.id, entry.fileName],
36
+ },
37
+ params.query,
38
+ ),
39
+ }))
40
+ .filter((entry) => entry.score > 0)
41
+ .sort((left, right) => {
42
+ const leftTier = resolveInputSurfaceMatchTier(left.score);
43
+ const rightTier = resolveInputSurfaceMatchTier(right.score);
44
+ if (rightTier !== leftTier) {
45
+ return rightTier - leftTier;
46
+ }
47
+ if (left.entry.favorite !== right.entry.favorite) {
48
+ return left.entry.favorite ? -1 : 1;
49
+ }
50
+ const rightActivity = getPanelAppActivityTime(right.entry);
51
+ const leftActivity = getPanelAppActivityTime(left.entry);
52
+ if (rightActivity !== leftActivity) {
53
+ return rightActivity - leftActivity;
54
+ }
55
+ if (right.score !== left.score) {
56
+ return right.score - left.score;
57
+ }
58
+ const labelCompare = collator.compare(
59
+ left.entry.title || left.entry.appId,
60
+ right.entry.title || right.entry.appId,
61
+ );
62
+ return labelCompare || left.order - right.order;
63
+ })
64
+ .map(({ entry }) => entry);
65
+ }
66
+
67
+ function buildPanelAppInputSurfaceItemEntries(params: {
68
+ entries: readonly PanelAppEntryView[];
69
+ keyPrefix?: string;
70
+ query: string;
71
+ texts: PanelAppInputSurfaceItemTexts;
72
+ }): Array<{ entry: PanelAppEntryView; item: ChatInputSurfaceItem }> {
73
+ const keyPrefix = params.keyPrefix ?? 'panel-app';
74
+ return resolvePanelAppInputSurfaceEntries({
75
+ entries: params.entries,
76
+ query: params.query,
77
+ }).map((entry) => ({
78
+ entry,
79
+ item: {
80
+ key: `${keyPrefix}:${entry.appId}`,
81
+ icon: 'panel-app',
82
+ title: entry.title || entry.appId,
83
+ subtitle: params.texts.subtitle,
84
+ description: (entry.description ?? '').trim() || params.texts.noDescriptionLabel,
85
+ detailLines: [
86
+ `${params.texts.appIdLabel}: ${entry.appId}`,
87
+ `${params.texts.fileLabel}: ${entry.fileName}`,
88
+ ],
89
+ },
90
+ }));
91
+ }
92
+
93
+ export function buildPanelAppInputSurfaceItems(params: {
94
+ entries: readonly PanelAppEntryView[];
95
+ keyPrefix?: string;
96
+ query: string;
97
+ texts: PanelAppInputSurfaceItemTexts;
98
+ }): ChatInputSurfaceItem[] {
99
+ return buildPanelAppInputSurfaceItemEntries(params).map(({ item }) => item);
100
+ }
101
+
102
+ export function buildPanelAppReferenceItems(params: {
103
+ entries: readonly PanelAppEntryView[];
104
+ query: string;
105
+ sectionLabel: string;
106
+ texts: PanelAppInputSurfaceItemTexts;
107
+ }): ChatInputSurfaceItem[] {
108
+ return buildPanelAppInputSurfaceItemEntries(params).map(({ entry, item }) => ({
109
+ ...item,
110
+ sectionKey: PANEL_APP_SECTION_KEY,
111
+ sectionLabel: params.sectionLabel,
112
+ tokenKind: 'panel_app',
113
+ tokenKey: entry.appId,
114
+ value: entry.appId,
115
+ }));
116
+ }
@@ -12,7 +12,7 @@ import type { ChatInputBarAdapterTexts } from '@/features/chat/types/chat-input-
12
12
  import {
13
13
  buildPanelAppInputSurfaceItems,
14
14
  type PanelAppInputSurfaceItemTexts,
15
- } from './context-reference-plugin.utils';
15
+ } from './panel-app-input-surface-items.utils';
16
16
  import {
17
17
  resolveInputSurfaceMatchTier,
18
18
  scoreInputSurfaceSearchCandidate,
@@ -194,6 +194,11 @@ describe('chat inline token workspace references', () => {
194
194
  tokenKey: 'docs/设计',
195
195
  label: '设计',
196
196
  }),
197
+ createChatComposerTokenNode({
198
+ tokenKind: 'workspace_directory',
199
+ tokenKey: '.',
200
+ label: 'project root',
201
+ }),
197
202
  ]),
198
203
  ).toEqual([
199
204
  {
@@ -208,9 +213,15 @@ describe('chat inline token workspace references', () => {
208
213
  label: '设计',
209
214
  rawText: '@folder:docs%2F%E8%AE%BE%E8%AE%A1',
210
215
  },
216
+ {
217
+ kind: 'workspace_directory',
218
+ key: '.',
219
+ label: 'project root',
220
+ rawText: '@folder:.',
221
+ },
211
222
  ]);
212
223
  expect(
213
- buildInlineTokensFromTextProtocol('review @file:src%2Ffile%20name.ts and @folder:docs%2F%E8%AE%BE%E8%AE%A1'),
224
+ buildInlineTokensFromTextProtocol('review @file:src%2Ffile%20name.ts and @folder:docs%2F%E8%AE%BE%E8%AE%A1 plus @folder:.'),
214
225
  ).toEqual([
215
226
  {
216
227
  kind: 'workspace_file',
@@ -224,6 +235,12 @@ describe('chat inline token workspace references', () => {
224
235
  label: '设计',
225
236
  rawText: '@folder:docs%2F%E8%AE%BE%E8%AE%A1',
226
237
  },
238
+ {
239
+ kind: 'workspace_directory',
240
+ key: '.',
241
+ label: '.',
242
+ rawText: '@folder:.'
243
+ },
227
244
  ]);
228
245
  });
229
246
 
@@ -307,6 +324,41 @@ describe('chat inline token workspace references', () => {
307
324
  })).toEqual(tokens);
308
325
  });
309
326
 
327
+ it('round-trips a visible system object token with its resolved snapshot', () => {
328
+ const reference = {
329
+ uri: 'nextclaw://objects/inbox-delivery/delivery-1',
330
+ objectType: 'inbox-delivery',
331
+ objectId: 'delivery-1',
332
+ label: 'OOM investigation report',
333
+ description: 'Root cause and mitigation',
334
+ updatedAt: '2026-08-11T00:00:00.000Z',
335
+ version: 'sha256-report',
336
+ assetUri: 'asset://store/report',
337
+ fileName: 'oom-investigation-report.md',
338
+ mimeType: 'text/markdown',
339
+ sizeBytes: 128,
340
+ };
341
+ const tokens = buildInlineTokensFromComposer([
342
+ createChatComposerTokenNode({
343
+ tokenKind: 'system_object',
344
+ tokenKey: reference.uri,
345
+ label: reference.label,
346
+ data: { reference },
347
+ }),
348
+ ]);
349
+
350
+ expect(tokens).toEqual([{
351
+ kind: 'system_object',
352
+ key: reference.uri,
353
+ label: reference.label,
354
+ rawText: `@object:${encodeURIComponent(reference.uri)}`,
355
+ reference,
356
+ }]);
357
+ expect(readInlineTokensFromMetadata({
358
+ ui_inline_tokens: createInlineTokensMetadata(tokens),
359
+ })).toEqual(tokens);
360
+ });
361
+
310
362
  it('resolves workspace token paths inside POSIX and Windows project roots', () => {
311
363
  expect(resolveWorkspaceReferencePath({
312
364
  projectRoot: '/tmp/project/',
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  CHAT_CONVERSATION_EXCERPT_TOKEN_KIND,
3
3
  CHAT_PROJECT_TOKEN_KIND,
4
+ CHAT_SYSTEM_OBJECT_TOKEN_KIND,
4
5
  CHAT_WORKSPACE_DIRECTORY_TOKEN_KIND,
5
6
  CHAT_WORKSPACE_EXCERPT_TOKEN_KIND,
6
7
  CHAT_WORKSPACE_FILE_TOKEN_KIND,
@@ -13,6 +14,7 @@ const CHAT_WORKSPACE_FILE_TOKEN_PREFIX = '@file:';
13
14
  const CHAT_WORKSPACE_DIRECTORY_TOKEN_PREFIX = '@folder:';
14
15
  const CHAT_WORKSPACE_EXCERPT_TOKEN_PREFIX = '@excerpt:';
15
16
  const CHAT_CONVERSATION_EXCERPT_TOKEN_PREFIX = '@message-excerpt:';
17
+ const CHAT_SYSTEM_OBJECT_TOKEN_PREFIX = '@object:';
16
18
 
17
19
  export function serializeChatComposerTokenText(params: {
18
20
  label?: string;
@@ -41,5 +43,8 @@ export function serializeChatComposerTokenText(params: {
41
43
  if (tokenKind === CHAT_CONVERSATION_EXCERPT_TOKEN_KIND) {
42
44
  return `${CHAT_CONVERSATION_EXCERPT_TOKEN_PREFIX}${encodeURIComponent(tokenKey)}`;
43
45
  }
46
+ if (tokenKind === CHAT_SYSTEM_OBJECT_TOKEN_KIND) {
47
+ return `${CHAT_SYSTEM_OBJECT_TOKEN_PREFIX}${encodeURIComponent(tokenKey)}`;
48
+ }
44
49
  return null;
45
50
  }