@gientech/modual 2.0.3 → 2.0.5

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 (419) hide show
  1. package/.editorconfig +38 -0
  2. package/.prettierignore +16 -0
  3. package/.prettierrc +17 -0
  4. package/README.md +643 -643
  5. package/USAGE.md +247 -0
  6. package/bash.exe.stackdump +40 -0
  7. package/components.json +21 -0
  8. package/dist/README.md +643 -0
  9. package/{assets/GientechStreamReader-CzB5AuYo.js → dist/assets/GientechStreamReader-DUCq-O5X.js} +1 -1
  10. package/{assets → dist/assets}/database.svg +11 -11
  11. package/{assets → dist/assets}/database_add.svg +53 -53
  12. package/{assets → dist/assets}/database_connect.svg +66 -66
  13. package/{assets → dist/assets}/database_upload.svg +29 -29
  14. package/{assets → dist/assets}/databse.svg +6 -6
  15. package/{assets → dist/assets}/defaultWeLogo.svg +14 -14
  16. package/{assets → dist/assets}/graph.svg +4 -4
  17. package/{assets/index-CN2AYX8Q.js → dist/assets/index-B2yNvzjy.js} +1 -1
  18. package/{assets/index-D9lYd8TZ.js → dist/assets/index-BKe5FgcC.js} +1 -1
  19. package/{assets/index-CBTA5S-5.js → dist/assets/index-D72cKELw.js} +1 -1
  20. package/{assets/index-s0cmC4Ks.js → dist/assets/index-DdVFXD_y.js} +1 -1
  21. package/{assets/index-B1ZDDbC1.js → dist/assets/index-DrkSoKz6.js} +1 -1
  22. package/{assets/index-B2rFliXg.js → dist/assets/index-KCfkkJKb.js} +1 -1
  23. package/{assets/index-DnBY0UXI.js → dist/assets/index-QI9biQrR.js} +2 -2
  24. package/{assets/index-DYhXjvk4.js → dist/assets/index-ZopkeZtI.js} +1 -1
  25. package/{assets/index-LDFwTu47.js → dist/assets/index-g-SUxfJH.js} +1 -1
  26. package/{assets/index-NFQIKNFn.js → dist/assets/index-j0kQJd0a.js} +1 -1
  27. package/{assets → dist/assets}/knowledge.svg +4 -4
  28. package/{assets/MySQL.svg → dist/assets/mysql.svg} +14 -14
  29. package/{assets/plus-G7zGXf6S.js → dist/assets/plus-V9zUoSq6.js} +1 -1
  30. package/{assets → dist/assets}/sensitive.svg +5 -5
  31. package/{assets/style-Bn7b5XHU.js → dist/assets/style-CGmZ5osp.js} +2 -2
  32. package/{assets/x-vfKYzKkK.js → dist/assets/x-CnaaLGJF.js} +1 -1
  33. package/dist/assistantConfig.js +1 -0
  34. package/dist/chat.js +824 -0
  35. package/dist/database.js +20 -0
  36. package/dist/databaseId.js +1 -0
  37. package/{databaseTable.js → dist/databaseTable.js} +1 -1
  38. package/dist/index.js +1 -0
  39. package/{modelManage.js → dist/modelManage.js} +1 -1
  40. package/dist/package.json +68 -0
  41. package/{sensitive.js → dist/sensitive.js} +1 -1
  42. package/dist/streamFilesReader.js +1 -0
  43. package/{worker → dist/worker}/pdf.worker.min.js +21 -21
  44. package/doc_assets/2.png +0 -0
  45. package/doc_assets/demo.md +27 -0
  46. package/doc_assets/demos/dist-app/assets/index.Dh-ZAS9Z.css +2 -0
  47. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js +23699 -0
  48. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js.map +1 -0
  49. package/doc_assets/demos/dist-app/index.html +14 -0
  50. package/doc_assets/demos/dist-app/vite.svg +1 -0
  51. package/doc_assets/images/1.png +0 -0
  52. package/doc_assets/images/3.png +0 -0
  53. package/doc_assets/images/component-screenshot.png +1 -0
  54. package/doc_assets/install.md +5 -0
  55. package/doc_assets//346/226/271/346/241/210//344/274/230/345/214/226/346/226/271/346/241/210-/345/244/232/344/274/232/350/257/235SSE/350/277/236/346/216/245/347/256/241/347/220/206.md +504 -0
  56. package/eslint.config.js +92 -0
  57. package/index.html +13 -0
  58. package/package.json +106 -44
  59. package/package.json.demo-backup +109 -0
  60. package/postcss.config.cjs +19 -0
  61. package/public/icons/answerAwartar.png +0 -0
  62. package/public/icons/docx-file.png +0 -0
  63. package/public/icons/folder.png +0 -0
  64. package/public/icons/html.png +0 -0
  65. package/public/icons/image.png +0 -0
  66. package/public/icons/jpg-file.png +0 -0
  67. package/public/icons/json.png +0 -0
  68. package/public/icons/md.png +0 -0
  69. package/public/icons/pdf.png +0 -0
  70. package/public/icons/pptx.png +0 -0
  71. package/public/icons/questionAwartar.png +0 -0
  72. package/public/icons/sheets.png +0 -0
  73. package/public/icons/txt.png +0 -0
  74. package/public/icons/xlsx.png +0 -0
  75. package/public/vite.svg +1 -0
  76. package/public/worker/pdf.worker.min.js +22 -0
  77. package/scripts/README.md +133 -0
  78. package/scripts/build-demo.js +88 -0
  79. package/scripts/decrypt-api-key.js +95 -0
  80. package/scripts/demo-selector.js +216 -0
  81. package/scripts/dev-demo.js +76 -0
  82. package/scripts/preview-demo.js +130 -0
  83. package/scripts/run-demo.bat +34 -0
  84. package/src/assets/img/close.png +0 -0
  85. package/src/assets/img/database.png +0 -0
  86. package/src/assets/img/downArrow.png +0 -0
  87. package/src/assets/img/downLoad.png +0 -0
  88. package/src/assets/img/excel.png +0 -0
  89. package/src/assets/img/graphIcon.png +0 -0
  90. package/src/assets/img/img.png +0 -0
  91. package/src/assets/img/pdf.png +0 -0
  92. package/src/assets/img/ppt.png +0 -0
  93. package/src/assets/img/singleQa.png +0 -0
  94. package/src/assets/img/txt.png +0 -0
  95. package/src/assets/img/webSearch.png +0 -0
  96. package/src/assets/img/word.png +0 -0
  97. package/src/assets/login/homeBg.png +0 -0
  98. package/src/assets/login/left.jpg +0 -0
  99. package/src/assets/login/logoImg.png +0 -0
  100. package/src/examples/ConversationAssistantPage/index.tsx +41 -0
  101. package/src/examples/Demo/index.tsx +12 -0
  102. package/src/examples/LoginPage/index.tsx +18 -0
  103. package/src/examples/chat/components/DrawerGraphPreview.tsx +78 -0
  104. package/src/examples/chat/index.tsx +154 -0
  105. package/src/examples/chat/logo03.png +0 -0
  106. package/src/examples/gientechStreamFilesReader/index.tsx +951 -0
  107. package/src/examples/headlessChat/index.tsx +234 -0
  108. package/src/examples/ragDatabaseDataPage/index.tsx +40 -0
  109. package/src/examples/ragDatabaseIdPage/index.tsx +47 -0
  110. package/src/examples/ragDatabasePage/index.tsx +36 -0
  111. package/src/examples/ragModelManagePage/index.tsx +38 -0
  112. package/src/examples/ragSearchPage/index.tsx +0 -0
  113. package/src/examples/ragSensitiveWordsPage/index.tsx +32 -0
  114. package/src/examples/streamFiles/index.tsx +417 -0
  115. package/src/lib_enter.ts +43 -0
  116. package/src/main.tsx +5 -0
  117. package/src/main.tsx.backup +5 -0
  118. package/src/modules/CHAT_UNIFICATION_PLAN.md +324 -0
  119. package/src/modules/assistantConfig/assets/databse.svg +6 -0
  120. package/src/modules/assistantConfig/assets/empty.png +0 -0
  121. package/src/modules/assistantConfig/assets/graph.svg +4 -0
  122. package/src/modules/assistantConfig/assets/knowledge.svg +4 -0
  123. package/src/modules/assistantConfig/assets/sensitive.svg +5 -0
  124. package/src/modules/assistantConfig/components/Database.tsx +171 -0
  125. package/src/modules/assistantConfig/components/Graph.tsx +177 -0
  126. package/src/modules/assistantConfig/components/Knowledge.tsx +276 -0
  127. package/src/modules/assistantConfig/components/NotFoundContent.tsx +21 -0
  128. package/src/modules/assistantConfig/components/Paragraph.tsx +51 -0
  129. package/src/modules/assistantConfig/components/ParamsItem.tsx +39 -0
  130. package/src/modules/assistantConfig/components/ResourceBinderItem.tsx +133 -0
  131. package/src/modules/assistantConfig/components/SearchableSelector.tsx +500 -0
  132. package/src/modules/assistantConfig/components/Sensitive.tsx +221 -0
  133. package/src/modules/assistantConfig/components/SliderInput.tsx +65 -0
  134. package/src/modules/assistantConfig/constants.tsx +75 -0
  135. package/src/modules/assistantConfig/index.tsx +710 -0
  136. package/src/modules/assistantConfig/server.ts +262 -0
  137. package/src/modules/chat/Conversations/Item.tsx +167 -0
  138. package/src/modules/chat/Conversations/List.tsx +210 -0
  139. package/src/modules/chat/Conversations/groupByTime.ts +39 -0
  140. package/src/modules/chat/Conversations/index.tsx +252 -0
  141. package/src/modules/chat/ReferenceBar.tsx +622 -0
  142. package/src/modules/chat/constants.tsx +52 -0
  143. package/src/modules/chat/data.txt +82 -0
  144. package/src/modules/chat/index.tsx +2054 -0
  145. package/src/modules/chat/referenceCom/DeleteModal.tsx +75 -0
  146. package/src/modules/chat/referenceCom/DrawerContent.tsx +136 -0
  147. package/src/modules/chat/referenceCom/DrawerDatabase.tsx +102 -0
  148. package/src/modules/chat/referenceCom/DrawerGraphPreview.tsx +86 -0
  149. package/src/modules/chat/referenceCom/DrawerPreview.tsx +73 -0
  150. package/src/modules/chat/referenceCom/DrawerTitle.tsx +26 -0
  151. package/src/modules/chat/referenceCom/RenameModal.tsx +86 -0
  152. package/src/modules/chat/referenceCom/TagCom.tsx +30 -0
  153. package/src/modules/chat/style.less +3 -0
  154. package/src/modules/chat/types.ts +17 -0
  155. package/src/modules/chat/utils/index.ts +348 -0
  156. package/src/modules/database/CreateModal.tsx +403 -0
  157. package/src/modules/database/assets/Doris.png +0 -0
  158. package/src/modules/database/assets/PostgreSQL.png +0 -0
  159. package/src/modules/database/assets/SQLServer.png +0 -0
  160. package/src/modules/database/assets/database.svg +11 -0
  161. package/src/modules/database/assets/database_add.svg +53 -0
  162. package/src/modules/database/assets/database_connect.svg +66 -0
  163. package/src/modules/database/assets/database_upload.svg +29 -0
  164. package/src/modules/database/assets/empty.png +0 -0
  165. package/src/modules/database/assets/mysql.svg +14 -0
  166. package/src/modules/database/index.tsx +477 -0
  167. package/src/modules/database/server.ts +196 -0
  168. package/src/modules/databaseId/CustomCom.tsx +156 -0
  169. package/src/modules/databaseId/EditConfig.tsx +280 -0
  170. package/src/modules/databaseId/UploadDrawer.tsx +535 -0
  171. package/src/modules/databaseId/assets/aiOptimize.svg +10 -0
  172. package/src/modules/databaseId/assets/empty.png +0 -0
  173. package/src/modules/databaseId/assets/template.svg +6 -0
  174. package/src/modules/databaseId/assets/upload.svg +9 -0
  175. package/src/modules/databaseId/assets/useTemp.svg +6 -0
  176. package/src/modules/databaseId/index.tsx +769 -0
  177. package/src/modules/databaseId/server.ts +286 -0
  178. package/src/modules/databaseId/style.css +5 -0
  179. package/src/modules/databaseTable/EditRowDrawer.tsx +124 -0
  180. package/src/modules/databaseTable/index.tsx +359 -0
  181. package/src/modules/databaseTable/server.ts +180 -0
  182. package/src/modules/headlessChat/ReferenceBar.tsx +783 -0
  183. package/src/modules/headlessChat/constants.tsx +54 -0
  184. package/src/modules/headlessChat/index.tsx +1706 -0
  185. package/src/modules/headlessChat/referenceCom/DeleteModal.tsx +75 -0
  186. package/src/modules/headlessChat/referenceCom/DrawerContent.tsx +136 -0
  187. package/src/modules/headlessChat/referenceCom/DrawerDatabase.tsx +102 -0
  188. package/src/modules/headlessChat/referenceCom/DrawerGraphPreview.tsx +86 -0
  189. package/src/modules/headlessChat/referenceCom/DrawerPreview.tsx +73 -0
  190. package/src/modules/headlessChat/referenceCom/DrawerTitle.tsx +26 -0
  191. package/src/modules/headlessChat/referenceCom/RenameModal.tsx +86 -0
  192. package/src/modules/headlessChat/referenceCom/TagCom.tsx +30 -0
  193. package/src/modules/headlessChat/style.less +3 -0
  194. package/src/modules/headlessChat/types.ts +23 -0
  195. package/src/modules/headlessChat/utils/index.ts +348 -0
  196. package/src/modules/login/components/Login/LoginBox/index.tsx +102 -0
  197. package/src/modules/login/components/Login/RegisterBox/index.tsx +180 -0
  198. package/src/modules/login/components/Login/index.tsx +100 -0
  199. package/src/modules/login/index.tsx +106 -0
  200. package/src/modules/login/style.css +3 -0
  201. package/src/modules/login/useServices.ts +53 -0
  202. package/src/modules/login/utils.ts +42 -0
  203. package/src/modules/modelManage/ConfigDrawer.tsx +249 -0
  204. package/src/modules/modelManage/ReplaceModal.tsx +124 -0
  205. package/src/modules/modelManage/assets/empty.png +0 -0
  206. package/src/modules/modelManage/const.ts +51 -0
  207. package/src/modules/modelManage/index.tsx +606 -0
  208. package/src/modules/modelManage/server.ts +223 -0
  209. package/src/modules/nodegraph/index.tsx +1 -0
  210. package/src/modules/search/assets/Icon-history.svg +8 -0
  211. package/src/modules/search/assets/answerAwartar.png +0 -0
  212. package/src/modules/search/assets/doc.png +0 -0
  213. package/src/modules/search/assets/genera.gif +0 -0
  214. package/src/modules/search/assets/icon-robot.svg +9 -0
  215. package/src/modules/search/assets/icon-search-bar.svg +14 -0
  216. package/src/modules/search/assets/icon-sub-title.svg +3 -0
  217. package/src/modules/search/assets/icon-title.svg +9 -0
  218. package/src/modules/search/assets/icon-zoomOut.svg +9 -0
  219. package/src/modules/search/assets/iconAi.svg +9 -0
  220. package/src/modules/search/assets/pdf.png +0 -0
  221. package/src/modules/search/assets/ppt.png +0 -0
  222. package/src/modules/search/assets/search.svg +3 -0
  223. package/src/modules/search/assets/selected.svg +4 -0
  224. package/src/modules/search/assets/txt.png +0 -0
  225. package/src/modules/search/assets/xls.png +0 -0
  226. package/src/modules/search/components/AssisSelect.tsx +137 -0
  227. package/src/modules/search/components/Editor/ChatViewEditor.tsx +261 -0
  228. package/src/modules/search/components/Editor/aichat.css +1 -0
  229. package/src/modules/search/components/Editor/constant.ts +13 -0
  230. package/src/modules/search/components/Editor/index.tsx +113 -0
  231. package/src/modules/search/components/Editor/plugins/autofomatRules.ts +332 -0
  232. package/src/modules/search/components/Editor/plugins/convertImgPlugins.tsx +20 -0
  233. package/src/modules/search/components/Editor/plugins/createIndexes.tsx +38 -0
  234. package/src/modules/search/components/Editor/plugins/displayer.ts +298 -0
  235. package/src/modules/search/components/Editor/plugins/imageClick.tsx +32 -0
  236. package/src/modules/search/components/Editor/plugins/myplugin.tsx +98 -0
  237. package/src/modules/search/components/Editor/ui/avatar.tsx +19 -0
  238. package/src/modules/search/components/Editor/ui/blockquote-element.tsx +21 -0
  239. package/src/modules/search/components/Editor/ui/button.tsx +58 -0
  240. package/src/modules/search/components/Editor/ui/calendar.tsx +68 -0
  241. package/src/modules/search/components/Editor/ui/caption.tsx +46 -0
  242. package/src/modules/search/components/Editor/ui/checkbox.tsx +27 -0
  243. package/src/modules/search/components/Editor/ui/code-block-combobox.tsx +188 -0
  244. package/src/modules/search/components/Editor/ui/code-block-element.css +434 -0
  245. package/src/modules/search/components/Editor/ui/code-block-element.tsx +39 -0
  246. package/src/modules/search/components/Editor/ui/code-leaf.tsx +24 -0
  247. package/src/modules/search/components/Editor/ui/code-line-element.tsx +10 -0
  248. package/src/modules/search/components/Editor/ui/code-syntax-leaf.tsx +21 -0
  249. package/src/modules/search/components/Editor/ui/column-element.tsx +30 -0
  250. package/src/modules/search/components/Editor/ui/column-group-element.tsx +94 -0
  251. package/src/modules/search/components/Editor/ui/command.tsx +75 -0
  252. package/src/modules/search/components/Editor/ui/comment-avatar.tsx +22 -0
  253. package/src/modules/search/components/Editor/ui/comment-create-form.tsx +37 -0
  254. package/src/modules/search/components/Editor/ui/comment-item.tsx +74 -0
  255. package/src/modules/search/components/Editor/ui/comment-leaf.tsx +49 -0
  256. package/src/modules/search/components/Editor/ui/comment-more-dropdown.tsx +42 -0
  257. package/src/modules/search/components/Editor/ui/comment-reply-items.tsx +22 -0
  258. package/src/modules/search/components/Editor/ui/comment-resolve-button.tsx +32 -0
  259. package/src/modules/search/components/Editor/ui/comment-value.tsx +34 -0
  260. package/src/modules/search/components/Editor/ui/comments-popover.tsx +63 -0
  261. package/src/modules/search/components/Editor/ui/date-element.tsx +83 -0
  262. package/src/modules/search/components/Editor/ui/dialog.tsx +63 -0
  263. package/src/modules/search/components/Editor/ui/draggable.tsx +177 -0
  264. package/src/modules/search/components/Editor/ui/dropdown-menu.tsx +180 -0
  265. package/src/modules/search/components/Editor/ui/emoji-input-element.tsx +85 -0
  266. package/src/modules/search/components/Editor/ui/excalidraw-element.tsx +28 -0
  267. package/src/modules/search/components/Editor/ui/fixed-toolbar-buttons.tsx +76 -0
  268. package/src/modules/search/components/Editor/ui/fixed-toolbar.tsx +8 -0
  269. package/src/modules/search/components/Editor/ui/floating-toolbar-buttons.tsx +51 -0
  270. package/src/modules/search/components/Editor/ui/floating-toolbar.tsx +77 -0
  271. package/src/modules/search/components/Editor/ui/heading-element.tsx +48 -0
  272. package/src/modules/search/components/Editor/ui/highlight-leaf.tsx +17 -0
  273. package/src/modules/search/components/Editor/ui/hr-element.tsx +30 -0
  274. package/src/modules/search/components/Editor/ui/icons.tsx +267 -0
  275. package/src/modules/search/components/Editor/ui/image-element.tsx +74 -0
  276. package/src/modules/search/components/Editor/ui/inline-combobox.tsx +368 -0
  277. package/src/modules/search/components/Editor/ui/input.tsx +25 -0
  278. package/src/modules/search/components/Editor/ui/insert-dropdown-menu.tsx +218 -0
  279. package/src/modules/search/components/Editor/ui/kbd-leaf.tsx +20 -0
  280. package/src/modules/search/components/Editor/ui/link-element.tsx +29 -0
  281. package/src/modules/search/components/Editor/ui/link-floating-toolbar.tsx +161 -0
  282. package/src/modules/search/components/Editor/ui/list-element.tsx +30 -0
  283. package/src/modules/search/components/Editor/ui/mark-toolbar-button.tsx +24 -0
  284. package/src/modules/search/components/Editor/ui/media-embed-element.tsx +133 -0
  285. package/src/modules/search/components/Editor/ui/media-popover.tsx +97 -0
  286. package/src/modules/search/components/Editor/ui/mention-element.tsx +43 -0
  287. package/src/modules/search/components/Editor/ui/mention-input-element.tsx +141 -0
  288. package/src/modules/search/components/Editor/ui/mode-dropdown-menu.tsx +93 -0
  289. package/src/modules/search/components/Editor/ui/more-dropdown-menu.tsx +67 -0
  290. package/src/modules/search/components/Editor/ui/paragraph-element.tsx +4 -0
  291. package/src/modules/search/components/Editor/ui/placeholder.tsx +52 -0
  292. package/src/modules/search/components/Editor/ui/popover.tsx +32 -0
  293. package/src/modules/search/components/Editor/ui/resizable.tsx +66 -0
  294. package/src/modules/search/components/Editor/ui/separator.tsx +25 -0
  295. package/src/modules/search/components/Editor/ui/style.less +12 -0
  296. package/src/modules/search/components/Editor/ui/table-cell-element.tsx +143 -0
  297. package/src/modules/search/components/Editor/ui/table-element.tsx +243 -0
  298. package/src/modules/search/components/Editor/ui/table-row-element.tsx +22 -0
  299. package/src/modules/search/components/Editor/ui/tableValue.tsx +135 -0
  300. package/src/modules/search/components/Editor/ui/todo-list-element.tsx +43 -0
  301. package/src/modules/search/components/Editor/ui/toggle-element.tsx +31 -0
  302. package/src/modules/search/components/Editor/ui/toolbar.tsx +157 -0
  303. package/src/modules/search/components/Editor/ui/tooltip.tsx +65 -0
  304. package/src/modules/search/components/Editor/ui/turn-into-dropdown-menu.tsx +160 -0
  305. package/src/modules/search/components/Editor/ui/with-draggables.tsx +175 -0
  306. package/src/modules/search/components/FileList.tsx +287 -0
  307. package/src/modules/search/components/ImageGroupView/index.tsx +85 -0
  308. package/src/modules/search/components/ResultContent.tsx +232 -0
  309. package/src/modules/search/components/SearchInput.tsx +232 -0
  310. package/src/modules/search/components/SearchLanding.tsx +74 -0
  311. package/src/modules/search/components/SearchView.tsx +563 -0
  312. package/src/modules/search/components/SimpleEditor.tsx +158 -0
  313. package/src/modules/search/components/SimpleFileList.tsx +215 -0
  314. package/src/modules/search/index.tsx +10 -0
  315. package/src/modules/search/reademe.md +1 -0
  316. package/src/modules/search/servers/apis.tsx +19 -0
  317. package/src/modules/search/servers/index.ts +184 -0
  318. package/src/modules/search/style.less +503 -0
  319. package/src/modules/search/type.ts +22 -0
  320. package/src/modules/search/utils.ts +34 -0
  321. package/src/modules/sensitive/index.tsx +313 -0
  322. package/src/modules/sensitive/server.ts +122 -0
  323. package/src/modules/streamFilesReader/GientechStreamReader.tsx +1625 -0
  324. package/src/modules/streamFilesReader/components/Header/Toolbar.tsx +0 -0
  325. package/src/modules/streamFilesReader/components/Header/index.tsx +297 -0
  326. package/src/modules/streamFilesReader/index.tsx +3 -0
  327. package/src/style.css +6 -0
  328. package/src/type.d.ts +0 -0
  329. package/src/utils/commonFn.tsx +111 -0
  330. package/src/utils/decryptApiKey.ts +40 -0
  331. package/src/utils/gientechCommon/components/AppError.tsx +32 -0
  332. package/src/utils/gientechCommon/components/AppLoading.tsx +75 -0
  333. package/src/utils/gientechCommon/components/DeleteModal.tsx +75 -0
  334. package/src/utils/gientechCommon/components/DisplayError.tsx +33 -0
  335. package/src/utils/gientechCommon/components/DisplayLoading.tsx +38 -0
  336. package/src/utils/gientechCommon/components/FeedBackModal.tsx +319 -0
  337. package/src/utils/gientechCommon/components/FileCardCommon.tsx +82 -0
  338. package/src/utils/gientechCommon/components/FileManager/index.tsx +400 -0
  339. package/src/utils/gientechCommon/components/FileManager/style.css +5 -0
  340. package/src/utils/gientechCommon/components/Messages/GientechNewChatWelcome.tsx +581 -0
  341. package/src/utils/gientechCommon/components/Messages/ReferenceCard.tsx +359 -0
  342. package/src/utils/gientechCommon/components/Messages/RetriveItem.tsx +245 -0
  343. package/src/utils/gientechCommon/components/Messages/WebRetriveItem.tsx +209 -0
  344. package/src/utils/gientechCommon/components/Messages/defaultBot.png +0 -0
  345. package/src/utils/gientechCommon/components/Messages/defaultStyleSet.tsx +148 -0
  346. package/src/utils/gientechCommon/components/Messages/defaultWeLogo.svg +14 -0
  347. package/src/utils/gientechCommon/components/RenameModal.tsx +86 -0
  348. package/src/utils/gientechCommon/components/style.less +11 -0
  349. package/src/utils/gientechCommon/configs/commonConfig.ts +2 -0
  350. package/src/utils/gientechCommon/configs/senderConfig.ts +0 -0
  351. package/src/utils/gientechCommon/configs/stylesConfig.ts +142 -0
  352. package/src/utils/gientechCommon/hooks/AichatUseController.tsx +417 -0
  353. package/src/utils/gientechCommon/hooks/useFileDisplayTools.tsx +204 -0
  354. package/src/utils/gientechCommon/hooks/useFileManager.ts +193 -0
  355. package/src/utils/gientechCommon/slate/converters/deserializers.ts +763 -0
  356. package/src/utils/gientechCommon/slate/converters/mockData.ts +232 -0
  357. package/src/utils/gientechCommon/slate/converters/slateConverters.ts +258 -0
  358. package/src/utils/gientechCommon/slate/richElements/index.tsx +499 -0
  359. package/src/utils/gientechCommon/utils/fileUtils.ts +86 -0
  360. package/src/utils/gientechCommon/utils/request.ts +37 -0
  361. package/src/utils/gientechCommon/utils/serverFn.ts +172 -0
  362. package/src/utils/index.tsx +142 -0
  363. package/src/utils/testconfigs/demologin/index.tsx +32 -0
  364. package/src/utils/testconfigs/index.ts +59 -0
  365. package/src/vite-env.d.ts +42 -0
  366. package/stats.html +4949 -0
  367. package/tailwind.config.js +170 -0
  368. package/tsconfig.app.json +30 -0
  369. package/tsconfig.app.tsbuildinfo +11 -0
  370. package/tsconfig.json +13 -0
  371. package/tsconfig.node.json +22 -0
  372. package/tsconfig.node.tsbuildinfo +1 -0
  373. package/vite.config.app.ts +93 -0
  374. package/vite.config.ts +232 -0
  375. package/workflows/release.yml +60 -0
  376. package//346/215/242/350/241/214/346/240/274/345/274/217/344/277/235/346/214/201/344/274/230/345/214/226/346/226/271/346/241/210.md +359 -0
  377. package/assistantConfig.js +0 -1
  378. package/chat.js +0 -786
  379. package/database.js +0 -20
  380. package/databaseId.js +0 -1
  381. package/index.js +0 -1
  382. package/streamFilesReader.js +0 -1
  383. /package/{assets → dist/assets}/Doris.png +0 -0
  384. /package/{assets → dist/assets}/PostgreSQL.png +0 -0
  385. /package/{assets → dist/assets}/SQLServer.png +0 -0
  386. /package/{assets → dist/assets}/empty.png +0 -0
  387. /package/{assets → dist/assets}/homeBg.png +0 -0
  388. /package/{assets → dist/assets}/index-CpW6Dhpp.js +0 -0
  389. /package/{assets → dist/assets}/left.jpg +0 -0
  390. /package/{assets → dist/assets}/logoImg.png +0 -0
  391. /package/{assets → dist/assets}/style.css +0 -0
  392. /package/{assets → dist/assets}/style2.css +0 -0
  393. /package/{assets → dist/assets}/style3.css +0 -0
  394. /package/{assets → dist/assets}/style4.css +0 -0
  395. /package/{assets → dist/assets}/worker-BbpylX7l.js +0 -0
  396. /package/{assistantConfig.d.ts → dist/assistantConfig.d.ts} +0 -0
  397. /package/{chat.d.ts → dist/chat.d.ts} +0 -0
  398. /package/{database.d.ts → dist/database.d.ts} +0 -0
  399. /package/{databaseId.d.ts → dist/databaseId.d.ts} +0 -0
  400. /package/{databaseTable.d.ts → dist/databaseTable.d.ts} +0 -0
  401. /package/{icons → dist/icons}/answerAwartar.png +0 -0
  402. /package/{icons → dist/icons}/docx-file.png +0 -0
  403. /package/{icons → dist/icons}/folder.png +0 -0
  404. /package/{icons → dist/icons}/html.png +0 -0
  405. /package/{icons → dist/icons}/image.png +0 -0
  406. /package/{icons → dist/icons}/jpg-file.png +0 -0
  407. /package/{icons → dist/icons}/json.png +0 -0
  408. /package/{icons → dist/icons}/md.png +0 -0
  409. /package/{icons → dist/icons}/pdf.png +0 -0
  410. /package/{icons → dist/icons}/pptx.png +0 -0
  411. /package/{icons → dist/icons}/questionAwartar.png +0 -0
  412. /package/{icons → dist/icons}/sheets.png +0 -0
  413. /package/{icons → dist/icons}/txt.png +0 -0
  414. /package/{icons → dist/icons}/xlsx.png +0 -0
  415. /package/{index.d.ts → dist/index.d.ts} +0 -0
  416. /package/{modelManage.d.ts → dist/modelManage.d.ts} +0 -0
  417. /package/{sensitive.d.ts → dist/sensitive.d.ts} +0 -0
  418. /package/{streamFilesReader.d.ts → dist/streamFilesReader.d.ts} +0 -0
  419. /package/{vite.svg → dist/vite.svg} +0 -0
@@ -0,0 +1,262 @@
1
+ import axios from 'axios';
2
+
3
+ interface DatabaseApiProps {
4
+ url?: string;
5
+ token?: string;
6
+ role?: string;
7
+ eventsEmit?: (name: string, data: any) => void;
8
+ }
9
+
10
+ const AxiosInstance = ({ url, token, role, eventsEmit }: DatabaseApiProps) => {
11
+ const axios$ = axios.create({
12
+ baseURL: url,
13
+ // 配置请求超时时间
14
+ timeout: 1000000,
15
+ });
16
+ // 请求拦截
17
+ axios$.interceptors.request.use((config: any) => {
18
+ let target_cookie = token;
19
+
20
+ const noA = ['user/login', 'user/kaptcha', 'user/regist'];
21
+ // dangerous behaviour
22
+ if (!target_cookie && !noA.some((item: string) => config.url.includes(item))) {
23
+ // 通过eventsEmit抛出认证错误事件,让调用层处理
24
+ if (eventsEmit) {
25
+ eventsEmit('request:error_auth', {
26
+ errorMsg: '未登录或token已过期',
27
+ redirect: '/login',
28
+ });
29
+ }
30
+ return Promise.reject(new Error('未登录或token已过期'));
31
+ }
32
+
33
+ config.headers.Authorization = target_cookie || '';
34
+ // 这里传中文会报错
35
+ config.headers.userName = role === '未登录用户' ? '' : role;
36
+ return config;
37
+ });
38
+
39
+ // 返回拦截
40
+ axios$.interceptors.response.use(
41
+ response => {
42
+ // 获取接口返回结果
43
+ const noA = ['user/kaptcha'];
44
+ const res = response.data;
45
+ if (noA.some((item: string) => response.config.url && response.config.url.includes(item))) {
46
+ return res;
47
+ }
48
+ if (res.size && res.type) {
49
+ return res;
50
+ }
51
+ const { success, errorMsg, errorCode } = res;
52
+
53
+ if (success) {
54
+ return res;
55
+ } else {
56
+ // 通过eventsEmit抛出业务错误事件,让调用层处理
57
+ if (eventsEmit) {
58
+ eventsEmit('request:error_business', {
59
+ errorCode,
60
+ errorMsg: errorMsg || '请求出错,请稍后再试',
61
+ response: res,
62
+ });
63
+ }
64
+ }
65
+ },
66
+ error => {
67
+ // 主动取消请求,不给报错信息
68
+ if (error.message === 'canceled') {
69
+ return Promise.reject(error);
70
+ }
71
+
72
+ // 通过eventsEmit抛出网络错误事件,让调用层处理
73
+ if (eventsEmit) {
74
+ let errorType = 'request:error_network';
75
+ let errorData: any = {
76
+ errorMsg: '网络请求失败',
77
+ error: error,
78
+ };
79
+
80
+ if (error?.response?.status === 401) {
81
+ errorType = 'request:error_auth';
82
+ errorData = {
83
+ errorMsg: '没有足够权限',
84
+ error: error,
85
+ redirect: '/login',
86
+ };
87
+ } else if (
88
+ error?.response?.data?.errorCode === '30013' ||
89
+ error?.response?.data?.errorCode === '30023'
90
+ ) {
91
+ errorType = 'request:error_business';
92
+ errorData = {
93
+ errorCode: error?.response?.data?.errorCode,
94
+ errorMsg: error?.response?.data?.errorMsg || '请求出错,请稍后再试',
95
+ error: error,
96
+ };
97
+ }
98
+
99
+ eventsEmit(errorType, errorData);
100
+ }
101
+ return Promise.reject(error);
102
+ }
103
+ );
104
+
105
+ const getConfigById = async (id: any) => {
106
+ try {
107
+ const res: any = await axios$.get(`/qa/search/config/getById?configId=${id}`);
108
+ const { success, data } = res;
109
+ if (success) return data;
110
+ return false;
111
+ } catch (e) {
112
+ console.error('getConfigById', e);
113
+ }
114
+ };
115
+
116
+ const fetchDatabases = async () => {
117
+ try {
118
+ const res: any = await axios$.get(`/index/database/queryAllDBList`);
119
+ const { success, data } = res;
120
+ if (success) return data;
121
+ return false;
122
+ } catch (e) {
123
+ console.error('fetchDatabases', e);
124
+ }
125
+ };
126
+
127
+ const fetchConfigItemLimit = async () => {
128
+ try {
129
+ const res: any = await axios$.get(`/qa/search/config/configItemLimit`);
130
+ const { success, data } = res;
131
+ if (success) return data;
132
+ return false;
133
+ } catch (e) {
134
+ console.error('fetchConfigItemLimit error', e);
135
+ }
136
+ };
137
+
138
+ const fetchSensitiveLibrary = async (params: any) => {
139
+ try {
140
+ const res: any = await axios$.get(
141
+ `/sensitive/library?${new URLSearchParams(params).toString()}`
142
+ );
143
+ const { success, data } = res;
144
+ if (success) return data;
145
+ return false;
146
+ } catch (e) {
147
+ console.log('fetchSensitiveLibrary error', e);
148
+ return false;
149
+ }
150
+ };
151
+
152
+ const fetchModels = async (params: any) => {
153
+ try {
154
+ const res: any = await axios$.get(
155
+ `/index/modelInfo/allPage?${new URLSearchParams(params).toString()}`
156
+ );
157
+ const { success, data } = res;
158
+ if (success) return data;
159
+ return false;
160
+ } catch (e) {
161
+ console.log('fetchModels error', e);
162
+ return false;
163
+ }
164
+ };
165
+
166
+ const fetchKnowledgeBase = async (createBy?: string) => {
167
+ try {
168
+ const urlParams = createBy ? `?userName=${createBy}` : '';
169
+ console.log('+++', urlParams);
170
+
171
+ const res: any = await axios$.get(`/index/knowledgeBase/searchList${urlParams}`);
172
+ const { success, data } = res;
173
+ if (success) return data;
174
+ return false;
175
+ } catch (error) {
176
+ console.log('e', error);
177
+ }
178
+ };
179
+
180
+ const fetchGraphs = async () => {
181
+ try {
182
+ const res: any = await axios$.get(
183
+ `/index/graph/platform/querySnapshotList?pageSize=999&pageNo=1`
184
+ );
185
+ const { success, data } = res;
186
+ if (success) return data;
187
+ return false;
188
+ } catch (e) {
189
+ console.error('fetchGraphs', e);
190
+ }
191
+ };
192
+
193
+ const addConversationAssistant = async (params: any) => {
194
+ try {
195
+ const res: any = await axios$.post(`/qa/search/config/add`, {
196
+ ...params,
197
+ });
198
+
199
+ const { success, data } = res;
200
+ if (success) return data;
201
+ } catch (e) {
202
+ console.log('addConversationAssistant error:', e);
203
+ return false;
204
+ }
205
+ };
206
+
207
+ const updateConversationAssistant = async (id: string | number, params: any) => {
208
+ try {
209
+ const res: any = await axios$.put(`/qa/search/config/update`, {
210
+ id,
211
+ ...params,
212
+ });
213
+
214
+ const { success, data } = res;
215
+ if (success) return data;
216
+ } catch (e) {
217
+ console.log('updateConversationAssistant error:', e);
218
+ return false;
219
+ }
220
+ };
221
+
222
+ const getBizLabelLabels = async (params: any) => {
223
+ try {
224
+ const res: any = await axios$.post(`/index/bizLabel/labels`, params);
225
+
226
+ const { success, data } = res;
227
+ if (success) return data;
228
+ } catch (e) {
229
+ console.log('updateConversationAssistant error:', e);
230
+ return false;
231
+ }
232
+ };
233
+
234
+ const checkName = async (name: string, id?: string | number) => {
235
+ try {
236
+ const res: any = await axios$.get(
237
+ `/qa/search/config/checkName?configName=${name}${id ? `&configId=${id}` : ''}`
238
+ );
239
+ const { success, data } = res;
240
+ if (success) return data;
241
+ } catch (e) {
242
+ console.log('updateConversationAssistant error:', e);
243
+ return false;
244
+ }
245
+ };
246
+
247
+ return {
248
+ getConfigById,
249
+ fetchDatabases,
250
+ fetchModels,
251
+ fetchSensitiveLibrary,
252
+ fetchConfigItemLimit,
253
+ fetchKnowledgeBase,
254
+ fetchGraphs,
255
+ checkName,
256
+ getBizLabelLabels,
257
+ addConversationAssistant,
258
+ updateConversationAssistant,
259
+ };
260
+ };
261
+
262
+ export default AxiosInstance;
@@ -0,0 +1,167 @@
1
+ import React, { useMemo, useState } from 'react';
2
+ import { Dropdown } from 'antd';
3
+ import type { MenuProps } from 'antd';
4
+ import { MoreHorizontal, Edit2, Trash2 } from 'lucide-react';
5
+ import { ListItemType } from '.';
6
+ import dayjs from 'dayjs';
7
+
8
+ export interface GientechConversationBarItemProps {
9
+ isActive: boolean;
10
+ isDisabled: boolean;
11
+ data: ListItemType;
12
+ isNew: boolean;
13
+ eventsEmit?: (type: string, data?: any) => void;
14
+ styles?: any;
15
+ assistantList?: any[];
16
+ }
17
+
18
+ export function GientechConversationBarItem({ isActive, isNew, isDisabled, data, eventsEmit, styles = {}, assistantList = [] }: GientechConversationBarItemProps) {
19
+ const [hovered, setHovered] = useState(false);
20
+ const colors = styles?.colors || {};
21
+
22
+ // 由 configId 匹配助手名称(优先用 name,其次 configJson.config_name)
23
+ const assistantName = useMemo(() => {
24
+ const id = data?.configId;
25
+ if (!id || !assistantList || assistantList.length === 0) return '未选择助手';
26
+ const found = assistantList.find((a: any) => String(a?.id) === String(id));
27
+ if (!found) return '未选择助手';
28
+ if (found?.name) return found.name;
29
+ try {
30
+ const cj = typeof found.configJson === 'string' ? JSON.parse(found.configJson) : found.configJson;
31
+ return cj?.config_name || '未选择助手';
32
+ } catch {
33
+ return '未选择助手';
34
+ }
35
+ }, [assistantList, data?.configId]);
36
+
37
+ // antd v5+ menu items
38
+ const menuItems: MenuProps['items'] = [
39
+ {
40
+ key: 'rename',
41
+ icon: <Edit2 size={12} />,
42
+ label: '重命名',
43
+ onClick: (info) => {
44
+ info.domEvent.stopPropagation();
45
+ eventsEmit&&eventsEmit('conversations:rename_icon_clicked', data);
46
+ },
47
+ },
48
+ {
49
+ key: 'delete',
50
+ icon: <Trash2 size={12} />,
51
+ label: '删除',
52
+ danger: true,
53
+ onClick: (info) => {
54
+ info.domEvent.stopPropagation();
55
+ eventsEmit&&eventsEmit('conversations:delete_icon_clicked', data);
56
+ },
57
+ },
58
+ ];
59
+
60
+
61
+ // 动态样式
62
+ const itemBg = isActive
63
+ ? colors.activeItemBg || '#f0f4ff'
64
+ : hovered
65
+ ? colors.itemHoverBg || '#f5f7fa'
66
+ : colors.itemBg || 'transparent';
67
+ const itemText = isActive
68
+ ? colors.activeItemText || colors.primary || '#0122ff'
69
+ : colors.itemText || '#333';
70
+ const borderColor = isActive
71
+ ? colors.activeItemBorder || colors.primary || '#0122ff'
72
+ : 'transparent';
73
+
74
+ // 格式化时间显示
75
+ const formatTime = (timestamp: number) => {
76
+ const now = dayjs();
77
+ const messageTime = dayjs(timestamp);
78
+ const isToday = now.isSame(messageTime, 'day');
79
+
80
+ if (isToday) {
81
+ return messageTime.format('HH:mm');
82
+ } else {
83
+ return messageTime.format('MM-DD HH:mm');
84
+ }
85
+ };
86
+
87
+ return (
88
+ <div
89
+ className={`flex relative items-center justify-between mb-2 px-4 py-3 rounded-md transition-colors cursor-pointer select-none`}
90
+ onClick={() => !isDisabled && eventsEmit&&eventsEmit('conversation:item_click', data)}
91
+ onMouseEnter={() => setHovered(true)}
92
+ onMouseLeave={() => setHovered(false)}
93
+ style={{
94
+ minHeight: 48,
95
+ background: itemBg,
96
+ color: itemText,
97
+ border: `1px solid ${borderColor}`,
98
+ ...styles.item,
99
+ opacity: isDisabled ? 0.5 : 1,
100
+ }}
101
+ >
102
+ <div className="flex flex-col gap-y-2 flex-1 min-w-0">
103
+ {/* 主标题 */}
104
+ <span
105
+ className="truncate text-sm max-w-[160px] font-medium"
106
+ title={data.label || '未命名会话'}
107
+ style={{
108
+ color: itemText,
109
+ fontSize: '14px',
110
+ lineHeight: '1.4'
111
+ }}
112
+ >
113
+ {data.label || '未命名会话'}
114
+ </span>
115
+
116
+ {/* 副标题和时间 */}
117
+ <div className="flex items-center justify-between gap-2">
118
+ <span
119
+ className="text-xs truncate flex-1"
120
+ style={{
121
+ color: isActive ? colors.activeItemTextSecondary || '#666' : colors.itemTextSecondary || '#666',
122
+ fontSize: '12px',
123
+ lineHeight: '1.3'
124
+ }}
125
+ >
126
+ {assistantName}
127
+ </span>
128
+
129
+ {/* 时间显示 */}
130
+ {data.gmtModified && (
131
+ <span
132
+ className="text-xs flex-shrink-0"
133
+ style={{
134
+ color: isActive ? colors.activeItemTextSecondary || '#999' : colors.itemTextSecondary || '#999',
135
+ fontSize: '12px',
136
+ lineHeight: '1.3'
137
+ }}
138
+ >
139
+ {formatTime(data.gmtModified)}
140
+ </span>
141
+ )}
142
+ </div>
143
+ </div>
144
+
145
+ {/* 省略号菜单 */}
146
+ {!isDisabled && hovered && !isNew && (
147
+ <div className="absolute top-2 right-3">
148
+ <Dropdown
149
+ menu={{ items: menuItems }}
150
+ trigger={['click']}
151
+ placement="bottomRight"
152
+ >
153
+ <MoreHorizontal
154
+ size={16}
155
+ className="text-gray-600 hover:text-gray-800"
156
+ style={{
157
+ cursor: 'pointer',
158
+ color: isActive ? colors.activeItemTextSecondary || '#999' : colors.itemTextSecondary || '#999'
159
+ }}
160
+ onClick={(e: React.MouseEvent) => e.stopPropagation()}
161
+ />
162
+ </Dropdown>
163
+ </div>
164
+ )}
165
+ </div>
166
+ );
167
+ }
@@ -0,0 +1,210 @@
1
+ import React, { useMemo, useRef, useEffect } from 'react';
2
+ import { VariableSizeList as List } from 'react-window';
3
+ import { GientechConversationBarItem } from './Item';
4
+ import { groupConversationsByTime, ListItemType } from './groupByTime';
5
+ import { Flipper, Flipped } from 'react-flip-toolkit';
6
+
7
+ export interface GientechConversationBarListProps {
8
+ data: ListItemType[];
9
+ activedItem: string;
10
+ onChange?: (sessionId: string) => void;
11
+ onDelete?: (item: ListItemType) => void;
12
+ sortRules?: { label: string; dayPeriod: number }[];
13
+ eventsEmit?: (eventName: string, data?: any) => void;
14
+ assistantList?: any[];
15
+ height?: number;
16
+ styles?: any;
17
+ hasMore?: boolean;
18
+ loadingMore?: boolean;
19
+ }
20
+
21
+ export function GientechConversationBarList(
22
+ props: GientechConversationBarListProps & { styles?: any }
23
+ ) {
24
+ const {
25
+ data,
26
+ activedItem,
27
+ onChange,
28
+ onDelete,
29
+ sortRules = [{ label: '当天', dayPeriod: 1 }],
30
+ eventsEmit,
31
+ assistantList,
32
+ height = 400,
33
+ styles = {},
34
+ hasMore = false,
35
+ loadingMore = false,
36
+ } = props;
37
+
38
+ // 用于动画的 flipKey,包含 sessionId 和 gmtModified
39
+ const flipKey = data.map(i => i.sessionId + '-' + i.gmtModified).join(',');
40
+
41
+ const flatList = useMemo(() => {
42
+ const rules = sortRules.length > 0 ? sortRules : [{ label: '当天', dayPeriod: 1 }];
43
+ const sortedList = groupConversationsByTime(data, rules);
44
+ const hasOtherOnly = rules.every(
45
+ rule => !sortedList[rule.label] || sortedList[rule.label].length === 0
46
+ );
47
+ const arr: { type: 'group' | 'item'; label?: string; data?: ListItemType }[] = [];
48
+ rules.forEach(rule => {
49
+ if (sortedList[rule.label] && sortedList[rule.label].length > 0) {
50
+ arr.push({ type: 'group', label: rule.label });
51
+ sortedList[rule.label].forEach(i => arr.push({ type: 'item', data: i }));
52
+ }
53
+ });
54
+ if (sortedList.other.length > 0 && !hasOtherOnly) {
55
+ arr.push({ type: 'group', label: '其他' });
56
+ sortedList.other.forEach(i => arr.push({ type: 'item', data: i }));
57
+ }
58
+ if (hasOtherOnly && sortedList.other.length > 0) {
59
+ sortedList.other.forEach(i => arr.push({ type: 'item', data: i }));
60
+ }
61
+ return arr;
62
+ }, [data, sortRules, flipKey]);
63
+
64
+ // 代表当前扁平顺序与类型的签名,用于监测重排
65
+ const layoutKey = useMemo(() => {
66
+ return flatList
67
+ .map(i => (i.type === 'group' ? `g:${i.label}` : `i:${i.data!.sessionId}`))
68
+ .join('|');
69
+ }, [flatList]);
70
+
71
+ const ITEM_HEIGHT = 56;
72
+ const ITEM_GAP = 14;
73
+ const FOOTER_HEIGHT = 36;
74
+
75
+ const getItemSize = (index: number) => {
76
+ // 最后一项为 Footer
77
+ if (index === flatList.length) return FOOTER_HEIGHT;
78
+ return flatList[index].type === 'group' ? 32 : ITEM_HEIGHT + ITEM_GAP;
79
+ };
80
+
81
+ // 新增:List ref
82
+ const listRef = useRef<any>(null);
83
+ // 新增:当前激活会话在 flatList 的 index(仅依赖 activedItem 与数据映射)
84
+ const activeIndex = useMemo(() => {
85
+ return flatList.findIndex(item => item.type === 'item' && item.data?.sessionId === activedItem);
86
+ }, [flatList, activedItem]);
87
+ // 新增:flatList 里第一个会话项的 index
88
+ const firstItemIndex = useMemo(() => {
89
+ return flatList.findIndex(item => item.type === 'item');
90
+ }, [flatList]);
91
+ // 仅在激活项变化时,且激活项恰好是第一项时滚动到顶部;加载更多时不触发
92
+ const lastActivedRef = useRef<string | undefined>(undefined);
93
+ useEffect(() => {
94
+ const last = lastActivedRef.current;
95
+ if (activedItem !== last && activeIndex > -1 && activeIndex === firstItemIndex && listRef.current) {
96
+ listRef.current.scrollToItem(activeIndex, 'start');
97
+ }
98
+ lastActivedRef.current = activedItem;
99
+ }, [activedItem, activeIndex, firstItemIndex]);
100
+
101
+ // 轻量刷新缓存:仅在数据长度变化时刷新末尾,避免重置滚动位置
102
+ const prevCountRef = useRef<number>(0);
103
+ useEffect(() => {
104
+ if (listRef.current) {
105
+ const prev = prevCountRef.current;
106
+ const curr = flatList.length;
107
+ prevCountRef.current = curr;
108
+ if (curr !== prev) {
109
+ // 如果数据量变化很大(比如从少量恢复到大量,可能是搜索清空),强制重新计算所有尺寸
110
+ const changeRatio = prev > 0 ? Math.abs(curr - prev) / prev : 1;
111
+ const shouldForceReset = changeRatio > 0.5 || (prev < 10 && curr > 20); // 变化超过50%或从少量恢复到大量
112
+ listRef.current.resetAfterIndex(0, shouldForceReset);
113
+ }
114
+ }
115
+ }, [flatList.length]);
116
+
117
+ // 当分组/顺序发生变化时,重置尺寸缓存,避免位置叠加
118
+ useEffect(() => {
119
+ if (listRef.current) {
120
+ // 强制重新计算所有尺寸,避免重叠
121
+ listRef.current.resetAfterIndex(0, true);
122
+ }
123
+ }, [layoutKey]);
124
+
125
+ // hooks全部调用完后再判断是否为空
126
+ if (flatList.length === 0) {
127
+ return <div className="text-center text-zinc-400 py-8">暂无会话</div>;
128
+ }
129
+
130
+ const colors = styles?.colors || {};
131
+
132
+ return (
133
+ <Flipper flipKey={flipKey} spring={{ stiffness: 180, damping: 18 }}>
134
+ <List
135
+ ref={listRef}
136
+ height={height}
137
+ width={'100%'}
138
+
139
+ itemCount={flatList.length + 1}
140
+ itemSize={getItemSize}
141
+ itemKey={index => {
142
+ if (index === flatList.length) return 'footer';
143
+ const item = flatList[index];
144
+ return item.type === 'item' ? item.data!.sessionId : `group-${item.label}`;
145
+ }}
146
+ onItemsRendered={({ visibleStopIndex }) => {
147
+ // 接近底部自动加载
148
+ const threshold = 3;
149
+ if (
150
+ hasMore &&
151
+ !loadingMore &&
152
+ visibleStopIndex >= flatList.length - 1 - threshold &&
153
+ typeof eventsEmit === 'function'
154
+ ) {
155
+ eventsEmit('conversations:load_more');
156
+ }
157
+ }}
158
+ style={{ overflowX: 'hidden' }}
159
+ >
160
+ {({ index, style }) => {
161
+ // Footer 行
162
+ if (index === flatList.length) {
163
+ const colors = styles?.colors || {};
164
+ return (
165
+ <div
166
+ style={{
167
+ ...style,
168
+ height: FOOTER_HEIGHT,
169
+ lineHeight: `${FOOTER_HEIGHT}px`,
170
+ textAlign: 'center',
171
+ fontSize: '10px',
172
+ color: colors.textMuted || '#9ca3af',
173
+ background: colors.groupBg || 'white',
174
+ }}
175
+ >
176
+ {loadingMore ? '加载中...' : hasMore ? '' : '没有更多了'}
177
+ </div>
178
+ );
179
+ }
180
+ const item = flatList[index];
181
+ if (item.type === 'group') {
182
+ return (
183
+ <div
184
+ style={{ ...style, background: colors.groupBg || 'white', zIndex: 1 }}
185
+ className="pt-2 pb-1 px-[28px] py-[2px] text-xs text-gray-400"
186
+ >
187
+ {item.label}
188
+ </div>
189
+ );
190
+ }
191
+ return (
192
+ <Flipped key={item.data!.sessionId} flipId={item.data!.sessionId}>
193
+ <div style={style} className='px-[12px] py-[2px]'>
194
+ <GientechConversationBarItem
195
+ isActive={activedItem === item.data!.sessionId}
196
+ isDisabled={false}
197
+ isNew={item.data!.isNew}
198
+ data={item.data!}
199
+ eventsEmit={eventsEmit}
200
+ assistantList={assistantList}
201
+ styles={styles}
202
+ />
203
+ </div>
204
+ </Flipped>
205
+ );
206
+ }}
207
+ </List>
208
+ </Flipper>
209
+ );
210
+ }
@@ -0,0 +1,39 @@
1
+ export interface ListItemType {
2
+ label: string;
3
+ sessionId: string;
4
+ gmtModified: number;
5
+ [key: string]: any;
6
+ }
7
+ export interface SortRule {
8
+ label: string;
9
+ dayPeriod: number;
10
+ }
11
+
12
+ /**
13
+ * 按时间分组会话数据
14
+ * @param data 会话列表
15
+ * @param rules 分组规则
16
+ * @returns 分组后的对象
17
+ */
18
+ export function groupConversationsByTime(
19
+ data: ListItemType[],
20
+ rules: SortRule[] = [{ label: '当天', dayPeriod: 1 }]
21
+ ): Record<string, ListItemType[]> {
22
+ const now = new Date();
23
+ const sortedList: Record<string, ListItemType[]> = { other: [] };
24
+ data.forEach(item => {
25
+ const itemDate = new Date(item.gmtModified);
26
+ const daysDifference = Math.floor((+now - +itemDate) / (1000 * 60 * 60 * 24));
27
+ let found = false;
28
+ for (const rule of rules) {
29
+ if (daysDifference <= rule.dayPeriod) {
30
+ if (!sortedList[rule.label]) sortedList[rule.label] = [];
31
+ sortedList[rule.label].push(item);
32
+ found = true;
33
+ break;
34
+ }
35
+ }
36
+ if (!found) sortedList.other.push(item);
37
+ });
38
+ return sortedList;
39
+ }