@gientech/modual 1.3.3 → 1.3.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 (308) hide show
  1. package/README.md +129 -129
  2. package/{dist/assets → assets}/database.svg +11 -11
  3. package/{src/modules/database/assets → assets}/database_add.svg +53 -53
  4. package/{dist/assets → assets}/database_connect.svg +66 -66
  5. package/{dist/assets → assets}/database_upload.svg +29 -29
  6. package/{dist/assets → assets}/defaultWeLogo.svg +14 -14
  7. package/{dist/assets/index-mPgEc8KC.js → assets/index-CDNF071H.js} +38 -38
  8. package/{dist/assets/index-XvC_4jDB.js → assets/index-Ce4td48i.js} +20 -20
  9. package/{dist/assets → assets}/mysql.svg +14 -14
  10. package/chat.js +654 -0
  11. package/database.js +20 -0
  12. package/{dist/databaseId.js → databaseId.js} +1 -1
  13. package/{dist/databaseTable.js → databaseTable.js} +1 -1
  14. package/{dist/modelManage.js → modelManage.js} +1 -1
  15. package/package.json +39 -83
  16. package/{dist/sensitive.js → sensitive.js} +1 -1
  17. package/{dist/streamFilesReader.js → streamFilesReader.js} +10 -10
  18. package/{dist/worker → worker}/pdf.worker.min.js +21 -21
  19. package/.editorconfig +0 -38
  20. package/.prettierignore +0 -16
  21. package/.prettierrc +0 -17
  22. package/USAGE.md +0 -191
  23. package/bash.exe.stackdump +0 -40
  24. package/components.json +0 -21
  25. package/dist/README.md +0 -129
  26. package/dist/assets/database_add.svg +0 -53
  27. package/dist/chat.js +0 -654
  28. package/dist/database.js +0 -20
  29. package/dist/package.json +0 -56
  30. package/doc_assets/2.png +0 -0
  31. package/doc_assets/demo.md +0 -27
  32. package/doc_assets/demos/dist-app/assets/index.Dh-ZAS9Z.css +0 -2
  33. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js +0 -23699
  34. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js.map +0 -1
  35. package/doc_assets/demos/dist-app/index.html +0 -14
  36. package/doc_assets/demos/dist-app/vite.svg +0 -1
  37. package/doc_assets/images/1.png +0 -0
  38. package/doc_assets/images/3.png +0 -0
  39. package/doc_assets/images/component-screenshot.png +0 -1
  40. package/doc_assets/install.md +0 -5
  41. package/eslint.config.js +0 -92
  42. package/index.html +0 -13
  43. package/postcss.config.cjs +0 -19
  44. package/public/vite.svg +0 -1
  45. package/public/worker/pdf.worker.min.js +0 -22
  46. package/scripts/README.md +0 -133
  47. package/scripts/build-demo.js +0 -88
  48. package/scripts/demo-selector.js +0 -216
  49. package/scripts/dev-demo.js +0 -76
  50. package/scripts/preview-demo.js +0 -130
  51. package/scripts/run-demo.bat +0 -34
  52. package/src/assets/img/downArrow.png +0 -0
  53. package/src/assets/img/excel.png +0 -0
  54. package/src/assets/img/img.png +0 -0
  55. package/src/assets/img/pdf.png +0 -0
  56. package/src/assets/img/ppt.png +0 -0
  57. package/src/assets/img/txt.png +0 -0
  58. package/src/assets/img/word.png +0 -0
  59. package/src/assets/login/homeBg.png +0 -0
  60. package/src/assets/login/left.jpg +0 -0
  61. package/src/assets/login/logoImg.png +0 -0
  62. package/src/examples/LoginPage/index.tsx +0 -18
  63. package/src/examples/aaa/index.tsx +0 -3758
  64. package/src/examples/chat/components/DrawerGraphPreview.tsx +0 -78
  65. package/src/examples/chat/index.tsx +0 -190
  66. package/src/examples/gientechStreamFilesReader/index.tsx +0 -1016
  67. package/src/examples/ragDatabaseDataPage/index.tsx +0 -36
  68. package/src/examples/ragDatabaseIdPage/index.tsx +0 -44
  69. package/src/examples/ragDatabasePage/index.tsx +0 -36
  70. package/src/examples/ragModelManagePage/index.tsx +0 -37
  71. package/src/examples/ragSearchPage/index.tsx +0 -0
  72. package/src/examples/ragSensitiveWordsPage/index.tsx +0 -32
  73. package/src/examples/streamFiles/index.tsx +0 -384
  74. package/src/lib_enter.ts +0 -38
  75. package/src/main.tsx +0 -5
  76. package/src/main.tsx.backup +0 -5
  77. package/src/modules/chat/Conversations/Item.tsx +0 -167
  78. package/src/modules/chat/Conversations/List.tsx +0 -143
  79. package/src/modules/chat/Conversations/groupByTime.ts +0 -39
  80. package/src/modules/chat/Conversations/index.tsx +0 -212
  81. package/src/modules/chat/constants.tsx +0 -33
  82. package/src/modules/chat/data.txt +0 -82
  83. package/src/modules/chat/index.tsx +0 -1908
  84. package/src/modules/chat/types.ts +0 -17
  85. package/src/modules/database/CreateModal.tsx +0 -398
  86. package/src/modules/database/assets/Doris.png +0 -0
  87. package/src/modules/database/assets/PostgreSQL.png +0 -0
  88. package/src/modules/database/assets/SQLServer.png +0 -0
  89. package/src/modules/database/assets/database.svg +0 -11
  90. package/src/modules/database/assets/database_connect.svg +0 -66
  91. package/src/modules/database/assets/database_upload.svg +0 -29
  92. package/src/modules/database/assets/empty.png +0 -0
  93. package/src/modules/database/assets/mysql.svg +0 -14
  94. package/src/modules/database/index.tsx +0 -466
  95. package/src/modules/database/server.ts +0 -196
  96. package/src/modules/databaseId/CustomCom.tsx +0 -156
  97. package/src/modules/databaseId/EditConfig.tsx +0 -268
  98. package/src/modules/databaseId/UploadDrawer.tsx +0 -520
  99. package/src/modules/databaseId/assets/aiOptimize.svg +0 -10
  100. package/src/modules/databaseId/assets/empty.png +0 -0
  101. package/src/modules/databaseId/assets/template.svg +0 -6
  102. package/src/modules/databaseId/assets/upload.svg +0 -9
  103. package/src/modules/databaseId/assets/useTemp.svg +0 -6
  104. package/src/modules/databaseId/index.tsx +0 -734
  105. package/src/modules/databaseId/server.ts +0 -286
  106. package/src/modules/databaseId/style.css +0 -5
  107. package/src/modules/databaseTable/EditRowDrawer.tsx +0 -119
  108. package/src/modules/databaseTable/index.tsx +0 -357
  109. package/src/modules/databaseTable/server.ts +0 -180
  110. package/src/modules/headlessChat/constants.tsx +0 -32
  111. package/src/modules/headlessChat/index.tsx +0 -1065
  112. package/src/modules/headlessChat/types.ts +0 -23
  113. package/src/modules/login/components/Login/LoginBox/index.tsx +0 -102
  114. package/src/modules/login/components/Login/RegisterBox/index.tsx +0 -180
  115. package/src/modules/login/components/Login/index.tsx +0 -100
  116. package/src/modules/login/index.tsx +0 -106
  117. package/src/modules/login/style.css +0 -3
  118. package/src/modules/login/useServices.ts +0 -53
  119. package/src/modules/login/utils.ts +0 -42
  120. package/src/modules/modelManage/ConfigDrawer.tsx +0 -249
  121. package/src/modules/modelManage/assets/empty.png +0 -0
  122. package/src/modules/modelManage/const.ts +0 -50
  123. package/src/modules/modelManage/index.tsx +0 -439
  124. package/src/modules/modelManage/server.ts +0 -185
  125. package/src/modules/nodegraph/index.tsx +0 -1
  126. package/src/modules/search/assets/Icon-history.svg +0 -8
  127. package/src/modules/search/assets/answerAwartar.png +0 -0
  128. package/src/modules/search/assets/doc.png +0 -0
  129. package/src/modules/search/assets/genera.gif +0 -0
  130. package/src/modules/search/assets/icon-robot.svg +0 -9
  131. package/src/modules/search/assets/icon-search-bar.svg +0 -14
  132. package/src/modules/search/assets/icon-sub-title.svg +0 -3
  133. package/src/modules/search/assets/icon-title.svg +0 -9
  134. package/src/modules/search/assets/icon-zoomOut.svg +0 -9
  135. package/src/modules/search/assets/iconAi.svg +0 -9
  136. package/src/modules/search/assets/pdf.png +0 -0
  137. package/src/modules/search/assets/ppt.png +0 -0
  138. package/src/modules/search/assets/search.svg +0 -3
  139. package/src/modules/search/assets/selected.svg +0 -4
  140. package/src/modules/search/assets/txt.png +0 -0
  141. package/src/modules/search/assets/xls.png +0 -0
  142. package/src/modules/search/components/AssisSelect.tsx +0 -137
  143. package/src/modules/search/components/Editor/ChatViewEditor.tsx +0 -261
  144. package/src/modules/search/components/Editor/aichat.css +0 -1
  145. package/src/modules/search/components/Editor/constant.ts +0 -13
  146. package/src/modules/search/components/Editor/index.tsx +0 -113
  147. package/src/modules/search/components/Editor/plugins/autofomatRules.ts +0 -332
  148. package/src/modules/search/components/Editor/plugins/convertImgPlugins.tsx +0 -20
  149. package/src/modules/search/components/Editor/plugins/createIndexes.tsx +0 -38
  150. package/src/modules/search/components/Editor/plugins/displayer.ts +0 -298
  151. package/src/modules/search/components/Editor/plugins/imageClick.tsx +0 -32
  152. package/src/modules/search/components/Editor/plugins/myplugin.tsx +0 -98
  153. package/src/modules/search/components/Editor/ui/avatar.tsx +0 -19
  154. package/src/modules/search/components/Editor/ui/blockquote-element.tsx +0 -21
  155. package/src/modules/search/components/Editor/ui/button.tsx +0 -58
  156. package/src/modules/search/components/Editor/ui/calendar.tsx +0 -68
  157. package/src/modules/search/components/Editor/ui/caption.tsx +0 -46
  158. package/src/modules/search/components/Editor/ui/checkbox.tsx +0 -27
  159. package/src/modules/search/components/Editor/ui/code-block-combobox.tsx +0 -188
  160. package/src/modules/search/components/Editor/ui/code-block-element.css +0 -434
  161. package/src/modules/search/components/Editor/ui/code-block-element.tsx +0 -39
  162. package/src/modules/search/components/Editor/ui/code-leaf.tsx +0 -24
  163. package/src/modules/search/components/Editor/ui/code-line-element.tsx +0 -10
  164. package/src/modules/search/components/Editor/ui/code-syntax-leaf.tsx +0 -21
  165. package/src/modules/search/components/Editor/ui/column-element.tsx +0 -30
  166. package/src/modules/search/components/Editor/ui/column-group-element.tsx +0 -94
  167. package/src/modules/search/components/Editor/ui/command.tsx +0 -75
  168. package/src/modules/search/components/Editor/ui/comment-avatar.tsx +0 -22
  169. package/src/modules/search/components/Editor/ui/comment-create-form.tsx +0 -37
  170. package/src/modules/search/components/Editor/ui/comment-item.tsx +0 -74
  171. package/src/modules/search/components/Editor/ui/comment-leaf.tsx +0 -49
  172. package/src/modules/search/components/Editor/ui/comment-more-dropdown.tsx +0 -42
  173. package/src/modules/search/components/Editor/ui/comment-reply-items.tsx +0 -22
  174. package/src/modules/search/components/Editor/ui/comment-resolve-button.tsx +0 -32
  175. package/src/modules/search/components/Editor/ui/comment-value.tsx +0 -34
  176. package/src/modules/search/components/Editor/ui/comments-popover.tsx +0 -63
  177. package/src/modules/search/components/Editor/ui/date-element.tsx +0 -83
  178. package/src/modules/search/components/Editor/ui/dialog.tsx +0 -63
  179. package/src/modules/search/components/Editor/ui/draggable.tsx +0 -177
  180. package/src/modules/search/components/Editor/ui/dropdown-menu.tsx +0 -180
  181. package/src/modules/search/components/Editor/ui/emoji-input-element.tsx +0 -85
  182. package/src/modules/search/components/Editor/ui/excalidraw-element.tsx +0 -28
  183. package/src/modules/search/components/Editor/ui/fixed-toolbar-buttons.tsx +0 -76
  184. package/src/modules/search/components/Editor/ui/fixed-toolbar.tsx +0 -8
  185. package/src/modules/search/components/Editor/ui/floating-toolbar-buttons.tsx +0 -51
  186. package/src/modules/search/components/Editor/ui/floating-toolbar.tsx +0 -77
  187. package/src/modules/search/components/Editor/ui/heading-element.tsx +0 -48
  188. package/src/modules/search/components/Editor/ui/highlight-leaf.tsx +0 -17
  189. package/src/modules/search/components/Editor/ui/hr-element.tsx +0 -30
  190. package/src/modules/search/components/Editor/ui/icons.tsx +0 -267
  191. package/src/modules/search/components/Editor/ui/image-element.tsx +0 -74
  192. package/src/modules/search/components/Editor/ui/inline-combobox.tsx +0 -368
  193. package/src/modules/search/components/Editor/ui/input.tsx +0 -25
  194. package/src/modules/search/components/Editor/ui/insert-dropdown-menu.tsx +0 -218
  195. package/src/modules/search/components/Editor/ui/kbd-leaf.tsx +0 -20
  196. package/src/modules/search/components/Editor/ui/link-element.tsx +0 -29
  197. package/src/modules/search/components/Editor/ui/link-floating-toolbar.tsx +0 -161
  198. package/src/modules/search/components/Editor/ui/list-element.tsx +0 -30
  199. package/src/modules/search/components/Editor/ui/mark-toolbar-button.tsx +0 -24
  200. package/src/modules/search/components/Editor/ui/media-embed-element.tsx +0 -133
  201. package/src/modules/search/components/Editor/ui/media-popover.tsx +0 -97
  202. package/src/modules/search/components/Editor/ui/mention-element.tsx +0 -43
  203. package/src/modules/search/components/Editor/ui/mention-input-element.tsx +0 -141
  204. package/src/modules/search/components/Editor/ui/mode-dropdown-menu.tsx +0 -93
  205. package/src/modules/search/components/Editor/ui/more-dropdown-menu.tsx +0 -67
  206. package/src/modules/search/components/Editor/ui/paragraph-element.tsx +0 -4
  207. package/src/modules/search/components/Editor/ui/placeholder.tsx +0 -52
  208. package/src/modules/search/components/Editor/ui/popover.tsx +0 -32
  209. package/src/modules/search/components/Editor/ui/resizable.tsx +0 -66
  210. package/src/modules/search/components/Editor/ui/separator.tsx +0 -25
  211. package/src/modules/search/components/Editor/ui/style.less +0 -12
  212. package/src/modules/search/components/Editor/ui/table-cell-element.tsx +0 -143
  213. package/src/modules/search/components/Editor/ui/table-element.tsx +0 -243
  214. package/src/modules/search/components/Editor/ui/table-row-element.tsx +0 -22
  215. package/src/modules/search/components/Editor/ui/tableValue.tsx +0 -135
  216. package/src/modules/search/components/Editor/ui/todo-list-element.tsx +0 -43
  217. package/src/modules/search/components/Editor/ui/toggle-element.tsx +0 -31
  218. package/src/modules/search/components/Editor/ui/toolbar.tsx +0 -157
  219. package/src/modules/search/components/Editor/ui/tooltip.tsx +0 -65
  220. package/src/modules/search/components/Editor/ui/turn-into-dropdown-menu.tsx +0 -160
  221. package/src/modules/search/components/Editor/ui/with-draggables.tsx +0 -175
  222. package/src/modules/search/components/FileList.tsx +0 -287
  223. package/src/modules/search/components/ImageGroupView/index.tsx +0 -85
  224. package/src/modules/search/components/ResultContent.tsx +0 -232
  225. package/src/modules/search/components/SearchInput.tsx +0 -232
  226. package/src/modules/search/components/SearchLanding.tsx +0 -74
  227. package/src/modules/search/components/SearchView.tsx +0 -563
  228. package/src/modules/search/components/SimpleEditor.tsx +0 -158
  229. package/src/modules/search/components/SimpleFileList.tsx +0 -215
  230. package/src/modules/search/index.tsx +0 -10
  231. package/src/modules/search/reademe.md +0 -1
  232. package/src/modules/search/servers/apis.tsx +0 -19
  233. package/src/modules/search/servers/index.ts +0 -184
  234. package/src/modules/search/style.less +0 -503
  235. package/src/modules/search/type.ts +0 -22
  236. package/src/modules/search/utils.ts +0 -34
  237. package/src/modules/sensitive/index.tsx +0 -313
  238. package/src/modules/sensitive/server.ts +0 -122
  239. package/src/modules/streamFilesReader/GientechStreamReader.tsx +0 -1555
  240. package/src/modules/streamFilesReader/components/Header/Toolbar.tsx +0 -0
  241. package/src/modules/streamFilesReader/components/Header/index.tsx +0 -297
  242. package/src/modules/streamFilesReader/index.tsx +0 -3
  243. package/src/style.css +0 -6
  244. package/src/type.d.ts +0 -0
  245. package/src/utils/commonFn.tsx +0 -111
  246. package/src/utils/gientechCommon/components/AppError.tsx +0 -32
  247. package/src/utils/gientechCommon/components/AppLoading.tsx +0 -75
  248. package/src/utils/gientechCommon/components/DeleteModal.tsx +0 -75
  249. package/src/utils/gientechCommon/components/DisplayError.tsx +0 -33
  250. package/src/utils/gientechCommon/components/DisplayLoading.tsx +0 -38
  251. package/src/utils/gientechCommon/components/FeedBackModal.tsx +0 -310
  252. package/src/utils/gientechCommon/components/FileCardCommon.tsx +0 -82
  253. package/src/utils/gientechCommon/components/FileManager/index.tsx +0 -390
  254. package/src/utils/gientechCommon/components/FileManager/style.css +0 -5
  255. package/src/utils/gientechCommon/components/Messages/GientechNewChatWelcome.tsx +0 -296
  256. package/src/utils/gientechCommon/components/Messages/ReferenceCard.tsx +0 -339
  257. package/src/utils/gientechCommon/components/Messages/RetriveItem.tsx +0 -245
  258. package/src/utils/gientechCommon/components/Messages/WebRetriveItem.tsx +0 -209
  259. package/src/utils/gientechCommon/components/Messages/defaultBot.png +0 -0
  260. package/src/utils/gientechCommon/components/Messages/defaultStyleSet.tsx +0 -148
  261. package/src/utils/gientechCommon/components/Messages/defaultWeLogo.svg +0 -14
  262. package/src/utils/gientechCommon/components/RenameModal.tsx +0 -86
  263. package/src/utils/gientechCommon/components/style.less +0 -11
  264. package/src/utils/gientechCommon/configs/commonConfig.ts +0 -2
  265. package/src/utils/gientechCommon/configs/senderConfig.ts +0 -0
  266. package/src/utils/gientechCommon/configs/stylesConfig.ts +0 -142
  267. package/src/utils/gientechCommon/hooks/AichatUseController.tsx +0 -345
  268. package/src/utils/gientechCommon/slate/converters/deserializers.ts +0 -763
  269. package/src/utils/gientechCommon/slate/converters/mockData.ts +0 -232
  270. package/src/utils/gientechCommon/slate/converters/slateConverters.ts +0 -258
  271. package/src/utils/gientechCommon/slate/richElements/index.tsx +0 -499
  272. package/src/utils/gientechCommon/utils/request.ts +0 -37
  273. package/src/utils/gientechCommon/utils/serverFn.ts +0 -172
  274. package/src/utils/index.tsx +0 -126
  275. package/src/utils/testconfigs/demologin/index.tsx +0 -32
  276. package/src/utils/testconfigs/index.ts +0 -53
  277. package/src/vite-env.d.ts +0 -11
  278. package/stats.html +0 -4949
  279. package/tailwind.config.js +0 -170
  280. package/tsconfig.app.json +0 -30
  281. package/tsconfig.app.tsbuildinfo +0 -11
  282. package/tsconfig.json +0 -13
  283. package/tsconfig.node.json +0 -22
  284. package/tsconfig.node.tsbuildinfo +0 -1
  285. package/vite.config.ts +0 -177
  286. package/workflows/release.yml +0 -60
  287. /package/{dist/assets → assets}/Doris.png +0 -0
  288. /package/{dist/assets → assets}/PostgreSQL.png +0 -0
  289. /package/{dist/assets → assets}/SQLServer.png +0 -0
  290. /package/{dist/assets → assets}/_commonjsHelpers-gnU0ypJ3.js +0 -0
  291. /package/{dist/assets → assets}/circle-alert-g2Y6zAjt.js +0 -0
  292. /package/{dist/assets → assets}/empty.png +0 -0
  293. /package/{dist/assets → assets}/index-CEK88UzR.js +0 -0
  294. /package/{dist/assets → assets}/index-CpW6Dhpp.js +0 -0
  295. /package/{dist/assets → assets}/plus-omCUN0e3.js +0 -0
  296. /package/{dist/assets → assets}/style.css +0 -0
  297. /package/{dist/assets → assets}/style2.css +0 -0
  298. /package/{dist/assets → assets}/style3.css +0 -0
  299. /package/{dist/assets → assets}/styled-components.browser.esm-DPkS13KC.js +0 -0
  300. /package/{dist/assets → assets}/x-vPcWt3fC.js +0 -0
  301. /package/{dist/chat.d.ts → chat.d.ts} +0 -0
  302. /package/{dist/database.d.ts → database.d.ts} +0 -0
  303. /package/{dist/databaseId.d.ts → databaseId.d.ts} +0 -0
  304. /package/{dist/databaseTable.d.ts → databaseTable.d.ts} +0 -0
  305. /package/{dist/modelManage.d.ts → modelManage.d.ts} +0 -0
  306. /package/{dist/sensitive.d.ts → sensitive.d.ts} +0 -0
  307. /package/{dist/streamFilesReader.d.ts → streamFilesReader.d.ts} +0 -0
  308. /package/{dist/vite.svg → vite.svg} +0 -0
@@ -1,763 +0,0 @@
1
- import { marked } from 'marked';
2
- import type {
3
- CustomElement,
4
- CustomText,
5
- ParagraphElement,
6
- HeadingOneElement,
7
- HeadingTwoElement,
8
- ListElement,
9
- ListItemElement,
10
- BaseElement,
11
- CodeBlockElement,
12
- HeadingThreeElement,
13
- BlockQuoteElement,
14
- TableElement,
15
- TableRowElement,
16
- TableCellElement,
17
- } from './slateConverters';
18
-
19
- // 新增think类型
20
- export interface ThinkElement extends BaseElement {
21
- type: 'think';
22
- }
23
-
24
- function ensureChildren(elements: CustomElement[]): CustomElement[] {
25
- return elements.map(el => {
26
- if (!el.children || el.children.length === 0) {
27
- return { ...el, children: [{ text: '' }] };
28
- }
29
- return {
30
- ...el,
31
- children: el.children.map(child => {
32
- if (typeof child === 'object' && 'type' in child) {
33
- return ensureChildren([child as CustomElement])[0];
34
- }
35
- return child;
36
- }),
37
- };
38
- });
39
- }
40
- function getContentAfterThinkTag(text: string) {
41
- if (text.indexOf('<think>') > -1) {
42
- if (text.indexOf('</think>') > -1) {
43
- const closedThinkRegex = /<think>([\s\S]*?)<\/think>([\s\S]*)/s;
44
- const match = text.match(closedThinkRegex);
45
- if (match) {
46
- return {
47
- thinkContent: match[1],
48
- content: match[2],
49
- finish: true,
50
- };
51
- } else {
52
- return {
53
- thinkContent: '',
54
- content: text,
55
- finish: true,
56
- };
57
- }
58
- } else {
59
- const closedThinkRegex2 = /<think>(.*?)(?=<|\s*$)/s;
60
- const match2 = text.match(closedThinkRegex2);
61
- return { thinkContent: match2?.[1] || '', content: '' };
62
- }
63
- } else {
64
- return {
65
- thinkContent: '',
66
- content: text,
67
- };
68
- }
69
- }
70
- export function deserializeMarkdown(markdown: string, respTime?: number): CustomElement[] {
71
- // 先全局处理 retrive-tag
72
- markdown = markdown.replace(
73
- /\[retrive-tag([^\]]*)\]\[([\s\S]*?)\]\[\/retrive-tag\]/g,
74
- (match, attrs, inner) => `<retrive-tag${attrs ? ' ' + attrs.trim() : ''}>${inner}</retrive-tag>`
75
- );
76
-
77
- // 1. 用正则分割出 <think>...</think> 和普通 markdown 块
78
- // const blocks: { type: 'think' | 'markdown', content: string }[] = [];
79
- // let lastIndex = 0;
80
- // const thinkRegex = /<think>([\s\S]*?)<\/think>/g;
81
- // let match;
82
- // while ((match = thinkRegex.exec(markdown)) !== null) {
83
- // if (match.index > lastIndex) {
84
- // blocks.push({ type: 'markdown', content: markdown.slice(lastIndex, match.index) });
85
- // }
86
- // blocks.push({ type: 'think', content: match[1] });
87
- // lastIndex = thinkRegex.lastIndex;
88
- // }
89
- // if (lastIndex < markdown.length) {
90
- // blocks.push({ type: 'markdown', content: markdown.slice(lastIndex) });
91
- // }
92
- const blocks: { type: 'think' | 'markdown'; content: string; respTime?: number }[] = [];
93
- const { thinkContent, content, finish } = getContentAfterThinkTag(markdown || '');
94
-
95
- blocks.push({ type: 'think', content: thinkContent, respTime });
96
- blocks.push({ type: 'markdown', content });
97
- // 2. 分别处理每个块
98
- let results: CustomElement[] = [];
99
- let thinkId = 0;
100
- // 新增:收集retrive-tag id顺序
101
- const retriveTagOrder: string[] = [];
102
- const retriveTagSet = new Set<string>();
103
- // 包装原有的递归,收集id
104
- function collectRetriveTagIds(nodes: any[]) {
105
- for (const node of nodes) {
106
- if (node && typeof node === 'object') {
107
- if (Array.isArray(node)) {
108
- collectRetriveTagIds(node);
109
- } else {
110
- if (node.retrive && node.id && !retriveTagSet.has(node.id)) {
111
- retriveTagOrder.push(node.id);
112
- retriveTagSet.add(node.id);
113
- }
114
- if (node.children) collectRetriveTagIds(node.children);
115
- }
116
- }
117
- }
118
- }
119
- for (const block of blocks) {
120
- if (block.type === 'think') {
121
- // think 块分行,遇到 retrive-tag 用 DOM 解析
122
- const lines = block.content
123
- .split(/\n+/)
124
- .map(line => line.trim())
125
- .filter(Boolean);
126
- const children = lines.flatMap(line => {
127
- if (/<retrive-tag/i.test(line)) {
128
- const div = document.createElement('div');
129
- div.innerHTML = line;
130
- return deserializeHtmlNode(div, respTime);
131
- } else {
132
- // 保证类型一致,包装为 ParagraphElement
133
- return [{ type: 'paragraph', children: [{ text: line }] } as ParagraphElement];
134
- }
135
- });
136
- // console.log('think AST:', {
137
- // type: 'think',
138
- // children,
139
- // });
140
- results.push({
141
- type: 'think',
142
- id: `think-${thinkId++}`,
143
- thinkContent,
144
- finish,
145
- children,
146
- } as any);
147
- } else {
148
- // 其它 markdown 块用 marked 解析
149
- marked.setOptions({ gfm: true, breaks: true, pedantic: false });
150
- let html = marked(block.content);
151
- if (typeof html !== 'string') {
152
- html = '';
153
- }
154
- const div = document.createElement('div');
155
- div.innerHTML = html;
156
- const part = deserializeHtmlNode(div, respTime);
157
- if (part && part.length > 0) {
158
- results = results.concat(part);
159
- }
160
- }
161
- }
162
- // 收集所有retrive-tag id顺序
163
- collectRetriveTagIds(results);
164
- // 生成编号映射
165
- const retriveTagIndexMap: Record<string, number> = {};
166
- retriveTagOrder.forEach((id, idx) => {
167
- retriveTagIndexMap[id] = idx + 1;
168
- });
169
- // 新增:递归给每个retrive-tag节点赋值indexId
170
- function assignRetriveTagIndexId(nodes: any[]) {
171
- for (const node of nodes) {
172
- if (node && typeof node === 'object') {
173
- if (Array.isArray(node)) {
174
- assignRetriveTagIndexId(node);
175
- } else {
176
- if (node.retrive && node.id && retriveTagIndexMap[node.id]) {
177
- node.indexId = retriveTagIndexMap[node.id];
178
- }
179
- if (node.children) assignRetriveTagIndexId(node.children);
180
- }
181
- }
182
- }
183
- }
184
- assignRetriveTagIndexId(results);
185
- // 挂载到AST根节点
186
- (results as any)._retriveTagIndexMap = retriveTagIndexMap;
187
- // 保证返回值始终为非空数组,且所有节点children非空
188
- if (!results || results.length === 0) {
189
- return [{ type: 'paragraph', children: [{ text: '' }] } as ParagraphElement];
190
- }
191
- //console.log('deserializeMarkdown 返回 AST:', results);
192
- return ensureChildren(results);
193
- }
194
-
195
- function deserializeHtmlNode(node: Node, respTime?: number): CustomElement[] {
196
- const elements: CustomElement[] = [];
197
-
198
- const deNodes = (elements: CustomElement[], nodeList: NodeListOf<ChildNode>) => {
199
- nodeList.forEach((child: any) => {
200
- if (child.nodeType === Node.ELEMENT_NODE) {
201
- const el = child as HTMLElement;
202
- let result;
203
- switch (el.tagName && el.tagName.toLowerCase()) {
204
- case 'p': {
205
- // 如果 <p> 只包含一个 <think>,则直接提升为 think 节点
206
- const onlyChild = el.childNodes.length === 1 ? el.childNodes[0] : null;
207
- if (
208
- onlyChild &&
209
- onlyChild.nodeType === Node.ELEMENT_NODE &&
210
- (onlyChild as HTMLElement).tagName.toLowerCase() === 'think'
211
- ) {
212
- // 直接递归 think,不包 paragraph
213
- result = deserializeChildren(el)[0];
214
- } else {
215
- result = {
216
- type: 'paragraph',
217
- children: deserializeChildren(el),
218
- } as ParagraphElement;
219
- }
220
- break;
221
- }
222
- case 'h1':
223
- result = {
224
- type: 'heading-one',
225
- children: deserializeChildren(el),
226
- } as HeadingOneElement;
227
- break;
228
- case 'h2':
229
- result = {
230
- type: 'heading-two',
231
- children: deserializeChildren(el),
232
- } as HeadingTwoElement;
233
- break;
234
- case 'h3':
235
- result = {
236
- type: 'heading-three',
237
- children: deserializeChildren(el),
238
- } as HeadingThreeElement;
239
- break;
240
- case 'ul':
241
- case 'ol': {
242
- // 递归 deNodes,让 li 的 case 统一处理
243
- let listChildren: CustomElement[] = [];
244
- deNodes(listChildren, el.childNodes);
245
- result = {
246
- type: el.tagName.toLowerCase() === 'ul' ? 'bulleted-list' : 'numbered-list',
247
- children: listChildren,
248
- } as ListElement;
249
- break;
250
- }
251
- case 'li':
252
- case 'LI': {
253
- // 判断 li 里是否有 block 元素
254
- const hasBlock = Array.from(el.childNodes).some(child => {
255
- if (child.nodeType !== Node.ELEMENT_NODE) return false;
256
- const tag = (child as HTMLElement).tagName?.toUpperCase?.();
257
- return tag === 'UL' || tag === 'OL' || tag === 'P';
258
- });
259
- let children: (CustomText | CustomElement)[];
260
- if (hasBlock) {
261
- // 直接递归所有子节点
262
- children = el.childNodes
263
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
264
- : [];
265
- } else {
266
- // 包一层 paragraph
267
- children = [
268
- {
269
- type: 'paragraph',
270
- children: (el.childNodes
271
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
272
- : [{ text: '' }]) as (CustomText | CustomElement)[],
273
- },
274
- ];
275
- }
276
- result = {
277
- type: 'list-item',
278
- children: children as (CustomText | CustomElement)[],
279
- };
280
- break;
281
- }
282
- case 'pre': {
283
- const codeEl = el.querySelector('code');
284
- if (codeEl) {
285
- result = {
286
- type: 'code-block',
287
- children: [{ text: codeEl.textContent || '' }],
288
- } as any;
289
- } else {
290
- result = {
291
- type: 'code-block',
292
- children: [{ text: el.textContent || '' }],
293
- } as any;
294
- }
295
- break;
296
- }
297
- case 'code': {
298
- if (!el.closest('pre')) {
299
- result = {
300
- type: 'paragraph',
301
- children: [{ text: el.textContent || '', code: true }],
302
- } as ParagraphElement;
303
- }
304
- break;
305
- }
306
- case 'blockquote':
307
- result = {
308
- type: 'block-quote',
309
- children: deserializeChildren(el),
310
- } as BlockQuoteElement;
311
- break;
312
- case 'table':
313
- result = deserializeTable(el);
314
- break;
315
- case 'think':
316
- // 这里不再递归,直接跳过,由上层处理
317
- return;
318
- case 'retrive-tag': {
319
- const id = el.getAttribute('id') || undefined;
320
- const text = el.textContent || '';
321
- result = [{ text, retrive: true, id }];
322
- break;
323
- }
324
- case 'span':
325
- case 'div': {
326
- // flatten 所有子节点
327
- let result: (CustomText | BaseElement)[] = [];
328
- for (const child of Array.from(el.childNodes)) {
329
- result = result.concat(processNode(child, {}));
330
- }
331
- return result;
332
- }
333
- default:
334
- result = {
335
- type: 'paragraph',
336
- children: deserializeChildren(el),
337
- } as ParagraphElement;
338
- break;
339
- }
340
- if (Array.isArray(result)) {
341
- result.forEach(item => {
342
- if ('text' in item && !('type' in item)) {
343
- if (elements.length === 0) {
344
- elements.push({ type: 'paragraph', children: [item] } as ParagraphElement);
345
- } else {
346
- const last = elements[elements.length - 1];
347
- if (Array.isArray(last.children)) {
348
- last.children.push(item);
349
- }
350
- }
351
- } else {
352
- elements.push(item);
353
- }
354
- });
355
- } else if (result) {
356
- elements.push(result);
357
- }
358
- } else if (child.nodeType === Node.TEXT_NODE && child.textContent?.trim()) {
359
- elements.push({
360
- type: 'paragraph',
361
- children: [{ text: child.textContent }],
362
- } as ParagraphElement);
363
- }
364
- });
365
- return elements;
366
- };
367
- deNodes(elements, node.childNodes);
368
- // console.log('elements:', elements)
369
- return elements;
370
- }
371
-
372
- // 将 processNode 提升到 deserializeChildren 外部作用域
373
- function processNode(node: Node, styles: Partial<CustomText> = {}): (CustomText | CustomElement)[] {
374
- if (node.nodeType === Node.TEXT_NODE) {
375
- const text = node.textContent?.trim();
376
- if (text) {
377
- if (styles.code) {
378
- // 如果是行内代码,解析其中的 Markdown 样式
379
- return parseInlineCodeMarkdown(text);
380
- } else {
381
- return [{ text, ...styles }];
382
- }
383
- }
384
- return [];
385
- }
386
-
387
- if (node.nodeType === Node.ELEMENT_NODE) {
388
- const el = node as HTMLElement;
389
- const currentStyles = { ...styles };
390
-
391
- const tag = el.tagName?.toUpperCase?.() || '';
392
-
393
- if (tag === 'UL' || tag === 'OL') {
394
- return [
395
- {
396
- type: tag === 'UL' ? 'bulleted-list' : 'numbered-list',
397
- children: (el.childNodes
398
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
399
- : []) as (CustomText | CustomElement)[],
400
- },
401
- ];
402
- }
403
- if (tag === 'LI') {
404
- // 判断 li 里是否有 block 元素
405
- const hasBlock = Array.from(el.childNodes).some(child => {
406
- if (child.nodeType !== Node.ELEMENT_NODE) return false;
407
- const tag = (child as HTMLElement).tagName?.toUpperCase?.();
408
- return tag === 'UL' || tag === 'OL' || tag === 'P';
409
- });
410
- let children: (CustomText | CustomElement)[];
411
- if (hasBlock) {
412
- // 直接递归所有子节点
413
- children = el.childNodes
414
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
415
- : [];
416
- } else {
417
- // 包一层 paragraph
418
- children = [
419
- {
420
- type: 'paragraph',
421
- children: (el.childNodes
422
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
423
- : [{ text: '' }]) as (CustomText | CustomElement)[],
424
- },
425
- ];
426
- }
427
- return [
428
- {
429
- type: 'list-item',
430
- children: children as (CustomText | CustomElement)[],
431
- },
432
- ];
433
- }
434
- if (tag === 'TABLE') {
435
- return [
436
- {
437
- type: 'table',
438
- children: (el.childNodes
439
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
440
- : []) as (CustomText | CustomElement)[],
441
- },
442
- ];
443
- }
444
- if (tag === 'THEAD' || tag === 'TBODY') {
445
- return (
446
- el.childNodes ? Array.from(el.childNodes).flatMap(child => processNode(child, {})) : []
447
- ) as (CustomText | CustomElement)[];
448
- }
449
- if (tag === 'TR') {
450
- return [
451
- {
452
- type: 'table-row',
453
- children: (el.childNodes
454
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
455
- : []) as (CustomText | CustomElement)[],
456
- },
457
- ];
458
- }
459
- if (tag === 'TD') {
460
- return [
461
- {
462
- type: 'table-cell',
463
- children: (el.childNodes
464
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
465
- : [{ text: '' }]) as (CustomText | CustomElement)[],
466
- },
467
- ];
468
- }
469
- if (tag === 'TH') {
470
- return [
471
- {
472
- type: 'table-cell',
473
- header: true,
474
- children: (el.childNodes
475
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
476
- : [{ text: '' }]) as (CustomText | CustomElement)[],
477
- },
478
- ];
479
- }
480
- if (tag === 'THINK') {
481
- return [
482
- {
483
- type: 'think',
484
- children: (el.childNodes
485
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
486
- : []) as (CustomText | CustomElement)[],
487
- } as any,
488
- ];
489
- }
490
- if (tag === 'RETRIVE-TAG') {
491
- // 收集所有 attribute
492
- const attrs: Record<string, any> = {};
493
- for (const attr of Array.from(el.attributes)) {
494
- // 兼容 image_urls 自动转数组
495
- if (attr.name === 'image_urls') {
496
- attrs.imageUrls = attr.value ? attr.value.split(';').map((s: string) => s.trim()).filter(Boolean) : [];
497
- attrs.image_urls = attr.value; // 保留原始
498
- } else {
499
- attrs[attr.name] = attr.value;
500
- }
501
- }
502
- const children = el.childNodes
503
- ? Array.from(el.childNodes).flatMap(child => {
504
- const nodes = processNode(child, {});
505
- return nodes.map(n =>
506
- typeof n === 'object' && 'text' in n ? { ...n, retrive: true, ...attrs } : n
507
- );
508
- })
509
- : [{ text: '', retrive: true, ...attrs }];
510
- return children as (CustomText | CustomElement)[];
511
- }
512
- // 兜底:未知标签递归其所有子节点
513
- if (el.childNodes && el.childNodes.length > 0) {
514
- return Array.from(el.childNodes).flatMap(child => processNode(child, {})) as (
515
- | CustomText
516
- | CustomElement
517
- )[];
518
- }
519
-
520
- switch (tag) {
521
- case 'EM':
522
- case 'I':
523
- currentStyles.italic = true;
524
- break;
525
- case 'STRONG':
526
- case 'B':
527
- currentStyles.bold = true;
528
- break;
529
- case 'CODE':
530
- if (!el.closest('pre')) {
531
- currentStyles.code = true;
532
- }
533
- break;
534
- case 'DEL':
535
- case 'S':
536
- currentStyles.strikethrough = true;
537
- break;
538
- case 'U':
539
- currentStyles.underline = true;
540
- break;
541
- case 'A':
542
- currentStyles.link = el.getAttribute('href') || undefined;
543
- break;
544
- case 'SPAN':
545
- case 'DIV': {
546
- // flatten 所有子节点
547
- let result: (CustomText | CustomElement)[] = [];
548
- for (const child of Array.from(el.childNodes)) {
549
- result = result.concat(processNode(child, {}));
550
- }
551
- return result;
552
- }
553
- default:
554
- break;
555
- }
556
- }
557
- return [];
558
- }
559
-
560
- // 解析行内代码中的 Markdown 样式
561
- function parseInlineCodeMarkdown(text: string): CustomText[] {
562
- const result: CustomText[] = [];
563
- let currentText = '';
564
- let isBold = false;
565
- let isItalic = false;
566
- let i = 0;
567
-
568
- while (i < text.length) {
569
- if (text.startsWith('**', i)) {
570
- // 处理加粗
571
- if (currentText) {
572
- result.push({
573
- text: currentText,
574
- code: true,
575
- bold: isBold,
576
- italic: isItalic,
577
- });
578
- currentText = '';
579
- }
580
- isBold = !isBold;
581
- i += 2;
582
- } else if (text.startsWith('*', i)) {
583
- // 处理斜体
584
- if (currentText) {
585
- result.push({
586
- text: currentText,
587
- code: true,
588
- bold: isBold,
589
- italic: isItalic,
590
- });
591
- currentText = '';
592
- }
593
- isItalic = !isItalic;
594
- i += 1;
595
- } else {
596
- currentText += text[i];
597
- i += 1;
598
- }
599
- }
600
-
601
- if (currentText) {
602
- result.push({
603
- text: currentText,
604
- code: true,
605
- bold: isBold,
606
- italic: isItalic,
607
- });
608
- }
609
-
610
- return result;
611
- }
612
-
613
- // 保持 processNode 和 deserializeChildren 的实现
614
- function deserializeChildren(node: Node): (CustomText | BaseElement)[] {
615
- const texts: (CustomText | BaseElement)[] = [];
616
-
617
- for (const child of Array.from(node.childNodes)) {
618
- texts.push(...processNode(child));
619
- }
620
-
621
- return texts;
622
- }
623
-
624
- function deserializeTable(tableEl: HTMLElement): TableElement {
625
- const rows: TableRowElement[] = [];
626
-
627
- // 处理表头
628
- const thead = tableEl.querySelector('thead');
629
- const tbody = tableEl.querySelector('tbody');
630
-
631
- // 如果没有 thead 和 tbody,说明是简单表格,需要自动添加结构
632
- if (!thead && !tbody) {
633
- const allRows = Array.from(tableEl.querySelectorAll('tr'));
634
- if (allRows.length > 0) {
635
- // 第一行作为表头
636
- rows.push({
637
- type: 'table-row',
638
- children: Array.from(allRows[0].children).map(
639
- cell =>
640
- ({
641
- type: 'table-cell',
642
- header: true,
643
- children: deserializeChildren(cell),
644
- }) as TableCellElement
645
- ),
646
- } as TableRowElement);
647
-
648
- // 剩余行作为表格主体
649
- allRows.slice(1).forEach(tr => {
650
- rows.push({
651
- type: 'table-row',
652
- children: Array.from(tr.children).map(
653
- cell =>
654
- ({
655
- type: 'table-cell',
656
- header: false,
657
- children: deserializeChildren(cell),
658
- }) as TableCellElement
659
- ),
660
- } as TableRowElement);
661
- });
662
- }
663
- } else {
664
- // 处理表头
665
- if (thead) {
666
- const headerRow = thead.querySelector('tr');
667
- if (headerRow) {
668
- rows.push({
669
- type: 'table-row',
670
- children: Array.from(headerRow.querySelectorAll('th')).map(
671
- cell =>
672
- ({
673
- type: 'table-cell',
674
- header: true,
675
- children: deserializeChildren(cell),
676
- }) as TableCellElement
677
- ),
678
- } as TableRowElement);
679
- }
680
- }
681
-
682
- // 处理表格主体
683
- if (tbody) {
684
- Array.from(tbody.querySelectorAll('tr')).forEach(tr => {
685
- rows.push({
686
- type: 'table-row',
687
- children: Array.from(tr.querySelectorAll('td')).map(
688
- cell =>
689
- ({
690
- type: 'table-cell',
691
- header: false,
692
- children: deserializeChildren(cell),
693
- }) as TableCellElement
694
- ),
695
- } as TableRowElement);
696
- });
697
- }
698
- }
699
-
700
- return {
701
- type: 'table',
702
- children: rows,
703
- } as TableElement;
704
- }
705
-
706
- function mergeHeadingAndList(html: string): string {
707
- const div = document.createElement('div');
708
- div.innerHTML = html;
709
- let nodes = Array.from(div.childNodes);
710
- let i = 0;
711
- while (i < nodes.length - 1) {
712
- const cur = nodes[i];
713
- const next = nodes[i + 1];
714
- // 支持 h2/h3/h4 + ul/ol/p/blockquote/pre
715
- if (
716
- cur.nodeType === 1 &&
717
- ['H2', 'H3', 'H4'].includes((cur as HTMLElement).tagName) &&
718
- next.nodeType === 1 &&
719
- ['UL', 'OL', 'P', 'BLOCKQUOTE', 'PRE'].includes((next as HTMLElement).tagName)
720
- ) {
721
- // 创建 li
722
- const li = document.createElement('li');
723
- li.appendChild(cur.cloneNode(true));
724
- li.appendChild(next.cloneNode(true));
725
- // 检查后续是否还有连续的 ul/ol/p/blockquote/pre
726
- let j = i + 2;
727
- while (
728
- j < nodes.length &&
729
- nodes[j].nodeType === 1 &&
730
- ['UL', 'OL', 'P', 'BLOCKQUOTE', 'PRE'].includes((nodes[j] as HTMLElement).tagName)
731
- ) {
732
- li.appendChild(nodes[j].cloneNode(true));
733
- j++;
734
- }
735
- // 查找前面的 ol,没有就新建
736
- let ol = null;
737
- for (let k = i - 1; k >= 0; k--) {
738
- if (nodes[k].nodeType === 1 && (nodes[k] as HTMLElement).tagName === 'OL') {
739
- ol = nodes[k];
740
- break;
741
- }
742
- }
743
- if (!ol) {
744
- ol = document.createElement('ol');
745
- div.insertBefore(ol, cur);
746
- nodes = Array.from(div.childNodes);
747
- i = nodes.indexOf(ol);
748
- }
749
- ol.appendChild(li);
750
- // 移除原 h2/h3/h4 和后续所有连续的 ul/ol/p/blockquote/pre
751
- div.removeChild(cur);
752
- div.removeChild(next);
753
- for (let k = i + 1; k < j - 1; k++) {
754
- div.removeChild(nodes[k + 1]);
755
- }
756
- // 重新获取 nodes
757
- nodes = Array.from(div.childNodes);
758
- i = -1; // 重新遍历
759
- }
760
- i++;
761
- }
762
- return div.innerHTML;
763
- }