@nextclaw/ui 0.15.4 → 0.15.6

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 (300) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/assets/abnfDiagram-VRR7QNED-BYpK0F5F.js +1 -0
  3. package/dist/assets/{aiden0z-pptx-renderer.es-Bd99vut2.js → aiden0z-pptx-renderer.es-D87ywFdC.js} +1 -1
  4. package/dist/assets/api-Dyb5rgh0.js +13 -0
  5. package/dist/assets/app-presenter-provider-7jV0nPiL.js +106 -0
  6. package/dist/assets/{appearance-settings-page-fLIJbx1C.js → appearance-settings-page-DFm3BbEb.js} +1 -1
  7. package/dist/assets/arc-DFELHWM2.js +1 -0
  8. package/dist/assets/architecture-TIHT7OUA-ClwVFq-K.js +1 -0
  9. package/dist/assets/architectureDiagram-ZJ3FMSHR-CvRhdovL.js +36 -0
  10. package/dist/assets/array-BqYdCIE6.js +1 -0
  11. package/dist/assets/blockDiagram-677ZJIJ3-DVYNkbR_.js +132 -0
  12. package/dist/assets/{book-open-DWUjS6aW.js → book-open-L6LCuqOr.js} +1 -1
  13. package/dist/assets/c4Diagram-LMCZKHZV-B1w-iwRe.js +10 -0
  14. package/dist/assets/channel-BEHOSFc5.js +1 -0
  15. package/dist/assets/{channels-list-page-CvCTJraa.js → channels-list-page-DOaPKNJA.js} +2 -2
  16. package/dist/assets/{chat-page-B42UUIFR.js → chat-page-Cw9uDhD_.js} +1 -1
  17. package/dist/assets/chunk-2Q5K7J3B-DrIhesSX.js +1 -0
  18. package/dist/assets/chunk-32BRIVSS-kG3lg0bC.js +1 -0
  19. package/dist/assets/chunk-52WLFC77-BLeB7iGk.js +10 -0
  20. package/dist/assets/chunk-5FCAYU7R-BQga1Rr7.js +1 -0
  21. package/dist/assets/chunk-5HE753X5-DU81hkcF.js +1 -0
  22. package/dist/assets/chunk-5JV3BV7I-C2bAx0m7.js +1 -0
  23. package/dist/assets/chunk-5TONJI2A-BExIIgWY.js +2 -0
  24. package/dist/assets/chunk-5VM5RSS4-C3XB05yh.js +15 -0
  25. package/dist/assets/chunk-7BUUIJ7U-JiyRtrGu.js +1 -0
  26. package/dist/assets/chunk-BIQX33UG-BZRV20pI.js +1 -0
  27. package/dist/assets/chunk-C7G6YPKG-AsyDSQ9j.js +1 -0
  28. package/dist/assets/chunk-CQNSW5MT-iN-fiXVA.js +1 -0
  29. package/dist/assets/chunk-CYSBUYHQ-DhC_TRzI.js +1 -0
  30. package/dist/assets/chunk-EMLP6XTP-QFLK8R6d.js +1 -0
  31. package/dist/assets/chunk-EX3LRPZG-DzUwhkCz.js +231 -0
  32. package/dist/assets/chunk-FWX5IMBZ-DFelpZBy.js +2 -0
  33. package/dist/assets/chunk-HOUHSVGY-BMPwFEwN.js +1 -0
  34. package/dist/assets/chunk-ICXQ74PX-DH8NJMok.js +2 -0
  35. package/dist/assets/chunk-JG7HCLWE-D-95AsO4.js +2 -0
  36. package/dist/assets/chunk-JWPE2WC7-DIaTv8kx.js +1 -0
  37. package/dist/assets/chunk-KEIR6QF5-A3jEqwzn.js +161 -0
  38. package/dist/assets/chunk-MOJQB5TN-BPFLzWgj.js +88 -0
  39. package/dist/assets/chunk-MOZMSUNE-DR_fzxG0.js +1 -0
  40. package/dist/assets/chunk-OGEWGWER-TIcEoPPH.js +1 -0
  41. package/dist/assets/chunk-OSBZ3O6U-BALNvSfG.js +1 -0
  42. package/dist/assets/chunk-PUDLZKDR-I-EXhf_k.js +156 -0
  43. package/dist/assets/chunk-Q4XR5HBZ-uvIGstBS.js +70 -0
  44. package/dist/assets/chunk-QBLGF6JB-r-TjLdxa.js +1 -0
  45. package/dist/assets/chunk-R7FJI6CG-N-1LDgvy.js +1 -0
  46. package/dist/assets/chunk-RYQCIY6F-jxNASx65.js +1 -0
  47. package/dist/assets/chunk-U6XO7XAA-Cphbuc7q.js +2 -0
  48. package/dist/assets/chunk-V7JOEXUC-BLEuBf1s.js +206 -0
  49. package/dist/assets/chunk-VAUOI2AC-Dpcz6BhT.js +1 -0
  50. package/dist/assets/chunk-VR4S4FIN-BAUbR0ke.js +1 -0
  51. package/dist/assets/chunk-WYO6CB5R-Do6SJrnY.js +127 -0
  52. package/dist/assets/chunk-XXDRQBXY-C2QjjwYX.js +1 -0
  53. package/dist/assets/chunk-Y2CYZVJY-BGrd8tLy.js +1 -0
  54. package/dist/assets/chunk-YOTPTUD7-CQqvMTCr.js +1 -0
  55. package/dist/assets/chunk-ZGVPDNZ5-B7kWWaXv.js +62 -0
  56. package/dist/assets/chunk-ZIRB5QZD-DTU0cDNh.js +32 -0
  57. package/dist/assets/classDiagram-OUVF2IWQ-DESMaY3_.js +1 -0
  58. package/dist/assets/classDiagram-v2-EOCWNBFH-DwOlByYH.js +1 -0
  59. package/dist/assets/{config-split-page-DBgt9S8b.js → config-split-page-CqlqjnCK.js} +1 -1
  60. package/dist/assets/{confirm-dialog-GSXIvoRU.js → confirm-dialog-bAp8NU93.js} +1 -1
  61. package/dist/assets/cose-bilkent-JH36ORCC-B9LrtV-q.js +1 -0
  62. package/dist/assets/cynefin-VYW2F7L2-CzjeeOq9.js +1 -0
  63. package/dist/assets/cynefinDiagram-TSTJHNR4-BfjvW4su.js +62 -0
  64. package/dist/assets/cytoscape.esm-CRW8q92n.js +321 -0
  65. package/dist/assets/dagre-DkiXZKkL.js +1 -0
  66. package/dist/assets/dagre-VKFMJZFB-B1pQKQSY.js +4 -0
  67. package/dist/assets/defaultLocale-Cdv9x6q7.js +1 -0
  68. package/dist/assets/desktop-update-config-2SjMfCMl.js +1 -0
  69. package/dist/assets/diagram-FQU43EPY-cB4EZdaP.js +3 -0
  70. package/dist/assets/diagram-G47NLZAW-CtW8im1B.js +24 -0
  71. package/dist/assets/diagram-NH7WQ7WH-BDCtrCCm.js +24 -0
  72. package/dist/assets/diagram-OA4YK3LP-DEMJ42Gt.js +30 -0
  73. package/dist/assets/diagram-WEI45ONY-CdCcxSYU.js +41 -0
  74. package/dist/assets/{dist-DC7f4TJH.js → dist-CrtbGLlh.js} +1 -1
  75. package/dist/assets/dist-dw-gAfM_.js +1 -0
  76. package/dist/assets/doc-browser-A5IRyDXQ2.js +1 -0
  77. package/dist/assets/{doc-browser-D0monHjG.js → doc-browser-BmnQa30-.js} +1 -1
  78. package/dist/assets/{doc-browser-context-CGwEOhBy.js → doc-browser-context-BlpUUFrR.js} +1 -1
  79. package/dist/assets/{docx-preview-eFH9DRsS.js → docx-preview-zis3U0Fa.js} +1 -1
  80. package/dist/assets/{download-DiP9zx-J.js → download-BhZZNXD8.js} +1 -1
  81. package/dist/assets/ebnfDiagram-CCIWWBDH-DBZETBwE.js +1 -0
  82. package/dist/assets/erDiagram-Q63AITRT-y2zDXprP.js +85 -0
  83. package/dist/assets/eventmodeling-45OFAUF4-C38BqG8w.js +1 -0
  84. package/dist/assets/{external-link-C6ZeSPef.js → external-link-B9Uoq5J7.js} +1 -1
  85. package/dist/assets/{eye-suvKmtwn.js → eye-K5knauEM.js} +1 -1
  86. package/dist/assets/flowDiagram-23GEKE2U-BoKk8RRq.js +1 -0
  87. package/dist/assets/{folder-CMELbQGG.js → folder-BIYZZWJv.js} +1 -1
  88. package/dist/assets/{form-actions-CUAzpNe_.js → form-actions-CKprWFeM.js} +1 -1
  89. package/dist/assets/ganttDiagram-NO4QXBWP-D2DP344e.js +292 -0
  90. package/dist/assets/gitGraph-TEB2WS4Q-IsQHHJuS.js +1 -0
  91. package/dist/assets/gitGraphDiagram-IHSO6WYX-D37uiwA2.js +106 -0
  92. package/dist/assets/graphlib-BcNFQr5y.js +1 -0
  93. package/dist/assets/index-BVn702m4.css +1 -0
  94. package/dist/assets/index-CFxJ1Fkg.js +2 -0
  95. package/dist/assets/info-DKCQHKI2-ofy2qlHI.js +1 -0
  96. package/dist/assets/infoDiagram-FWYZ7A6U-CG-WAIRi.js +2 -0
  97. package/dist/assets/init-D8TjIqfm.js +1 -0
  98. package/dist/assets/ishikawaDiagram-FXEZZL3T-WeCTnW0f.js +70 -0
  99. package/dist/assets/journeyDiagram-5HDEW3XC-DUFBW9Td.js +139 -0
  100. package/dist/assets/kanban-definition-HUTT4EX6-B0lxgMpg.js +89 -0
  101. package/dist/assets/katex-wEmrEFTg.js +257 -0
  102. package/dist/assets/line-B78frP_c.js +1 -0
  103. package/dist/assets/linear-C6lVEcb2.js +1 -0
  104. package/dist/assets/loader-circle-Bj2RMrCR.js +1 -0
  105. package/dist/assets/{logo-badge-Cu5UGH_4.js → logo-badge-BQ-XFZod.js} +1 -1
  106. package/dist/assets/map-Bdri5UL5.js +1 -0
  107. package/dist/assets/mcp-marketplace-page-BfA7A3n4.js +9 -0
  108. package/dist/assets/mcp-marketplace-page-CXHYO95j.js +1 -0
  109. package/dist/assets/mermaid-parser.core-Cue18vLo.js +4 -0
  110. package/dist/assets/mermaid.core-CXwWRh5i.js +11 -0
  111. package/dist/assets/mindmap-definition-LN4V7U3C-CFxz0P0-.js +96 -0
  112. package/dist/assets/{model-config-page-CWP6pyBm.js → model-config-page-BbWbW_qM.js} +1 -1
  113. package/dist/assets/ordinal-Cbd8t4LB.js +1 -0
  114. package/dist/assets/packet-7NZHBO7P-Rfopfa1o.js +1 -0
  115. package/dist/assets/path-DzBnMI1r.js +1 -0
  116. package/dist/assets/pegDiagram-2B236MQR-B_Qt9zyT.js +1 -0
  117. package/dist/assets/pie-RZYD4A2V-CJR1xKEv.js +1 -0
  118. package/dist/assets/pieDiagram-ENE6RG2P-CRQdSuwS.js +39 -0
  119. package/dist/assets/plus-TmFdwO3P.js +1 -0
  120. package/dist/assets/{popover-DImguRok.js → popover-CX9zFsuc.js} +1 -1
  121. package/dist/assets/preload-helper-D4M6sveU.js +1 -0
  122. package/dist/assets/{provider-scoped-model-input-CE7p4SbJ.js → provider-scoped-model-input-B-9_DtIP.js} +1 -1
  123. package/dist/assets/providers-config-page-xwIjGur2.js +1 -0
  124. package/dist/assets/quadrantDiagram-ABIIQ3AL-D5kPpttq.js +7 -0
  125. package/dist/assets/radar-I7S5WNFK-CDg8Z-1r.js +1 -0
  126. package/dist/assets/railroad-3IZDKUUU-BHnNmjxO.js +1 -0
  127. package/dist/assets/railroad-abnf-AHOZXSZD-DGtNcusW.js +1 -0
  128. package/dist/assets/railroad-ebnf-EBAXGLYW-BRFtsQmm.js +1 -0
  129. package/dist/assets/railroad-peg-LSFZ7HO6-Bj5IypCA.js +1 -0
  130. package/dist/assets/railroadDiagram-RFXS5EU6-DGh_TGlQ.js +1 -0
  131. package/dist/assets/{react-5sjAT_6d.js → react-DsgudwpT.js} +1 -1
  132. package/dist/assets/{refresh-cw-CHLBzWWj.js → refresh-cw-kXdvbhFf.js} +1 -1
  133. package/dist/assets/remote-B9F2uCk9.js +1 -0
  134. package/dist/assets/requirementDiagram-TGXJPOKE-EmFph0H_.js +84 -0
  135. package/dist/assets/rotate-cw-DEc6aihr.js +1 -0
  136. package/dist/assets/rough.esm-wJ1d3nQl.js +1 -0
  137. package/dist/assets/runtime-config-page-DTsi7czJ.js +1 -0
  138. package/dist/assets/sankeyDiagram-HTMAVEWB-BXWB5Ugi.js +40 -0
  139. package/dist/assets/{save-BABzyrjB.js → save-C9qpz2_2.js} +1 -1
  140. package/dist/assets/{search-BTqxG3ZG.js → search-_kEi29qo.js} +1 -1
  141. package/dist/assets/{search-config-page-BkKKmxmS.js → search-config-page-H7ug8f4D.js} +1 -1
  142. package/dist/assets/{secrets-config-page-CWJMyu-k.js → secrets-config-page-C1_6rINu.js} +2 -2
  143. package/dist/assets/security-config-Cr2ERKLu.js +1 -0
  144. package/dist/assets/{select-TYZDBNmq.js → select-MJKhKAWR.js} +1 -1
  145. package/dist/assets/sequenceDiagram-DBY2YBRQ-ClKnO7v0.js +162 -0
  146. package/dist/assets/{setting-row-DR23Z_5I.js → setting-row-DA3tJuew.js} +1 -1
  147. package/dist/assets/{settings-2-D8WWcBnw.js → settings-2-D_y7zXJz.js} +1 -1
  148. package/dist/assets/sizeCapture-X5ZJPWSS-DSo-t5ou.js +1 -0
  149. package/dist/assets/{skeleton-CloHeg0S.js → skeleton-0uTLUhm9.js} +1 -1
  150. package/dist/assets/src-Dad2ZbCt.js +1 -0
  151. package/dist/assets/stateDiagram-2N3HPSRC-BvAalBfz.js +1 -0
  152. package/dist/assets/stateDiagram-v2-6OUMAXLB-CfMU38yc.js +1 -0
  153. package/dist/assets/swimlanes-5IMT3BWC-DdVqVa1a.js +2 -0
  154. package/dist/assets/swimlanesDiagram-G3AALYLV-D9Zb9X57.js +8 -0
  155. package/dist/assets/{tabs-CX-ckWoo.js → tabs-h44XPocd.js} +1 -1
  156. package/dist/assets/{tag-chip-mCc23Rhb.js → tag-chip-bRZ04q3C.js} +1 -1
  157. package/dist/assets/timeline-definition-FHXFAJF6-D4ar8IQY.js +120 -0
  158. package/dist/assets/{trash-2-SAW1Z4Po.js → trash-2-BRpSE-Wt.js} +1 -1
  159. package/dist/assets/treeView-QDETBFTQ-Uy7M0WvH.js +1 -0
  160. package/dist/assets/treemap-6X3UGDF4-BJfGV7KX.js +1 -0
  161. package/dist/assets/use-config-CwDEAl6f.js +1 -0
  162. package/dist/assets/{use-confirm-dialog-C95F6sT1.js → use-confirm-dialog-BbnWw-8c.js} +1 -1
  163. package/dist/assets/{use-viewport-layout-C6m3Nte7.js → use-viewport-layout-CqgIMDQL.js} +1 -1
  164. package/dist/assets/vennDiagram-L72KCM5P-CDXJ_i3p.js +34 -0
  165. package/dist/assets/wardley-OPB4EBWU-q263iF3K.js +1 -0
  166. package/dist/assets/wardleyDiagram-EHGQE667-D-dSuT_7.js +78 -0
  167. package/dist/assets/x-DdEDL6ju.js +1 -0
  168. package/dist/assets/xychartDiagram-FW5EYKEG-C9JCzsZF.js +7 -0
  169. package/dist/index.html +33 -32
  170. package/package.json +8 -8
  171. package/src/features/chat/components/chat-popover-content.tsx +1 -26
  172. package/src/features/chat/components/conversation/__tests__/chat-conversation-header-section.test.tsx +84 -1
  173. package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +13 -2
  174. package/src/features/chat/components/conversation/chat-conversation-workspace-section.tsx +1 -0
  175. package/src/features/chat/components/layout/__tests__/chat-sidebar-test.utils.ts +22 -0
  176. package/src/features/chat/components/layout/__tests__/chat-sidebar.test.tsx +13 -24
  177. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +16 -4
  178. package/src/features/chat/components/layout/chat-sidebar.tsx +38 -2
  179. package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +1 -0
  180. package/src/features/chat/features/conversation/components/__tests__/session-conversation-input.streaming.test.tsx +52 -2
  181. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +22 -0
  182. package/src/features/chat/features/conversation/components/session-conversation-input.tsx +36 -20
  183. package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-input-state.test.tsx +55 -0
  184. package/src/features/chat/features/conversation/hooks/use-session-conversation-input-state.ts +12 -11
  185. package/src/features/chat/features/conversation/hooks/use-session-conversation-preference-actions.ts +94 -0
  186. package/src/features/chat/features/input/hooks/__tests__/use-chat-input-surface-state.test.tsx +37 -0
  187. package/src/features/chat/features/input/hooks/use-chat-input-surface-state.ts +140 -63
  188. package/src/features/chat/features/input/input-surface-plugins/__tests__/context-reference-plugin.test.ts +175 -0
  189. package/src/features/chat/features/input/input-surface-plugins/__tests__/slash-command-plugin.test.ts +66 -0
  190. package/src/features/chat/features/input/input-surface-plugins/chat-input-product-plugin-adapters.types.ts +8 -1
  191. package/src/features/chat/features/input/input-surface-plugins/context-reference-plugin.utils.ts +274 -0
  192. package/src/features/chat/features/input/input-surface-plugins/slash-command-plugin.utils.ts +18 -11
  193. package/src/features/chat/features/input/utils/__tests__/chat-composer-state.utils.test.ts +26 -0
  194. package/src/features/chat/features/input/utils/__tests__/chat-inline-token.utils.test.ts +50 -4
  195. package/src/features/chat/features/input/utils/__tests__/chat-input-bar.utils.test.ts +51 -0
  196. package/src/features/chat/features/input/utils/chat-composer-state.utils.ts +4 -10
  197. package/src/features/chat/features/input/utils/chat-composer-token-protocol.utils.ts +29 -0
  198. package/src/features/chat/features/input/utils/chat-inline-token.utils.ts +66 -8
  199. package/src/features/chat/features/input/utils/chat-input-bar.utils.ts +62 -21
  200. package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +42 -10
  201. package/src/features/chat/features/message/components/chat-inline-file-preview.tsx +80 -0
  202. package/src/features/chat/features/message/components/chat-message-list.container.tsx +55 -60
  203. package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +2 -0
  204. package/src/features/chat/features/ncp/hooks/__tests__/use-hydrated-ncp-agent.test.tsx +41 -3
  205. package/src/features/chat/features/project/components/__tests__/chat-project-create-dialog.test.tsx +67 -0
  206. package/src/features/chat/features/project/components/chat-project-create-dialog.tsx +203 -0
  207. package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +7 -7
  208. package/src/features/chat/features/session/components/session-header/__tests__/chat-session-project-dialog.test.tsx +47 -0
  209. package/src/features/chat/features/session/components/session-header/chat-session-header-actions.tsx +6 -3
  210. package/src/features/chat/features/session/components/session-header/chat-session-project-badge.tsx +3 -0
  211. package/src/features/chat/features/session/components/session-header/chat-session-project-dialog.tsx +3 -0
  212. package/src/features/chat/features/session/components/session-header/chat-session-switcher-groups.tsx +245 -0
  213. package/src/features/chat/features/session/components/session-header/chat-session-title-switcher.tsx +81 -127
  214. package/src/features/chat/features/session/utils/__tests__/chat-sidebar-session-groups.utils.test.ts +22 -0
  215. package/src/features/chat/features/session/utils/chat-run-metadata.utils.ts +6 -6
  216. package/src/features/chat/features/session/utils/chat-sidebar-session-groups.utils.ts +12 -1
  217. package/src/features/chat/features/welcome/components/chat-conversation-welcome.tsx +3 -0
  218. package/src/features/chat/features/welcome/components/chat-welcome.tsx +1 -0
  219. package/src/features/chat/features/welcome/utils/__tests__/chat-welcome-project-options.utils.test.ts +20 -0
  220. package/src/features/chat/features/welcome/utils/chat-welcome-project-options.utils.ts +15 -2
  221. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.test.tsx +22 -24
  222. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel.test.tsx +2 -1
  223. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +6 -17
  224. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +41 -19
  225. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +5 -1
  226. package/src/features/chat/features/workspace/components/chat-session-workspace-panel.tsx +5 -1
  227. package/src/features/chat/features/workspace/utils/__tests__/chat-workspace-panel-view-model.utils.test.ts +104 -3
  228. package/src/features/chat/features/workspace/utils/chat-thread-workspace-session.utils.ts +83 -0
  229. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab.utils.ts +4 -1
  230. package/src/features/chat/features/workspace/utils/chat-workspace-panel-view-model.utils.ts +96 -25
  231. package/src/features/chat/managers/__tests__/chat-thread-workspace.manager.test.ts +25 -0
  232. package/src/features/chat/managers/__tests__/chat-thread.manager.test.ts +5 -1
  233. package/src/features/chat/managers/chat-session-list.manager.ts +1 -0
  234. package/src/features/chat/managers/chat-thread.manager.ts +15 -37
  235. package/src/features/chat/pages/__tests__/ncp-chat-page.test.ts +23 -0
  236. package/src/features/chat/stores/__tests__/chat-thread.store.test.ts +9 -0
  237. package/src/features/chat/stores/chat-thread.store.ts +16 -36
  238. package/src/features/chat/types/chat-input-bar.types.ts +2 -0
  239. package/src/features/settings/components/config/provider-form.tsx +0 -4
  240. package/src/features/settings/utils/__tests__/provider-form-support.utils.test.ts +7 -9
  241. package/src/features/settings/utils/provider-form-model.utils.ts +0 -4
  242. package/src/features/system-status/hooks/use-current-version-release-notes-link.ts +33 -0
  243. package/src/features/system-status/index.ts +9 -0
  244. package/src/features/system-status/utils/update-release-notes.utils.ts +44 -3
  245. package/src/index.css +10 -16
  246. package/src/shared/components/common/__tests__/brand-header.test.tsx +127 -10
  247. package/src/shared/components/common/brand-header.tsx +142 -56
  248. package/src/shared/components/path-picker/__tests__/server-path-picker-dialog.test.tsx +288 -38
  249. package/src/shared/components/path-picker/server-path-picker-dialog.tsx +290 -199
  250. package/src/shared/components/path-picker/server-path-picker-directory-list.tsx +103 -0
  251. package/src/shared/components/path-picker/server-path-picker-footer.tsx +58 -0
  252. package/src/shared/components/path-picker/server-path-picker-locations.tsx +148 -0
  253. package/src/shared/components/path-picker/server-path-picker-navigation-bar.tsx +198 -0
  254. package/src/shared/components/path-picker/server-path-picker-new-folder.tsx +59 -0
  255. package/src/shared/components/path-picker/server-path-picker-toolbar.tsx +25 -0
  256. package/src/shared/hooks/use-projects.ts +28 -0
  257. package/src/shared/hooks/use-server-path-create-directory.ts +6 -0
  258. package/src/shared/hooks/use-server-path-read.ts +10 -5
  259. package/src/shared/hooks/use-server-path-search.ts +40 -0
  260. package/src/shared/lib/api/index.ts +1 -0
  261. package/src/shared/lib/api/projects/project.utils.ts +14 -0
  262. package/src/shared/lib/api/types.ts +30 -3
  263. package/src/shared/lib/api/utils/server-path.utils.ts +22 -1
  264. package/src/shared/lib/i18n/locales/en-US/chat.json +43 -2
  265. package/src/shared/lib/i18n/locales/en-US/core.json +2 -3
  266. package/src/shared/lib/i18n/locales/en-US/desktop-update.json +4 -0
  267. package/src/shared/lib/i18n/locales/en-US/path-picker.json +25 -0
  268. package/src/shared/lib/i18n/locales/zh-CN/chat.json +43 -2
  269. package/src/shared/lib/i18n/locales/zh-CN/core.json +2 -3
  270. package/src/shared/lib/i18n/locales/zh-CN/desktop-update.json +4 -0
  271. package/src/shared/lib/i18n/locales/zh-CN/path-picker.json +25 -0
  272. package/src/shared/lib/session-project/__tests__/workspace-file-breadcrumb.test.ts +1 -4
  273. package/src/shared/lib/session-project/workspace-file-breadcrumb.utils.ts +1 -18
  274. package/dist/assets/api-BOXOrpcJ.js +0 -13
  275. package/dist/assets/app-presenter-provider-CkHLbvZQ.js +0 -106
  276. package/dist/assets/desktop-update-config-7bmNeWIC.js +0 -1
  277. package/dist/assets/doc-browser-CgdoLUT92.js +0 -1
  278. package/dist/assets/index-BFeNDQ4R.css +0 -1
  279. package/dist/assets/index-D_6U-M94.js +0 -2
  280. package/dist/assets/loader-circle-tYHStefV.js +0 -1
  281. package/dist/assets/mcp-marketplace-page-BUzHDwW6.js +0 -9
  282. package/dist/assets/mcp-marketplace-page-ohUAdfqJ.js +0 -1
  283. package/dist/assets/plus-tywizkeY.js +0 -1
  284. package/dist/assets/providers-config-page-BKPo8SjH.js +0 -1
  285. package/dist/assets/remote-DXJryUxB.js +0 -1
  286. package/dist/assets/rotate-cw-BefO5brU.js +0 -1
  287. package/dist/assets/runtime-config-page-1Axv4QGu.js +0 -1
  288. package/dist/assets/security-config-DeQUIXfi.js +0 -1
  289. package/dist/assets/use-config-BucdaK23.js +0 -1
  290. package/dist/assets/x-DtCPHwCu.js +0 -1
  291. package/src/features/chat/components/__tests__/chat-popover-content.test.tsx +0 -41
  292. package/src/features/chat/components/layout/__tests__/chat-sidebar-utility-menu.test.tsx +0 -55
  293. package/src/features/chat/features/input/input-surface-plugins/__tests__/panel-app-reference-plugin.test.ts +0 -77
  294. package/src/features/chat/features/input/input-surface-plugins/panel-app-reference-plugin.utils.ts +0 -144
  295. /package/dist/assets/{config-hints-fDrYfl0l.js → config-hints-LxG80Uj5.js} +0 -0
  296. /package/dist/assets/{host-capabilities-zZvY9U63.js → host-capabilities-CFbAfrrA.js} +0 -0
  297. /package/dist/assets/{jszip.min-Das2IAnb.js → jszip.min-CP5uPNQa.js} +0 -0
  298. /package/dist/assets/{middleware-BLMHv9YF.js → middleware-CAXxl-af.js} +0 -0
  299. /package/dist/assets/{provider-models-C_yOh6DE.js → provider-models-BoUhFo9R.js} +0 -0
  300. /package/dist/assets/{xlsx-B6zVt1RK.js → xlsx-DUqJhg5u.js} +0 -0
@@ -0,0 +1,55 @@
1
+ import { act, renderHook } from '@testing-library/react';
2
+ import { describe, expect, it } from 'vitest';
3
+
4
+ import { useSessionConversationInputState } from '@/features/chat/features/conversation/hooks/use-session-conversation-input-state';
5
+ import type { ChatModelOption } from '@/features/chat/types/chat-input.types';
6
+
7
+ const MODEL_OPTIONS: ChatModelOption[] = [
8
+ {
9
+ value: 'deepseek/deepseek-v4-flash',
10
+ modelLabel: 'DeepSeek V4 Flash',
11
+ providerLabel: 'DeepSeek',
12
+ thinkingCapability: null,
13
+ },
14
+ {
15
+ value: 'minimax/MiniMax-M3',
16
+ modelLabel: 'MiniMax M3',
17
+ providerLabel: 'MiniMax',
18
+ thinkingCapability: null,
19
+ },
20
+ ];
21
+
22
+ describe('useSessionConversationInputState session preferences', () => {
23
+ it('restores the switched session model after its metadata becomes available', () => {
24
+ const { result } = renderHook(() => useSessionConversationInputState());
25
+
26
+ act(() => {
27
+ result.current.inputActions.syncSessionPreferences({
28
+ modelOptions: MODEL_OPTIONS,
29
+ selectedSessionExists: true,
30
+ selectedSessionKey: 'session-a',
31
+ selectedSessionPreferredModel: 'deepseek/deepseek-v4-flash',
32
+ });
33
+ });
34
+ expect(result.current.inputSnapshot.selectedModel).toBe('deepseek/deepseek-v4-flash');
35
+
36
+ act(() => {
37
+ result.current.inputActions.syncSessionPreferences({
38
+ modelOptions: MODEL_OPTIONS,
39
+ selectedSessionExists: false,
40
+ selectedSessionKey: 'session-b',
41
+ });
42
+ });
43
+ expect(result.current.inputSnapshot.selectedModel).toBe('deepseek/deepseek-v4-flash');
44
+
45
+ act(() => {
46
+ result.current.inputActions.syncSessionPreferences({
47
+ modelOptions: MODEL_OPTIONS,
48
+ selectedSessionExists: true,
49
+ selectedSessionKey: 'session-b',
50
+ selectedSessionPreferredModel: 'minimax/MiniMax-M3',
51
+ });
52
+ });
53
+ expect(result.current.inputSnapshot.selectedModel).toBe('minimax/MiniMax-M3');
54
+ });
55
+ });
@@ -5,6 +5,10 @@ import type { NcpDraftAttachment } from '@nextclaw/ncp-react';
5
5
  import type { ThinkingLevel } from '@/shared/lib/api';
6
6
  import { DEFAULT_SESSION_TYPE } from '@/features/chat/features/session-type/utils/chat-session-type.utils';
7
7
  import { createChatComposerNodesFromDraft } from '@/features/chat/features/input/utils/chat-composer-state.utils';
8
+ import {
9
+ useSessionConversationPreferenceActions,
10
+ type SessionConversationPreferenceSyncParams,
11
+ } from '@/features/chat/features/conversation/hooks/use-session-conversation-preference-actions';
8
12
 
9
13
  type SessionConversationInputStateValue = string | null | undefined;
10
14
  type SessionConversationSkillSelection = {
@@ -51,6 +55,7 @@ export type SessionConversationInputActions = {
51
55
  readonly removeAttachment: (attachmentId: string) => void;
52
56
  readonly setSelectedModel: (model: SessionConversationInputStateValue) => void;
53
57
  readonly setSelectedThinkingLevel: (level: ThinkingLevel | null) => void;
58
+ readonly syncSessionPreferences: (params: SessionConversationPreferenceSyncParams) => void;
54
59
  readonly setPendingSessionType: (sessionType: SetStateAction<string>) => void;
55
60
  readonly setPendingProjectRoot: (projectRoot: string | null) => void;
56
61
  readonly setSelectedSkills: (
@@ -198,13 +203,11 @@ export const useSessionConversationInputState = () => {
198
203
  }));
199
204
  }, [update]);
200
205
 
201
- const setSelectedModel = useCallback((model: SessionConversationInputStateValue) => {
202
- update({ selectedModel: model });
203
- }, [update]);
204
-
205
- const setSelectedThinkingLevel = useCallback((level: ThinkingLevel | null) => {
206
- update({ selectedThinkingLevel: level });
207
- }, [update]);
206
+ const preferenceActions = useSessionConversationPreferenceActions({
207
+ selectedModel: snapshot.selectedModel,
208
+ selectedThinkingLevel: snapshot.selectedThinkingLevel,
209
+ updatePreferences: update,
210
+ });
208
211
 
209
212
  const setPendingSessionType = useCallback((sessionType: SetStateAction<string>) => {
210
213
  update((current) => {
@@ -249,8 +252,7 @@ export const useSessionConversationInputState = () => {
249
252
  setAttachments,
250
253
  addAttachments,
251
254
  removeAttachment,
252
- setSelectedModel,
253
- setSelectedThinkingLevel,
255
+ ...preferenceActions,
254
256
  setPendingSessionType,
255
257
  setPendingProjectRoot,
256
258
  setSelectedSkills,
@@ -266,8 +268,7 @@ export const useSessionConversationInputState = () => {
266
268
  setAttachments,
267
269
  addAttachments,
268
270
  removeAttachment,
269
- setSelectedModel,
270
- setSelectedThinkingLevel,
271
+ preferenceActions,
271
272
  setPendingSessionType,
272
273
  setPendingProjectRoot,
273
274
  setSelectedSkills,
@@ -0,0 +1,94 @@
1
+ import { useCallback, useMemo, useRef } from 'react';
2
+
3
+ import type { ThinkingLevel } from '@/shared/lib/api';
4
+ import type { ChatModelOption } from '@/features/chat/types/chat-input.types';
5
+ import {
6
+ resolveSelectedModelValue,
7
+ resolveSelectedThinkingLevelValue,
8
+ } from '@/features/chat/features/session/utils/chat-session-preference-governance.utils';
9
+
10
+ type ConversationPreferenceValue = string | null | undefined;
11
+
12
+ export type SessionConversationPreferenceSyncParams = {
13
+ readonly defaultModel?: string;
14
+ readonly fallbackPreferredModel?: string;
15
+ readonly fallbackPreferredThinking?: ThinkingLevel | null;
16
+ readonly modelOptions: ChatModelOption[];
17
+ readonly selectedSessionExists: boolean;
18
+ readonly selectedSessionKey?: string | null;
19
+ readonly selectedSessionPreferredModel?: string;
20
+ readonly selectedSessionPreferredThinking?: ThinkingLevel | null;
21
+ };
22
+
23
+ type SessionConversationPreferenceActionsParams = {
24
+ readonly selectedModel: ConversationPreferenceValue;
25
+ readonly selectedThinkingLevel: ThinkingLevel | null;
26
+ readonly updatePreferences: (patch: {
27
+ readonly selectedModel?: ConversationPreferenceValue;
28
+ readonly selectedThinkingLevel?: ThinkingLevel | null;
29
+ }) => void;
30
+ };
31
+
32
+ export const useSessionConversationPreferenceActions = ({
33
+ selectedModel: currentSelectedModel,
34
+ selectedThinkingLevel: currentSelectedThinkingLevel,
35
+ updatePreferences,
36
+ }: SessionConversationPreferenceActionsParams) => {
37
+ const previousSessionKeyRef = useRef<string | null | undefined>(undefined);
38
+ const setSelectedModel = useCallback((selectedModel: ConversationPreferenceValue) => {
39
+ updatePreferences({ selectedModel });
40
+ }, [updatePreferences]);
41
+ const setSelectedThinkingLevel = useCallback((selectedThinkingLevel: ThinkingLevel | null) => {
42
+ updatePreferences({ selectedThinkingLevel });
43
+ }, [updatePreferences]);
44
+ const syncSessionPreferences = useCallback(({
45
+ defaultModel,
46
+ fallbackPreferredModel,
47
+ fallbackPreferredThinking,
48
+ modelOptions,
49
+ selectedSessionExists,
50
+ selectedSessionKey: sessionKey,
51
+ selectedSessionPreferredModel,
52
+ selectedSessionPreferredThinking,
53
+ }: SessionConversationPreferenceSyncParams) => {
54
+ const selectedSessionKey = sessionKey ?? null;
55
+ const sessionChanged = previousSessionKeyRef.current !== selectedSessionKey;
56
+ const preserveCurrentPreference = sessionChanged && Boolean(selectedSessionKey) && !selectedSessionExists;
57
+ const selectedModel = resolveSelectedModelValue({
58
+ currentSelectedModel: currentSelectedModel ?? undefined,
59
+ modelOptions,
60
+ selectedSessionPreferredModel,
61
+ fallbackPreferredModel,
62
+ defaultModel,
63
+ preferSessionPreferredModel: sessionChanged,
64
+ preserveCurrentSelectedModelOnSessionChange: preserveCurrentPreference,
65
+ });
66
+ const modelOption = modelOptions.find((option) => option.value === selectedModel);
67
+ const selectedThinkingLevel = resolveSelectedThinkingLevelValue({
68
+ currentSelectedThinkingLevel,
69
+ supportedThinkingLevels:
70
+ (modelOption?.thinkingCapability?.supported as ThinkingLevel[] | undefined) ?? [],
71
+ selectedSessionPreferredThinking,
72
+ fallbackPreferredThinking,
73
+ defaultThinkingLevel:
74
+ (modelOption?.thinkingCapability?.default as ThinkingLevel | null | undefined) ?? null,
75
+ preferSessionPreferredThinking: sessionChanged,
76
+ preserveCurrentSelectedThinkingOnSessionChange: preserveCurrentPreference,
77
+ });
78
+ if (
79
+ currentSelectedModel !== selectedModel ||
80
+ currentSelectedThinkingLevel !== selectedThinkingLevel
81
+ ) {
82
+ updatePreferences({ selectedModel, selectedThinkingLevel });
83
+ }
84
+ if (!selectedSessionKey || selectedSessionExists) {
85
+ previousSessionKeyRef.current = selectedSessionKey;
86
+ }
87
+ }, [currentSelectedModel, currentSelectedThinkingLevel, updatePreferences]);
88
+
89
+ return useMemo(() => ({
90
+ setSelectedModel,
91
+ setSelectedThinkingLevel,
92
+ syncSessionPreferences,
93
+ }), [setSelectedModel, setSelectedThinkingLevel, syncSessionPreferences]);
94
+ };
@@ -9,10 +9,21 @@ const usePanelAppsMock = vi.hoisted(() =>
9
9
  isLoading: false,
10
10
  })),
11
11
  );
12
+ const useServerPathSearchMock = vi.hoisted(() =>
13
+ vi.fn(() => ({
14
+ data: { entries: [] },
15
+ error: null,
16
+ isFetching: false,
17
+ isLoading: false,
18
+ })),
19
+ );
12
20
 
13
21
  vi.mock('@/features/panel-apps', () => ({
14
22
  usePanelApps: usePanelAppsMock,
15
23
  }));
24
+ vi.mock('@/shared/hooks/use-server-path-search', () => ({
25
+ useServerPathSearch: useServerPathSearchMock,
26
+ }));
16
27
 
17
28
  function createHookParams() {
18
29
  return {
@@ -29,6 +40,7 @@ function createHookParams() {
29
40
  language: 'zh' as const,
30
41
  onSelectPanelApp: vi.fn(),
31
42
  onSelectSkill: vi.fn(),
43
+ projectRoot: '/tmp/project',
32
44
  recentSkillValues: [],
33
45
  skillRecords: [],
34
46
  };
@@ -36,6 +48,31 @@ function createHookParams() {
36
48
 
37
49
  beforeEach(() => {
38
50
  usePanelAppsMock.mockClear();
51
+ useServerPathSearchMock.mockClear();
52
+ });
53
+
54
+ it('enables project path search after navigating into files and folders', () => {
55
+ const { result } = renderHook(() => useChatInputSurfaceState(createHookParams()));
56
+
57
+ act(() =>
58
+ result.current.setInputSurfaceTrigger({
59
+ end: 1,
60
+ key: 'context-reference',
61
+ marker: '@',
62
+ query: '',
63
+ start: 0,
64
+ }),
65
+ );
66
+ const filesItem = result.current.inputSurfaceState.panel?.items.find(
67
+ (item) => item.selectionBehavior === 'navigate',
68
+ );
69
+ act(() => result.current.inputSurfaceState.panel?.onSelectItem?.(filesItem!));
70
+
71
+ expect(useServerPathSearchMock).toHaveBeenLastCalledWith({
72
+ basePath: '/tmp/project',
73
+ query: '',
74
+ enabled: true,
75
+ });
39
76
  });
40
77
 
41
78
  it('keeps equivalent input surface trigger updates from rerendering the composer owner', () => {
@@ -1,4 +1,4 @@
1
- import { useCallback, useMemo, useRef, useState } from 'react';
1
+ import { useCallback, useDeferredValue, useMemo, useRef, useState } from 'react';
2
2
  import {
3
3
  CHAT_INPUT_SURFACE_SLASH_TRIGGER_SPEC,
4
4
  resolveChatInputSurfaceState,
@@ -7,105 +7,169 @@ import {
7
7
  import { usePanelApps } from '@/features/panel-apps';
8
8
  import { t, type I18nLanguage } from '@/shared/lib/i18n';
9
9
  import {
10
- createPanelAppReferenceInputSurfacePlugin,
11
- PANEL_APP_REFERENCE_TRIGGER_SPEC,
12
- } from '@/features/chat/features/input/input-surface-plugins/panel-app-reference-plugin.utils';
10
+ CONTEXT_REFERENCE_TRIGGER_SPEC,
11
+ createContextReferenceInputSurfacePlugin,
12
+ } from '@/features/chat/features/input/input-surface-plugins/context-reference-plugin.utils';
13
+ import type { ContextReferenceMode } from '@/features/chat/features/input/input-surface-plugins/chat-input-product-plugin-adapters.types';
13
14
  import {
14
15
  createSlashCommandInputSurfacePlugin,
15
16
  type ChatSlashCommandDescriptor,
16
17
  } from '@/features/chat/features/input/input-surface-plugins/slash-command-plugin.utils';
17
18
  import type { ChatInputBarAdapterTexts, ChatSkillRecord } from '@/features/chat/types/chat-input-bar.types';
19
+ import { useServerPathSearch } from '@/shared/hooks/use-server-path-search';
18
20
 
19
- export function useChatInputSurfaceState(params: {
21
+ type ChatInputSurfaceSlashTexts = Pick<
22
+ ChatInputBarAdapterTexts,
23
+ 'slashSkillSubtitle' | 'slashSkillSpecLabel' | 'slashSkillScopeLabel' | 'noSkillDescription'
24
+ >;
25
+
26
+ type UseChatInputSurfaceStateParams = {
20
27
  commands: readonly ChatSlashCommandDescriptor[];
21
28
  isSkillsLoading: boolean;
22
- itemTexts: {
23
- slashTexts: Pick<
24
- ChatInputBarAdapterTexts,
25
- 'slashSkillSubtitle' | 'slashSkillSpecLabel' | 'slashSkillScopeLabel' | 'noSkillDescription'
26
- >;
27
- };
29
+ itemTexts: { slashTexts: ChatInputSurfaceSlashTexts };
28
30
  language: I18nLanguage;
29
31
  onSelectPanelApp: (appId: string) => void;
30
32
  onSelectSkill: (skillRef: string) => void;
33
+ projectRoot: string;
31
34
  recentSkillValues: readonly string[];
32
35
  skillRecords: readonly ChatSkillRecord[];
36
+ };
37
+
38
+ function buildChatInputSurfacePlugins(params: {
39
+ commands: readonly ChatSlashCommandDescriptor[];
40
+ language: I18nLanguage;
41
+ onNavigate: (mode: ContextReferenceMode) => void;
42
+ onSelectPanelApp: (appId: string) => void;
43
+ onSelectSkill: (skillRef: string) => void;
44
+ slashTexts: ChatInputSurfaceSlashTexts;
33
45
  }) {
46
+ const {
47
+ commands,
48
+ language,
49
+ onNavigate,
50
+ onSelectPanelApp,
51
+ onSelectSkill,
52
+ slashTexts,
53
+ } = params;
54
+ const panelAppTexts = {
55
+ appIdLabel: t('chatPanelAppReferenceAppId', language),
56
+ fileLabel: t('chatPanelAppReferenceFile', language),
57
+ noDescriptionLabel: t('chatPanelAppReferenceNoDescription', language),
58
+ subtitle: t('chatPanelAppReferenceType', language),
59
+ };
60
+ return [
61
+ createSlashCommandInputSurfacePlugin({
62
+ commands,
63
+ itemTexts: {
64
+ panelAppTexts,
65
+ skillTexts: slashTexts,
66
+ },
67
+ menuTexts: {
68
+ loadingLabel: t('chatSlashLoading', language),
69
+ sectionLabel: t('chatSlashSection', language),
70
+ emptyLabel: t('chatSlashNoResult', language),
71
+ hintLabel: t('chatSlashHint', language),
72
+ itemHintLabel: t('chatSlashSkillHint', language),
73
+ },
74
+ labels: {
75
+ commandHintLabel: t('chatSlashCommandHint', language),
76
+ commandSectionLabel: t('chatSlashSectionCommands', language),
77
+ commandSubtitle: t('chatSlashTypeCommand', language),
78
+ filterAllLabel: t('chatSlashFilterAll', language),
79
+ filterCommandsLabel: t('chatSlashFilterCommands', language),
80
+ filterPanelAppsLabel: t('chatSlashFilterPanelApps', language),
81
+ filterSkillsLabel: t('chatSlashFilterSkills', language),
82
+ panelAppHintLabel: t('chatSlashPanelAppHint', language),
83
+ panelAppSectionLabel: t('chatPanelAppReferenceSection', language),
84
+ skillHintLabel: t('chatSlashSkillHint', language),
85
+ skillSectionLabel: t('chatSlashSectionSkills', language),
86
+ },
87
+ onSelectPanelApp,
88
+ onSelectSkill,
89
+ }),
90
+ createContextReferenceInputSurfacePlugin({
91
+ itemTexts: {
92
+ context: {
93
+ backLabel: t('chatContextReferenceBack', language),
94
+ backDescription: t('chatContextReferenceBackDescription', language),
95
+ backHintLabel: t('chatContextReferenceBackHint', language),
96
+ directoryDescription: t('chatContextReferenceDirectoryDescription', language),
97
+ fileDescription: t('chatContextReferenceFileDescription', language),
98
+ filesDescription: t('chatContextReferenceFilesDescription', language),
99
+ filesHintLabel: t('chatContextReferenceFilesHint', language),
100
+ filesLabel: t('chatContextReferenceFilesLabel', language),
101
+ filesSubtitle: t('chatContextReferenceFilesType', language),
102
+ panelAppSectionLabel: t('chatPanelAppReferenceSection', language),
103
+ projectRootLabel: t('chatContextReferenceProjectRoot', language),
104
+ searchFailedLabel: t('chatContextReferenceSearchFailed', language),
105
+ workspaceSectionLabel: t('chatContextReferenceWorkspaceSection', language),
106
+ },
107
+ panelApp: panelAppTexts,
108
+ },
109
+ menuTexts: {
110
+ loadingLabel: t('chatContextReferenceLoading', language),
111
+ sectionLabel: t('chatContextReferenceSection', language),
112
+ emptyLabel: t('chatContextReferenceNoResult', language),
113
+ hintLabel: t('chatContextReferenceHint', language),
114
+ itemHintLabel: t('chatContextReferenceItemHint', language),
115
+ },
116
+ onNavigate,
117
+ }),
118
+ ];
119
+ }
120
+
121
+ export function useChatInputSurfaceState(params: UseChatInputSurfaceStateParams) {
34
122
  const {
35
123
  isSkillsLoading,
36
124
  itemTexts,
37
125
  language,
38
126
  onSelectPanelApp,
39
127
  onSelectSkill,
128
+ projectRoot,
40
129
  recentSkillValues,
41
130
  skillRecords,
42
131
  commands,
43
132
  } = params;
133
+ const [referenceMode, setReferenceMode] = useState<ContextReferenceMode>('root');
44
134
  const [inputSurfaceTrigger, setInputSurfaceTriggerState] = useState<ChatInputSurfaceTrigger | null>(null);
45
135
  const inputSurfaceTriggerSignatureRef = useRef('null');
46
136
  const setInputSurfaceTrigger = useCallback((nextTrigger: ChatInputSurfaceTrigger | null): void => {
47
137
  const nextSignature = JSON.stringify(nextTrigger ? [nextTrigger.key, nextTrigger.marker, nextTrigger.query, nextTrigger.start, nextTrigger.end] : null);
48
138
  if (inputSurfaceTriggerSignatureRef.current === nextSignature) return;
49
139
  inputSurfaceTriggerSignatureRef.current = nextSignature;
140
+ if (!nextTrigger) {
141
+ setReferenceMode('root');
142
+ }
50
143
  setInputSurfaceTriggerState(nextTrigger);
51
144
  }, []);
145
+ const isContextReferenceTrigger = inputSurfaceTrigger?.key === CONTEXT_REFERENCE_TRIGGER_SPEC.key;
146
+ const deferredReferenceQuery = useDeferredValue(
147
+ isContextReferenceTrigger ? inputSurfaceTrigger.query : '',
148
+ );
149
+ const shouldSearchServerPaths = Boolean(
150
+ isContextReferenceTrigger &&
151
+ projectRoot &&
152
+ (referenceMode === 'files' || deferredReferenceQuery.trim()),
153
+ );
154
+ const serverPathSearch = useServerPathSearch({
155
+ basePath: projectRoot,
156
+ query: deferredReferenceQuery,
157
+ enabled: shouldSearchServerPaths,
158
+ });
52
159
  const shouldLoadPanelApps =
53
- inputSurfaceTrigger?.key === PANEL_APP_REFERENCE_TRIGGER_SPEC.key ||
160
+ isContextReferenceTrigger ||
54
161
  inputSurfaceTrigger?.key === CHAT_INPUT_SURFACE_SLASH_TRIGGER_SPEC.key;
55
162
  const panelApps = usePanelApps({ enabled: shouldLoadPanelApps });
56
163
 
57
164
  const inputSurfacePlugins = useMemo(
58
- () => [
59
- createSlashCommandInputSurfacePlugin({
60
- commands,
61
- itemTexts: {
62
- panelAppTexts: {
63
- appIdLabel: t('chatPanelAppReferenceAppId', language),
64
- fileLabel: t('chatPanelAppReferenceFile', language),
65
- noDescriptionLabel: t('chatPanelAppReferenceNoDescription', language),
66
- subtitle: t('chatPanelAppReferenceType', language),
67
- },
68
- skillTexts: itemTexts.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
- createPanelAppReferenceInputSurfacePlugin({
94
- itemTexts: {
95
- appIdLabel: t('chatPanelAppReferenceAppId', language),
96
- fileLabel: t('chatPanelAppReferenceFile', language),
97
- noDescriptionLabel: t('chatPanelAppReferenceNoDescription', language),
98
- subtitle: t('chatPanelAppReferenceType', language)
99
- },
100
- menuTexts: {
101
- loadingLabel: t('chatPanelAppReferenceLoading', language),
102
- sectionLabel: t('chatPanelAppReferenceSection', language),
103
- emptyLabel: t('chatPanelAppReferenceNoResult', language),
104
- hintLabel: t('chatPanelAppReferenceHint', language),
105
- itemHintLabel: t('chatPanelAppReferenceItemHint', language)
106
- }
107
- })
108
- ],
165
+ () => buildChatInputSurfacePlugins({
166
+ commands,
167
+ language,
168
+ onNavigate: setReferenceMode,
169
+ onSelectPanelApp,
170
+ onSelectSkill,
171
+ slashTexts: itemTexts.slashTexts,
172
+ }),
109
173
  [
110
174
  commands,
111
175
  itemTexts.slashTexts,
@@ -118,9 +182,16 @@ export function useChatInputSurfaceState(params: {
118
182
  () => resolveChatInputSurfaceState({
119
183
  data: {
120
184
  isPanelAppsLoading: panelApps.isLoading || panelApps.isFetching,
185
+ isServerPathSearchLoading: serverPathSearch.isLoading || serverPathSearch.isFetching,
121
186
  isSkillsLoading,
122
187
  panelApps: panelApps.data?.entries ?? [],
188
+ projectRoot,
123
189
  recentSkillValues,
190
+ referenceMode,
191
+ serverPathEntries: serverPathSearch.data?.entries ?? [],
192
+ serverPathSearchError: serverPathSearch.error instanceof Error
193
+ ? serverPathSearch.error.message
194
+ : null,
124
195
  skillRecords
125
196
  },
126
197
  plugins: inputSurfacePlugins,
@@ -132,6 +203,12 @@ export function useChatInputSurfaceState(params: {
132
203
  panelApps.data?.entries,
133
204
  panelApps.isFetching,
134
205
  panelApps.isLoading,
206
+ projectRoot,
207
+ referenceMode,
208
+ serverPathSearch.data?.entries,
209
+ serverPathSearch.error,
210
+ serverPathSearch.isFetching,
211
+ serverPathSearch.isLoading,
135
212
  isSkillsLoading,
136
213
  recentSkillValues,
137
214
  skillRecords